интеллектуальный анализ данных pandas от Евростата

Я начинаю работу по анализу данных из статистических институтов, таких как Евростат, с использованием python и т. Д. Pandas. Я выяснил, что есть два способа получить данные от Евростата.

  • pandas_datareader: кажется, очень легко использовать, но я обнаружил некоторые проблемы с получением некоторых конкретных данных
  • pandasdmx: я нашел это немного сложным, но это кажется многообещающим решением, но документация оставляет желать лучшего.

Я использую бесплатный блокнот Azure, онлайн-службу, но не думаю, что это еще больше усложнит мою ситуацию .

Позвольте мне объяснить проблемы для pandas_datareader. Согласно документации pandas, в разделе API существует этот короткий документированный пакет, и он работает. Помимо показанного примера, который прекрасно работает, возникает проблема с другими таблицами. Например, я могу получить данные о цене на жилье в Европе, таблица идентификаторов prc_hpi_a с этим простым кодом:

import pandas_datareader.data as web
import datetime
df = web.DataReader('prc_hpi_a', 'eurostat')

Но в таблице есть три типа данных о жилищах: ИТОГО, СУЩЕСТВУЮЩИЕ и НОВЫЕ. У меня есть только Существующие дома, и я не знаю, как получить другие. У вас есть решение для таких видов фильтрации.

Во-вторых, есть путь с использованием pandasdmx. Здесь все сложнее. Моя идея состоит в том, чтобы загрузить все данные в DataFrame pandas, а затем я могу анализировать, как захочу. Легко сказать, но я не нашел много руководств, объясняющих этот отрывок: загрузка данных в структуры pandas. Например, я нашел это руководство, но я остановился на первом шаге, а именно на создании экземпляра клиента:

import pandasdmx
from pandasdmx import client
#estat=client('Eurostat', 'milk.db')

и он возвращает:

-------------------------------------------------- ------------------------- ImportError Traceback (последний вызов последний) в () 1 import pandasdmx ----> 2 from pandasdmx import client 3 estat = client ('Евростат', 'milk.db')

ImportError: невозможно импортировать имя «клиент»

В чем проблема? Я осмотрелся, но ответа на эту проблему нет

Я также следил за этим руководством:

from pandasdmx import Request
estat = Request('ESTAT')
metadata = estat.datastructure('DSD_une_rt_a').write()
metadata.codelist.iloc[8:18]
resp = estat.data('une_rt_a', key={'GEO': 'EL+ES+IE'}, params={'startPeriod': '2007'})
data = resp.write(s for s in resp.data.series if s.key.AGE == 'TOTAL')
data.columns.names
data.columns.levels
data.loc[:, ('PC_ACT', 'TOTAL', 'T')]

Я получил данные, но моя цель - загрузить их в структуру pandas (Series, DataFrame и т. Д.), Чтобы я мог легко справиться с моей работой. Как это сделать? Собственно я сделал с этой рабочей строкой (ниже предыдущих):

s=pd.DataFrame(data)

Но это не сработает, если я попытаюсь получить другие таблицы данных. Позвольте мне пояснить еще один пример о текущей цене гармонизированного индекса таблица:

estat = Request('ESTAT')
metadata = estat.datastructure('DSD_prc_hicp_midx').write()
resp = estat.data('prc_hicp_midx')
data = resp.write(s for s in resp.data.series if s.key.COICOP == 'CP00')

Здесь он возвращает ошибку, а именно:

-------------------------------------------------- ------------------------- Отслеживание ошибки AttributeError (последний вызов последний) в () 2 metadata = estat.datastructure ('DSD_prc_hicp_midx'). Write ( ) 3 resp = estat.data ('prc_hicp_midx') ----> 4 data = resp.write (s для s в resp.data.series, если s.key.COICOP == 'CP00') 5 # metadata.codelist 6 # data.loc [:, ('ИТОГО', 'INX_Q', 'EA', 'Q')]

