背景

来自真实世界场景的数据集对于构建和测试机器学习模型非常重要。如果想要一些时间序列数据来简单试验算法和评估模型但本地却没有测试数据,这种情况下就需要考虑如何拿到人工生成的或者真实的时序数据?

🧐之前都是通过接口自己来解析数据或者人工生成一些时序数据来测试,缺点是比较麻烦或者数据质量不高而且徒然增加自身工作量!作为调包侠这篇文章推荐一种 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')

直接将对应的结果可视化如下



用python读数据集 python获取数据集_python

可视化

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



用python读数据集 python获取数据集_用python读数据集_02

可视化


此处仅展示冰山一角,获取更多数据源方法可以参考官方文档:https://pydata.github.io/pandas-datareader/index.html