You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:56:10