使用pandas_datareader调用OECD API遇KeyError: 'structure'问题求助
解决Python获取OECD数据的KeyError问题及技巧
问题重现
你运行以下代码尝试从OECD获取MEI_FIN数据库数据:
import datetime import pandas as pd import pandas_datareader.data as web start_date = datetime.datetime(2013, 12, 31) end_date = datetime.datetime(2023, 12, 31) #SPECIFIC DATABASE WITHIN OECD API database = 'MEI_FIN' df1 = web.DataReader(database, 'oecd', start_date, end_date) df1
收到错误:
File D:\conda3\Lib\site-packages\pandas_datareader\io\jsdmx.py:44, in read_jsdmx(path_or_buf) 41 else: 42 data = json.loads(jdata, object_pairs_hook=OrderedDict) ---> 44 structure = data["structure"] 45 index = _parse_dimensions(structure["dimensions"]["observation"]) 46 columns = _parse_dimensions(structure["dimensions"]["series"]) KeyError: 'structure'
一、解决当前KeyError问题
1. 改用OECD官方REST API
pandas_datareader的OECD接口存在兼容性问题,直接调用官方API更稳定,示例代码:
import requests import pandas as pd # 构造API请求URL base_url = "https://stats.oecd.org/SDMX-JSON/data" database = "MEI_FIN" # 指定具体指标(如美国短期利率IR3TIB01)和时间范围 query = f"{database}/IR3TIB01.USA/all?startTime=2013-12-31&endTime=2023-12-31" url = f"{base_url}/{query}" # 发送请求并解析数据 response = requests.get(url) data = response.json() # 提取观测数据 observations = [] series_data = data['dataSets'][0]['series'] time_values = data['structure']['dimensions']['observation'][0]['values'] for _, series_info in series_data.items(): for date_idx, value in series_info['observations'].items(): date = time_values[int(date_idx)]['id'] observations.append({'date': date, 'value': value[0]}) # 转换为DataFrame并整理格式 df = pd.DataFrame(observations) df['date'] = pd.to_datetime(df['date']) df = df.set_index('date').sort_index() print(df)
2. 升级pandas_datareader版本
旧版本对OECD的SDMX格式支持不足,执行升级命令:
pip install --upgrade pandas_datareader
升级后重试原代码,若仍报错,直接用官方API方案。
二、获取OECD数据的实用技巧
- 明确指标编码:不能仅传入数据库名称就请求全量数据,需先在OECD统计平台查询目标指标的具体编码,再构造精准查询。
- 缩小请求范围:指定具体国家、指标、时间区间,减少返回数据量,降低解析难度和出错概率。
- 遵循SDMX格式解析:OECD返回的JSON有固定层级,需按
structure(结构定义)和dataSets(数据集合)依次提取维度和观测值。 - 添加请求标识:频繁请求可能被限流,可在请求中加入User-Agent模拟浏览器访问:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36'} response = requests.get(url, headers=headers)
内容的提问来源于stack exchange,提问作者Faust Von
相关产品推荐
相关产品推荐