~ / anaconda3_501 / lib / python3.6 / site-packages / pandasdmx / api.py в getattr (self, name) 622 Сделать атрибуты сообщения доступными для чтения непосредственно из экземпляра ответа 623 '' '-> 624 return getattr (self.msg, name) 625 626 def _init_writer (self, writer):

AttributeError: объект DataMessage не имеет атрибута data

Почему он не получает данные сейчас? Что случилось сейчас?

Я потерял почти день, ища ясные примеры и объяснения. У вас есть что предложить? Есть полная и понятная документация? Я также нашел эту страницу с другими примерами, объясняющими использование категориальных схем, но это не для Евростата (как объяснялось в какой-то момент)

Оба метода могут работать, за исключением некоторых объясненных проблем, но мне также нужно предложение, чтобы иметь определенный метод для использования, чтобы запросить Евростат, а также многие другие учреждения, такие как ОЭСР, Всемирный банк и т. Д. а рабочее решение, даже если оно для каждого заведения разное?


person SPS    schedule 17.05.2018    source источник


Ответы (2)


Это мой окончательный ответ на мой вопрос, который работает для каждого типа данных, собранных Евростатом. Я публикую здесь, потому что это может быть полезно для многих.

Приведу несколько примеров. Они производят три серии панд (EU_unempl, EU_GDP, EU_intRates) с данными и правильными временными индексами.

#----Unemployment Rate---------
dataEU_unempl=pd.read_json('http://ec.europa.eu/eurostat/wdds/rest/data/v2.1/json/en/ei_lmhr_m?geo=EA&indic=LM-UN-T-TOT&s_adj=NSA&unit=PC_ACT',typ='series',orient='table',numpy=True) #,typ='DataFrame',orient='table'
x=[]
for i in range(int(sorted(dataEU_unempl['value'].keys())[0]),1+int(sorted(dataEU_unempl['value'].keys(),reverse=True)[0])):
    x=numpy.append(x,dataEU_unempl['value'][str(i)])
EU_unempl=pd.Series(x,index=pd.date_range((pd.to_datetime((sorted(dataEU_unempl['dimension']['time']['category']['index'].keys())[(sorted(int(v) for v in dataEU_unempl['value'].keys())[0])]),format='%YM%M')), periods=len(x), freq='M')) #'1/1993'


#----GDP---------
dataEU_GDP=pd.read_json('http://ec.europa.eu/eurostat/wdds/rest/data/v2.1/json/en/namq_10_gdp?geo=EA&na_item=B1GQ&s_adj=NSA&unit=CP_MEUR',typ='series',orient='table',numpy=True) #,typ='DataFrame',orient='table'
x=[]
for i in range((sorted(int(v) for v in dataEU_GDP['value'].keys())[0]),1+(sorted((int(v) for v in dataEU_GDP['value'].keys()),reverse=True))[0]):
    x=numpy.append(x,dataEU_GDP['value'][str(i)])
EU_GDP=pd.Series(x,index=pd.date_range((pd.Timestamp(sorted(dataEU_GDP['dimension']['time']['category']['index'].keys())[(sorted(int(v) for v in dataEU_GDP['value'].keys())[0])])), periods=len(x), freq='Q'))


#----Money market interest rates---------
dataEU_intRates=pd.read_json('http://ec.europa.eu/eurostat/wdds/rest/data/v2.1/json/en/irt_st_m?geo=EA&intrt=MAT_ON',typ='series',orient='table',numpy=True) #,typ='DataFrame',orient='table'
x=[]
for i in range((sorted(int(v) for v in dataEU_intRates['value'].keys())[0]),1+(sorted((int(v) for v in dataEU_intRates['value'].keys()),reverse=True))[0]):
    x=numpy.append(x,dataEU_intRates['value'][str(i)])
EU_intRates=pd.Series(x,index=pd.date_range((pd.to_datetime((sorted(dataEU_intRates['dimension']['time']['category']['index'].keys())[(sorted(int(v) for v in dataEU_intRates['value'].keys())[0])]),format='%YM%M')), periods=len(x), freq='M'))
person SPS    schedule 25.05.2018

