Python中pandas_datareader库怎么用?

来源:程序开发作者:过客头衔:草根站长
导读:本期聚焦于过客创作的《Python中pandas_datareader库怎么用?》,敬请观看详情。想批量获取股票历史价格、美联储利率或世界银行指标,却不想逐个下载CSV再清洗?pandas_datareader把雅虎财经、圣路易斯联储、世界银行等数据源封装成统一接口,调用后直接返回Pandas DataFrame。本文从安装配置讲起,说明DataReader函数的核心参数和常用数据源写法,用股票、利率、汇率三种示例演示真实请求。同时会讨论超时、远程数据源变动、pandas版本兼容等常见坑位,并给出保存为CSV和接入移动平均计算的完整代码。数据获取是量化分析和经济研究的第一步,掌握这个库能减少大量重复劳动。文中示例均可在pandas 1.5以上环境直接运行,但建议使用最新稳定版。读完可以快速在自己的分析脚本中稳定取数。

pandas_datareader 是 pandas 项目生态中专门负责从公开网络数据源读取金融与经济数据的库。它把原本分散在不同 API 之间的请求逻辑封装起来,调用 DataReader 函数即可获得一个标准的 DataFrame。本文会从安装开始,逐步演示如何获取股票价格、宏观经济指标和汇率数据。

Python中pandas_datareader库怎么用?

安装与基础环境配置

安装前建议使用独立的虚拟环境,避免与现有 pandas 版本冲突。pandas_datareader 依赖 pandas、requests、lxml 等包,安装命令如下:

pip install pandas-datareader

如果已经安装了 Anaconda,也可以使用 conda 安装:

conda install -c anaconda pandas-datareader

安装完成后,在代码中通常以 pdr 作为别名导入,并检查版本。需要注意,从 0.10.0 版本开始,部分数据源接口发生变化,旧的 Yahoo Finance 接口被迁移到 yfinance 库中,pandas_datareader 仍然保留对 Yahoo 的兼容调用,但推荐数据源本身更稳定的 Stooq 或 FRED。如果遇到 ImportError,先确认 pandas 版本不低于 1.0。

对于国内网络环境,访问雅虎财经或圣路易斯联储可能会出现超时。可以在 requests 层配置代理,或者改用 stooq 这类无需特殊网络权限的数据源。下面是一个检查版本的示例:

import pandas_datareader as pdr
print(pdr.__version__)

DataReader 函数与常用数据源

DataReader 的核心签名是 pdr.DataReader(name, data_source, start, end)。name 通常是股票代码或指标代码,data_source 是数据源标识字符串,start 和 end 用于限定时间范围。如果省略 end,默认取到最新日期;如果省略 start,则从数据源最早可用日期开始。返回对象是一个 pandas DataFrame,索引为日期,列名由数据源决定。

以 Stooq 数据源为例,获取苹果公司股票代码 AAPL 的日线数据:

import pandas_datareader as pdr
import datetime as dt

start = dt.datetime(2020, 1, 1)
end = dt.datetime(2023, 12, 31)

df = pdr.DataReader("AAPL", "stooq", start, end)
print(df.head())

Stooq 返回的列通常为 Open、High、Low、Close、Volume,并且日期索引默认是降序排列,需要调用 df.sort_index() 再进行分析。另一个常用数据源是 FRED,它由圣路易斯联邦储备银行维护,包含数十万个宏观经济时间序列。获取美国 10 年期国债收益率可以写:

df_rate = pdr.DataReader("DGS10", "fred", start, end)
print(df_rate.tail())

FRED 的指标代码需要到其官网查询,常见的有 GDP、CPIAUCSL、UNRATE 等。世界银行数据源使用 "worldbank" 标识,name 参数传入指标编号,例如 "NY.GDP.MKTP.CD" 表示按现价美元计算的 GDP。不同数据源对 name 的格式要求不一致,这是使用时最容易出错的地方。

实战:股票均线、通胀与汇率

只取到数据还不够,通常需要结合 pandas 做进一步加工。下面用一个完整示例演示三件事:获取苹果股票、计算 20 日移动平均线、获取美国 CPI 同比并合并展示。由于不同数据源频率可能不同,合并前要统一时间索引。

import pandas as pd
import pandas_datareader as pdr
import datetime as dt

start = dt.datetime(2019, 1, 1)
end = dt.datetime(2023, 12, 31)

# 股票日线
stock = pdr.DataReader("AAPL", "stooq", start, end).sort_index()
stock["MA20"] = stock["Close"].rolling(window=20).mean()

# 美国 CPI 同比,FRED 代码 CPIAUCSL 是水平值,需计算年增长率
cpi = pdr.DataReader("CPIAUCSL", "fred", start, end)
cpi["CPI_YoY"] = cpi["CPIAUCSL"].pct_change(12) * 100

# 合并,股票在前,CPI 填充
combined = stock.join(cpi["CPI_YoY"], how="left").ffill()
print(combined[["Close", "MA20", "CPI_YoY"]].dropna().tail())

上面代码里 pct_change(12) 表示以 12 个月前的数值为基准计算百分比变化,适合把月度 CPI 水平值转换成同比增速。移动平均线的窗口长度为 20 个交易日,与月频 CPI 合并后会产生缺失值,所以先用 ffill() 做前向填充。实际分析时要注意前向填充可能引入数据延迟,不适合用于预测模型的特征工程。

汇率数据同样常用。欧洲央行提供的外汇参考汇率可以通过数据源 "ecb" 获取,name 使用货币对代码,例如 "EURUSD" 表示欧元兑美元。示例:

fx = pdr.DataReader("EURUSD", "ecb", start, end)
print(fx.tail())

这类宏观数据频率通常为日频,周末和节假日没有报价,处理时建议使用重采样或直接按日期合并。如果只需要月末数据,可以用 fx.resample("ME").last() 将日频转换为月频。需要注意 pandas 2.2 之后 "M" 被 "ME" 替代,旧代码可能出现 FutureWarning。

常见错误与稳定性建议

使用 pandas_datareader 最常见的错误是 RemoteDataError,它表示请求失败或数据源返回空结果。原因可能是股票代码不存在、数据源临时不可用、网络受限,或者该数据源已经停止维护。捕获异常并给出友好提示,比直接让脚本崩溃更合适。

try:
    df = pdr.DataReader("INVALID_CODE", "stooq", start, end)
except Exception as e:
    print("获取数据失败:", e)

另一个高频问题是 Yahoo Finance 数据源在 2021 年后经常无法直接使用,因为雅虎增加了反爬机制。虽然 pandas_datareader 仍保留 "yahoo" 数据源,但官方建议改用 yfinance 库获取雅虎数据。如果坚持使用,需要升级到最新版并设置会话头,但稳定性不如 stooq。对于需要大量股票数据的场景,优先考虑本地数据库或专业行情 API。

为了后续分析稳定,建议把获取到的数据保存为 CSV 或 Parquet 文件。Parquet 能保留 dtypes 且占用空间更小,适合时间序列。示例:

stock.to_csv("aapl_stock.csv")
stock.to_parquet("aapl_stock.parquet")

读取时用 pd.read_csv("aapl_stock.csv", index_col=0, parse_dates=True) 或 pd.read_parquet("aapl_stock.parquet") 即可恢复 DataFrame。对于定时任务,建议把请求频率控制在一分钟以上,避免对公共数据源造成压力,也降低被封禁的风险。如果一次需要下载多个指标,可以循环调用 DataReader,并在循环体中加入 time.sleep(1)。

pandas_datareaderPython金融数据数据获取修改时间:2026-09-23 10:47:50

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/0923/60867.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。