Python 欧盟统计局的熊猫数据挖掘

Python 欧盟统计局的熊猫数据挖掘,python,pandas,pandas-datareader,sdmx,Python,Pandas,Pandas Datareader,Sdmx,我正在开始一项工作,使用python等工具分析来自欧盟统计局等统计机构的数据。我发现有两种方法可以从欧盟统计局获取数据 pandas_datareader:它似乎很容易使用,但我在获取一些特定数据时发现了一些问题 pandasdmx:我发现它有点复杂,但它似乎是一个有前途的解决方案,但文档很差 我使用一个免费的Azure笔记本,但我不认为这会使我的情况更加复杂 让我解释一下熊猫数据阅读器的问题。根据熊猫公司的文件,这是一个可行的方法。除了所示的示例之外,其他表也出现了一个问题。例如,我可以通

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

  • pandas_datareader:它似乎很容易使用,但我在获取一些特定数据时发现了一些问题
  • pandasdmx:我发现它有点复杂,但它似乎是一个有前途的解决方案,但文档很差
我使用一个免费的Azure笔记本,但我不认为这会使我的情况更加复杂

让我解释一下熊猫数据阅读器的问题。根据熊猫公司的文件,这是一个可行的方法。除了所示的示例之外,其他表也出现了一个问题。例如,我可以通过以下简单代码获取关于哪个ID表是prc_hpi_a的数据:

import pandas_datareader.data as web
import datetime
df = web.DataReader('prc_hpi_a', 'eurostat')
但该表有三种类型的住宅数据:总数据、现有数据和新数据。我只有现有的住房,我不知道如何才能得到其他的。对于这些类型的过滤,您有解决方案吗

其次是使用pandasdmx的路径。这里更复杂。我的想法是将所有数据上传到熊猫数据框,然后我可以根据需要进行分析。说起来容易,但我还没有找到很多教程来解释这段话:上传数据到熊猫结构。例如,我发现,但我仍停留在第一步,即实例化客户机:

import pandasdmx
from pandasdmx import client
#estat=client('Eurostat', 'milk.db')
它返回:

---------------------------------------------------------------------------ImportError回溯(最近的呼叫) 最后)在() 1导入pandasdmx ---->2从pandasdmx导入客户端 3 estat=客户('Eurostat'、'milk.db')

ImportError:无法导入名称“客户端”

这里有什么问题?我环顾四周,但没有找到这个问题的答案

我还注意到:

我得到了数据,但我的目的是将它们上传到pandas结构(系列、数据帧等),以便根据我的工作轻松处理。怎么做? 实际上,我使用了这条工作线(在前面的工作线下面):

但是,如果我尝试获取其他数据表,它将不起作用。让我用另一个关于表格的例子来解释:

它在这里返回一个错误,即:

---------------------------------------------------------------------------AttributeError回溯(最近的调用) 最后)在() 2 metadata=estat.datastructure('DSD\u prc\u hicp\u midx')。write() 3 resp=初始数据(“prc\u hicp\u midx”) ---->4数据=响应写入(如果s.key.COICOP=='CP00',则s代表响应数据系列中的s) 5#metadata.codelist 6#data.loc[:,('TOTAL','INX#u Q','EA','Q')]

~/anaconda3_501/lib/python3.6/site-packages/pandashdmx/api.py in getattr(自我,姓名) 622使消息属性可直接从响应实例读取 623 ''' -->624返回getattr(self.msg,name) 625 626定义初始写入程序(自我,写入程序):

AttributeError:“DataMessage”对象没有属性“data”

为什么现在没有数据?现在怎么了

我花了将近一天的时间四处寻找一些清晰的例子和解释。你有什么建议吗?是否有完整清晰的文件?我还发现了其他例子,解释了分类方案的使用,但它不适用于欧盟统计局(如某一点所解释的)

除了一些被解释的问题外,这两种方法都可以起作用,但我还需要一个建议,以便有一个明确的方法来使用,来询问欧盟统计局,以及许多其他机构,如经合组织、世界银行等。。。
您能给我一个明确的、有效的解决方案吗,即使每个机构的解决方案不同?

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


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

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

让我举几个例子。他们制作了三个熊猫系列(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'))

你能提供一些简单的例子来解决我在使用该软件包时遇到的一些问题吗?我想具体说明我提议的表格。Thanks@SPS:您最好尝试一下,看看能走多远。我正在努力解决这个
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\u csv(io.StringIO(r.decode('utf-8'))rawData.description()
根据,我会得到关于2018M04和M03欧元区国家AP价格的数据。它报告:{“错误”:{“状态”:“400”标签:“数据集不包含数据。筛选元素可能无效。”}}该错误来自数据源(您尝试获取的URL)。这与Python无关,只是您没有正确使用HTTP API。您可以使用web浏览器通过单击来测试它:然后尝试修复它,然后在Python中使用该URL。这很清楚,但是如何明确地解决它呢?我的意思是,如何正确地从欧盟统计局获得统一的指数当前价格数据?
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')
#----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'))