背景
来自真实世界场景的数据集对于构建和测试机器学习模型非常重要。如果想要一些时间序列数据来简单试验算法和评估模型但本地却没有测试数据,这种情况下就需要考虑如何拿到人工生成的或者真实的时序数据?
🧐之前都是通过接口自己来解析数据或者人工生成一些时序数据来测试,缺点是比较麻烦或者数据质量不高而且徒然增加自身工作量!作为调包侠这篇文章推荐一种 Python 数据获取库 —— 「pandas_datareader」。
pandas-datareader
Pandas-datareader 是基于 Python 的专门从一系列的公开在线数据库获取数据的工具库,可以实时地从网络中提取想要的数据并将其组装成一个 Pandas DataFrame。该接口在 urllib3 库基础上实现了以客户端身份访问在线数据库的各类金融财经股票数据,包括从Yahoo Finance 获取金融市场数据,从世界银行获取全球发展数据,从圣路易斯联邦储备银行获取经济数据等。
由于网页数据源的限制,pandas_datareader 只支持从有限数量的数据源读取数据,这些数据源大多与金融和经济时间序列相关,支持的输入源如下:
- AlphaVantage
- Federal Reserve Economic Data (FRED)
- Fama-French Data (Ken French’s Data Library)
- Bank of Canada
- Econdb
- Enigma
- Eurostat
- The Investors Exchange (IEX)
- Moscow Exchange (MOEX)
- NASDAQ
- Naver Finance
- Organisation for Economic Co-operation and Development (OECD)
- Quandl
- Stooq.com
- Tiingo
- Thrift Savings Plan (TSP)
- World Bank
- Yahoo Finance
以下通过简单示例说明其效果。
安装及使用
可以直接通过 pip 安装库
pip install pandas_datareader requests
例如苹果的股票行情是 AAPL,所以我们可以从雅虎财经得到苹果股票的每日历史价格如下:
import pandas_datareader as pdr
# Reading Apple shares from yahoo finance server
shares_df = pdr.DataReader('AAPL', 'yahoo', start='2021-01-01', end='2021-12-31')
# Look at the data read
print(shares_df)
对应的 dataframe 结果如下:
High Low Open Close Volume Adj Close
Date
2021-01-04 133.610001 126.760002 133.520004 129.410004 143301900.0 128.453461
2021-01-05 131.740005 128.429993 128.889999 131.009995 97664900.0 130.041611
2021-01-06 131.050003 126.379997 127.720001 126.599998 155088000.0 125.664215
2021-01-07 131.630005 127.860001 128.360001 130.919998 109578200.0 129.952271
2021-01-08 132.630005 130.229996 132.429993 132.050003 105158200.0 131.073914
... ... ... ... ... ... ...
2021-12-27 180.419998 177.070007 177.089996 180.330002 74919600.0 180.100540
2021-12-28 181.330002 178.529999 180.160004 179.289993 79144300.0 179.061859
2021-12-29 180.630005 178.139999 179.330002 179.380005 62348900.0 179.151749
2021-12-30 180.570007 178.089996 179.470001 178.199997 59773000.0 177.973251
2021-12-31 179.229996 177.259995 178.089996 177.570007 64062300.0 177.344055
[252 rows x 6 columns]
也可以同时获取多家公司股票数据:
companies = ['AAPL', 'MSFT', 'GE']
shares_multiple_df = pdr.DataReader(companies, 'yahoo', start='2021-01-01', end='2021-12-31')
直接将对应的结果可视化如下
可视化
使用 panda-datreader 从另一个数据源读取数据的语法与此类似。例如,我们可以从美联储经济数据 (FRED) 中读取经济时间序列。FRED 中的每个时间序列都由一个符号来标识。例如,所有城市消费者的消费价格指数是 CPIAUCSL,除食品和能源以外的所有项目的消费价格指数是CPILFESL,个人消费支出是PCE,你可以在FRED的网页上搜索和查找符号。
import pandas_datareader as pdr
import matplotlib.pyplot as plt
# Read data from FRED and print
fred_df = pdr.DataReader(['CPIAUCSL','CPILFESL'], 'fred', "2010-01-01", "2021-12-31")
print(fred_df)
# Show in plot the data of 2019-2021
fig = plt.figure(figsize=(15,7))
plt.plot(fred_df.loc["2019":], 'o-')
plt.xticks(rotation=90)
plt.legend(fred_df.columns)
plt.title("Consumer Price Index")
plt.show()
可视化
此处仅展示冰山一角,获取更多数据源方法可以参考官方文档:https://pydata.github.io/pandas-datareader/index.html