欧洲统计局的大熊猫数据挖掘

时间:2018-05-17 11:57:39

标签: python pandas pandas-datareader sdmx

我开始使用python等分析来自统计机构(如Eurostat)的数据,以及pandas。我发现有两种方法可以从欧盟统计局获取数据。

  • pandas_datareader :它似乎很容易使用但我发现了一些问题来获取一些特定的数据
  • pandasdmx :我发现它有点复杂,但它似乎是一个很有前途的解决方案,但文档很差

我使用免费的Azure笔记本online service,但我不认为这会使我的情况更加复杂。

让我解释 pandas_datareader 的问题。根据pandas文档in the section API,有this short documented package并且它有效。除了显示的示例,这很好地工作,其他表出现问题。例如,我可以使用以下简单代码获取有关European house price的数据,其中ID表为 prc_hpi_a

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

但该表有三种类型的住宅数据:TOTAL,EXISTING和NEW。我只有现有住宅,我不知道如何获得其他住房。您是否有这些类型的过滤解决方案。

其次,使用 pandasdmx 的路径。这里更复杂。我的想法是将所有数据上传到pandas DataFrame,然后我可以根据需要进行分析。很容易说,但我找不到很多解释这段经文的教程:将数据上传到pandas结构。例如,我找到this tutorial,但我坚持第一步,即实例化客户端:

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

然后它返回:

  
    

----------------------------------------------- ---------------------------- ImportError Traceback(最近一次调用     最后)in()           1导入pandasdmx     ----> 2来自pandasdmx导入客户端           3 estat =客户(' Eurostat',' milk.db')

  
     

ImportError:无法导入名称'客户端'

这里的问题是什么?我环顾四周但没有回答这个问题

我也跟着this tutorial

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)

但是如果我尝试获取其他数据表,它就无法工作。让我解释另一个关于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(最近一次调用   最后)in()         2 metadata = estat.datastructure(' DSD_prc_hicp_midx')。write()         3 resp = estat.data(' prc_hicp_midx')   ----> 4 data = resp.write(对于resp.data.series中的s,如果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 in    getattr (自我,姓名)       622使响应实例直接读取消息属性       623'''    - > 624返回getattr(self.msg,name)       625       626 def _init_writer(self,writer):

     

AttributeError:' DataMessage'对象没有属性'数据'

为什么现在不获取数据?现在怎么了?

我失去了将近一天的时间,寻找一些明确的例子和解释。你有提议吗?有完整而清晰的文件吗?我还发现this page和其他例子,解释了分类方案的使用,但不适用于欧盟统计局(正如在某些时候所解释的那样)

除了一些解释的问题外,这两种方法都可行,但我还需要建议使用一种明确的方法来查询欧盟统计局,还要查询经合组织,世界银行等许多其他机构...... 你能引导我找到一个明确而有效的解决方案,即使每个机构都有所不同吗?

2 个答案:

答案 0 :(得分:1)

一般的解决方案是不依赖于过度特定的API,例如datareader,而是转到源代码。您可以使用datareader的源代码作为灵感,也可以作为指导。但最终当您需要从源获取数据时,您可能希望直接访问该源并加载数据。

一种非常流行的HTTP API工具是requests。您可以轻松地使用它从任何网站或HTTP(S)服务加载JSON数据。获得JSON后,可以将其加载到Pandas中。由于此解决方案基于通用构建模块,因此几乎适用于Web上的任何数据源(与例如pandaSDMX相反,后者仅适用于SDMX数据源)。

答案 1 :(得分:0)

这是我对我的问题的最终答案,该问题适用于从欧盟统计局收集的每种类型的数据。我在这里发帖是因为它对很多人都很有用。

让我提出一些例子。他们制作了三个大熊猫系列(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'))