Общее решение состоит в том, чтобы не полагаться на слишком специфические API, такие как datareader, а вместо этого обращаться к источнику. Вы можете использовать исходный код datareader как вдохновение и как руководство, как это сделать. Но в конечном итоге, когда вам нужно получить данные из источника, вы можете напрямую получить доступ к этому источнику и загрузить данные.

Одним из очень популярных инструментов для HTTP API является requests. Вы можете легко использовать его для загрузки данных JSON с любого веб-сайта или службы HTTP (S). Когда у вас есть JSON, вы можете загрузить его в Pandas. Поскольку это решение основано на строительных блоках общего назначения, оно применимо практически к любому источнику данных в Интернете (в отличие, например, от pandaSDMX, который применим только к источникам данных SDMX).

person John Zwinck    schedule 18.05.2018
comment
Не могли бы вы привести несколько простых примеров для решения некоторых проблем, с которыми я столкнулся при использовании этого пакета? Я хочу уточнить предложенные мной таблицы. Спасибо - person SPS; 18.05.2018
comment
@SPS: Лучше вам попробовать и посмотреть, как далеко вы сможете продвинуться. - person John Zwinck; 18.05.2018
comment
Я борюсь с этим import requests import io import pandas as pd r=requests.get('http://ec.europa.eu/eurostat/wdds/rest/data/v2.1/json/en/prc_hicp_midx?geo=EA&coicop=AP&unit=I96&time=2018M04&time=2018M03').content rawData = pd.read_csv(io.StringIO(r.decode('utf-8'))) rawData.describe() Согласно this, я бы получил данные о ценах на AP в странах евро в 2018M04 и M03. Он сообщает: {error: {status: 400 label: Dataset contains no data. элементы фильтрации, вероятно, недействительны.}} - person SPS; 18.05.2018
comment
Эта ошибка исходит из источника данных (URL-адрес, который вы пытались получить). Это не имеет ничего общего с Python, просто вы неправильно используете HTTP API. Вы можете протестировать его с помощью своего веб-браузера, щелкнув: ec.europa.eu/eurostat/wdds/rest/data/v2.1/json/en/, затем попробуйте исправить это, а затем используйте этот URL в Python. - person John Zwinck; 21.05.2018
comment
Это понятно, но как решить эту проблему однозначно? Я имею в виду, как правильно получить данные Harmonized Index Current Price от Евростата? - person SPS; 21.05.2018
comment
Прочтите их документацию по их API и попытайтесь разобраться. - person John Zwinck; 21.05.2018
comment
Это должно быть правильный адрес, но с командами r=requests.get('http://ec.europa.eu/eurostat/wdds/rest/data/v2.1/json/en/prc_hicp_midx?geo=EA&coicop=CP00&unit=I96').content rawData = pd.read_csv(io.StringIO(r.decode('utf-8'))) rawData.describe() он возвращает просто список нулей. Теперь я думаю, что это вопрос о том, как получить данные из инструмента пакета запросов. - person SPS; 23.05.2018
comment
API возвращает JSON. Почему вы пытаетесь читать это, используя read_csv()? Попробуйте read_json()! - person John Zwinck; 24.05.2018
comment
Уже думал и пробовал следовать this, но еще не решил - person SPS; 24.05.2018
comment
с помощью команды: data=pd.read_json(url,typ='series',orient='table') data.keys() выводит список всех доступных ключей. Все они являются объектами JSON. Проблема в том, что если вы дадите эту команду data['value'], она отобразит серию, но значение будет странным: {'327': 71,03, '328': 71,64, '329': 71,72, '330': 71,7, .... } а не {0: 98.9,1: 99.4,2: 99.7 ...} Почему? Есть проблема кодификации? Как решить? Помните правильный адрес - person SPS; 25.05.2018
comment
"0":98.9 находится в data['value'], просто он не первый, потому что словари неупорядочены. - person John Zwinck; 25.05.2018