第二章:数据获取——用pandas-datareader拉取EIA原油价格
好,咱们正式开始动手了。
做通胀因子预测,第一步就是拿数据。能源价格里,原油价格是绕不开的锚。我个人习惯用 pandas-datareader 来拉EIA(美国能源信息署)的数据,原因很简单:接口稳定、文档清晰、不用自己写爬虫。
2.1 准备工作:安装与导入
先确认你的环境里装好了必要的库。我建议用 pip 一次性装齐:
pip install pandas pandas-datareader matplotlib
然后导入。嗯,这里有个小细节——pandas-datareader 的导入名是 pandas_datareader,中间是下划线,别写错了。我刚开始用的时候就被这个坑过。
import pandas as pd
import pandas_datareader.data as web
import datetime
2.2 获取EIA原油价格数据
EIA 提供了很多能源相关的序列,原油现货价格是 DCOILWTICO(西德克萨斯中质原油,日度数据)。
你想想看,这个代码其实就三行核心逻辑:
# 设定起止日期
start = datetime.datetime(2010, 1, 1)
end = datetime.datetime(2024, 12, 31)
# 从EIA拉数据
oil = web.DataReader('DCOILWTICO', 'eia', start, end, api_key='你的API_KEY')
# 看一眼
print(oil.head())
⚠️ 注意:EIA 现在要求 API Key。去 EIA Open Data 注册 免费申请一个,几分钟就能拿到。我曾经因为偷懒用旧版接口,结果项目演示时数据拉不下来,场面一度很尴尬。
2.3 数据长什么样?
拉下来之后,你会得到一个 DataFrame,索引是日期,列是价格。大概长这样:
| 日期 | DCOILWTICO |
|---|---|
| 2010-01-04 | 81.51 |
| 2010-01-05 | 81.77 |
| 2010-01-06 | 83.18 |
| ... | ... |
注意,EIA 的数据是工作日频率,周末和节假日没有值。这个特性后面做时间对齐时要小心。
2.4 数据清洗:处理缺失值
原始数据里偶尔会有缺失。我一般先检查一下:
print(oil.isnull().sum())
如果缺失不多,用前向填充法:
oil.fillna(method='ffill', inplace=True)
为什么用前向填充?因为原油价格在非交易日基本不变,用上一个交易日的价格是合理的。说白了,这是行业惯例。
💡 小技巧:如果你想要月度数据,可以用
resample('M').mean() 降采样。我个人习惯先保留日度数据,等后面跟工资数据合并时再统一对齐频率。
2.5 可视化:看一眼趋势
数据拿到手,先画个图心里有数。这是我最喜欢的一步:
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 6))
plt.plot(oil.index, oil['DCOILWTICO'], color='#2c3e50', linewidth=1.5)
plt.title('WTI原油现货价格(2010-2024)', fontsize=14)
plt.xlabel('日期')
plt.ylabel('美元/桶')
plt.grid(True, alpha=0.3)
plt.show()
你会看到2014年、2020年、2022年都有剧烈的波动。这些波动跟通胀的走势高度相关——这也是我们做这个课题的原因。
2.6 本章知识体系
下面这张图帮你理清本章的核心逻辑:
核心要点回顾:
- 使用
pandas-datareader的web.DataReader()方法,指定数据源为'eia' - EIA 代码
DCOILWTICO代表 WTI 原油现货价格 - 必须注册并传入 API Key
- 数据是日度频率,注意处理缺失值
- 先可视化,再往下走——这是我一直坚持的原则
数据拿到手了,下一步就是跟工资数据做联动分析。不过那是后面章节的事,咱们先把这一步走扎实。
📌 避坑指南:我曾经在项目里直接用
dropna() 删掉缺失行,结果导致时间序列不连续,后面做滞后分析时全乱了。记住:金融时间序列的缺失值,能填充就别删除。
公众号:蓝海数据掘金营,微信deep3321