3

我正在开始一项使用 python 和 pandas 分析来自 Eurostat 等统计机构的数据的工作。我发现有两种方法可以从 Eurostat 获取数据。

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

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

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

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

它返回:

-------------------------------------------------- ------------------------- ImportError Traceback (last last call last) in () 1 import pandasdmx ----> 2 from pandasdmx import client 3 estat=client('Eurostat', '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')]

我得到了数据,但我的目的是将它们上传到熊猫结构(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 Traceback (最近一次调用最后一次) in () 2 metadata = estat.datastructure('DSD_prc_hicp_midx').write( ) 3 resp = estat.data('prc_hicp_midx') ----> 4 data = resp.write(s for s in resp.data.series if 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 (self, name) 622 使消息属性直接从响应实例 623 ''' 中读取 -> 624 return getattr(self.msg,名称)625 626 def _init_writer(自我,作家):

AttributeError:“DataMessage”对象没有属性“数据”

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

我花了将近一天的时间四处寻找一些明确的例子和解释。你有什么要提议的吗?是否有完整而清晰的文档?我还发现这个页面还有其他示例,解释了分类方案的使用,但它不适用于欧盟统计局(正如在某些时候解释的那样)

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

4

2 回答 2

3

这是我对我的问题的明确回答,适用于从 Eurostat 收集的每种类型的数据。我在这里发帖是因为它对许多人有用。

让我提出一些例子。他们生成了三个带有数据和正确时间索引的熊猫系列(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'))
于 2018-05-25T19:34:35.800 回答
1

一般的解决方案是不要依赖过于具体的 API datareader,而是去源头。您可以使用datareader的源代码作为灵感和如何做的指南。但最终,当您需要从某个源获取数据时,您可能希望直接访问该源并加载数据。

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

于 2018-05-18T11:32:08.590 回答