关于 api-data-fetcher
面向经济学家的数据获取技能,可生成从 FRED、World Bank、IMF、BLS 和 OECD 等经济数据 API 获取数据的 Python 代码,并附文档。内容涵盖密钥管理、错误处理和数据整理。
主要功能
- 01经济数据 API 选择建议
- 02生成 Python 代码
- 03使用环境变量管理 API 密钥
- 04错误处理与数据格式整理
- 05序列说明与修订检查
适用场景
- 01下载宏观经济指标
- 02合并多源数据集
- 03自动更新定期数据
- 04获取跨国面板数据
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ meleantonio/ awesome-econ-ai-stuff --skill api-data-fetcher安装后在 Claude Code 中输入/api-data-fetcher确认已加载。
附带文件index.md
详细介绍
API 数据获取器
用途
此技能可帮助经济学家从主要经济数据 API 获取数据,包括 FRED(美联储经济数据库)、World Bank、IMF、BLS 和 OECD。它会生成整洁、带有文档说明且包含适当错误处理的 Python 代码。
适用场景
- 下载宏观经济指标
- 从多个来源构建自定义数据集
- 为持续进行的项目自动更新数据
- 获取跨国家面板数据
说明
第 1 步:明确数据需求
询问用户:
- 需要哪些数据?(GDP、失业率、通货膨胀等)
- 时间范围和频率是什么?
- 需要哪些国家/地区的数据?
- 首选输出格式是什么?(CSV、DataFrame 等)
第 2 步:选择合适的 API
| 数据类型 | 最佳来源 | 软件包 |
|---|---|---|
| 美国宏观经济数据 | FRED | fredapi |
| 全球发展数据 | World Bank | wbdata |
| 劳动力统计数据 | BLS | bls |
| 跨国家数据 | OECD | pandasdmx |
| 金融数据 | Yahoo Finance | yfinance |
第 3 步:生成整洁的代码
包含:
- API 密钥处理(环境变量)
- API 调用失败时的错误处理
- 数据清理和格式化
- 序列定义的文档说明
示例输出
"""
Economic Data Fetcher
=====================
Downloads macroeconomic data from FRED and World Bank APIs.
Requires: fredapi, wbdata, pandas
Setup: Set FRED_API_KEY environment variable
Get a free key from: https://fred.stlouisfed.org/docs/api/api_key.html
"""
import os
import pandas as pd
from datetime import datetime, timedelta
from typing import List, Optional, Dict
# ============================================
# FRED Data Fetcher
# ============================================
def fetch_fred_series(
series_ids: List[str],
start_date: str = "2000-01-01",
end_date: Optional[str] = None,
api_key: Optional[str] = None
) -> pd.DataFrame:
"""
Fetch time series data from FRED.
Parameters
----------
series_ids : list of str
FRED series IDs (e.g., ['GDP', 'UNRATE', 'CPIAUCSL'])
start_date : str
Start date in YYYY-MM-DD format
end_date : str, optional
End date (defaults to today)
api_key : str, optional
FRED API key (defaults to FRED_API_KEY env var)
Returns
-------
pd.DataFrame
DataFrame with date index and series as columns
Example
-------
>>> df = fetch_fred_series(['GDP', 'UNRATE'], '2010-01-01')
"""
try:
from fredapi import Fred
except ImportError:
raise ImportError("Install fredapi: pip install fredapi")
# Get API key
api_key = api_key or os.environ.get('FRED_API_KEY')
if not api_key:
raise ValueError(
"FRED API key required. Set FRED_API_KEY environment variable "
"or pass api_key parameter. Get a key at: "
"https://fred.stlouisfed.org/docs/api/api_key.html"
)
fred = Fred(api_key=api_key)
end_date = end_date or datetime.now().strftime('%Y-%m-%d')
# Fetch each series
data = {}
for series_id in series_ids:
try:
series = fred.get_series(
series_id,
observation_start=start_date,
observation_end=end_date
)
data[series_id] = series
print(f"✓ Downloaded {series_id}")
except Exception as e:
print(f"✗ Failed to download {series_id}: {e}")
# Combine into DataFrame
df = pd.DataFrame(data)
df.index.name = 'date'
return df
# Common FRED series for economists
FRED_SERIES = {
# GDP and Output
'GDP': 'Gross Domestic Product',
'GDPC1': 'Real GDP',
'GDPPOT': 'Real Potential GDP',
# Labor Market
'UNRATE': 'Unemployment Rate',
'PAYEMS': 'Total Nonfarm Payrolls',
'CIVPART': 'Labor Force Participation Rate',
# Prices
'CPIAUCSL': 'Consumer Price Index',
'PCEPI': 'PCE Price Index',
'CPILFESL': 'Core CPI',
# Interest Rates
'FEDFUNDS': 'Federal Funds Rate',
'DGS10': '10-Year Treasury Rate',
'T10Y2Y': '10Y-2Y Treasury Spread',
# Money and Credit
'M2SL': 'M2 Money Stock',
'TOTRESNS': 'Total Reserves',
}
# ============================================
# World Bank Data Fetcher
# ============================================
def fetch_world_bank_data(
indicators: Dict[str, str],
countries: List[str] = ['USA', 'GBR', 'DEU', 'FRA', 'JPN'],
start_year: int = 2000,
end_year: Optional[int] = None
) -> pd.DataFrame:
"""
Fetch indicator data from World Bank.
Parameters
----------
indicators : dict
Dict mapping indicator codes to names
e.g., {'NY.GDP.PCAP.CD': 'gdp_per_capita'}
countries : list of str
ISO 3-letter country codes
start_year : int
Start year
end_year : int, optional
End year (defaults to current year)
Returns
-------
pd.DataFrame
Panel data with country and year
Example
-------
>>> indicators = {
... 'NY.GDP.PCAP.CD': 'gdp_per_capita',
... 'SP.POP.TOTL': 'population'
... }
>>> df = fetch_world_bank_data(indicators, ['USA', 'GBR'])
"""
try:
import wbdata
except ImportError:
raise ImportError("Install wbdata: pip install wbdata")
end_year = end_year or datetime.now().year
all_data = []
for indicator_code, indicator_name in indicators.items():
try:
# Fetch data
data = wbdata.get_dataframe(
{indicator_code: indicator_name},
country=countries,
)
data = data.reset_index()
all_data.append(data)
print(f"✓ Downloaded {indicator_name}")
except Exception as e:
print(f"✗ Failed to download {indicator_name}: {e}")
# Merge all indicators
if all_data:
df = all_data[0]
for other_df in all_data[1:]:
df = df.merge(other_df, on=['country', 'date'], how='outer')
# Filter years
df['year'] = pd.to_datetime(df['date']).dt.year
df = df[(df['year'] >= start_year) & (df['year'] <= end_year)]
return df
return pd.DataFrame()
# Common World Bank indicators
WORLD_BANK_INDICATORS = {
# Income and Growth
'NY.GDP.PCAP.CD': 'GDP per capita (current US$)',
'NY.GDP.PCAP.KD.ZG': 'GDP per capita growth (%)',
'NY.GDP.MKTP.KD.ZG': 'GDP growth (%)',
# Population
'SP.POP.TOTL': 'Population, total',
'SP.URB.TOTL.IN.ZS': 'Urban population (%)',
# Trade
'NE.TRD.GNFS.ZS': 'Trade (% of GDP)',
'BX.KLT.DINV.WD.GD.ZS': 'FDI, net inflows (% of GDP)',
# Human Capital
'SE.XPD.TOTL.GD.ZS': 'Education expenditure (% of GDP)',
'SH.XPD.CHEX.GD.ZS': 'Health expenditure (% of GDP)',
# Inequality
'SI.POV.GINI': 'Gini index',
'SI.POV.DDAY': 'Poverty headcount ratio ($1.90/day)',
}
# ============================================
# Usage Example
# ============================================
if __name__ == "__main__":
# Example 1: Fetch US macro data from FRED
us_macro = fetch_fred_series(
series_ids=['GDP', 'UNRATE', 'CPIAUCSL', 'FEDFUNDS'],
start_date='2010-01-01'
)
print("\nUS Macro Data (FRED):")
print(us_macro.tail())
# Save to CSV
us_macro.to_csv('data/us_macro_fred.csv')
print("\nSaved to data/us_macro_fred.csv")
# Example 2: Fetch cross-country data from World Bank
indicators = {
'NY.GDP.PCAP.CD': 'gdp_per_capita',
'SP.POP.TOTL': 'population',
'NY.GDP.MKTP.KD.ZG': 'gdp_growth'
}
cross_country = fetch_world_bank_data(
indicators=indicators,
countries=['USA', 'GBR', 'DEU', 'FRA', 'JPN', 'CHN', 'IND', 'BRA'],
start_year=2000
)
print("\nCross-Country Data (World Bank):")
print(cross_country.head(10))
# Save to CSV
cross_country.to_csv('data/cross_country_wb.csv', index=False)
print("\nSaved to data/cross_country_wb.csv")
要求
Python 软件包
pip install fredapi wbdata pandas
API 密钥
- FRED:从 https://fred.stlouisfed.org/docs/api/api_key.html 免费获取密钥
- World Bank:无需密钥
- BLS:从 https://www.bls.gov/developers/ 免费获取密钥
设置环境变量:
export FRED_API_KEY="your_key_here"
最佳实践
- 将 API 密钥存储在环境变量中——切勿硬编码
- 为批量下载添加速率限制
- 在本地缓存数据,避免重复调用 API
- 记录来源提供的序列定义
- 检查实时数据中的修订情况
常见问题
- ❌ 在脚本中硬编码 API 密钥
- ❌ 未处理 API 速率限制
- ❌ 忽略数据版本/修订
- ❌ 混合不同频率的数据,却未进行适当处理
参考资料
更新日志
v1.0.0
- 首次发布,支持 FRED 和 World Bank
评论
支持 Markdown