интеллектуальный анализ данных панд от Евростата - PullRequest
0 голосов
/ 17 мая 2018

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

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

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

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

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

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

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

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

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

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

ImportError: невозможно импортировать имя 'client'

В чем здесь проблема?Я посмотрел вокруг, но не нашел ответа на эту проблему

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

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')]

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

s=pd.DataFrame(data)

Но это не сработает, если я попытаюсь получить другие таблицы данных.Позвольте мне объяснить на другом примере таблицу Harmonized Index Current Price :

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 Traceback (последний вызов был последним) в () 2 metadata = estat.datastructure ('DSD_prc_hicp_midx'). Write () 3 соответственно= estat.data ('prc_hicp_midx') ----> 4 data = resp.write (s для s в resp.data.series, если s.key.COICOP == 'CP00') 5 # metadata.codelist 6 #data.loc [:, ('TOTAL', 'INX_Q', 'EA', 'Q')]

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

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

Позвольте мне привести несколько примеров. Они производят три серии панд (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'))
0 голосов
/ 18 мая 2018

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

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

...