使用Pandas DataReader获取Yahoo数据时报TypeError错误求助
使用pandas DataReader从Yahoo获取金融数据时触发TypeError错误
几周前我用pandas的DataReader从Yahoo导入金融数据完全正常,但今天运行代码时却弹出了TypeError: string indices must be integers错误。
我运行的代码如下:
# 导入包 import numpy as np import pandas as pd import pandas_datareader.data as web import matplotlib.pyplot as plt %matplotlib inline # 读取数据 test = web.DataReader(['TSLA','FB'], 'yahoo', start='2018/01/01', end='2019/12/31') test.head()
报错信息如下:
输出超出大小限制,请在文本编辑器中查看完整输出数据 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_3456/2405099378.py in <module> 1 # 读取数据 ----> 2 test = web.DataReader(['TSLA','FB'], 'yahoo', start='2018/01/01', end='2019/12/31') 3 test.head() c:\Users\jclay\anaconda3\envs\blockchain_dev\lib\site-packages\pandas\util\_decorators.py in wrapper(*args, **kwargs) 205 else: 206 kwargs[new_arg_name] = new_arg_value --> 207 return func(*args, **kwargs) 208 209 return cast(F, wrapper) c:\Users\jclay\anaconda3\envs\blockchain_dev\lib\site-packages\pandas_datareader\data.py in DataReader(name, data_source, start, end, retry_count, pause, session, api_key) 376 retry_count=retry_count, 377 pause=pause, --> 378 session=session, 379 ).read() 380 c:\Users\jclay\anaconda3\envs\blockchain_dev\lib\site-packages\pandas_datareader\base.py in read(self) 256 df = self._dl_mult_symbols(self.symbols.index) 257 else: --> 258 df = self._dl_mult_symbols(self.symbols) ... --> 153 data = j["context"]["dispatcher"]["stores"]["HistoricalPriceStore"] 154 except KeyError: 155 msg = "No data fetched for symbol {} using {}" TypeError: string indices must be integers
我甚至直接复制pandas官方文档里的DataReader示例代码运行,也会报同样的错误:
In [39]: import pandas_datareader.data as web In [40]: import pandas as pd In [41]: import datetime as dt In [42]: df = web.DataReader('GE', 'yahoo', start='2019-09-10', end='2019-10-09') In [43]: df.head()
对应的报错信息:
输出超出大小限制,请在文本编辑器中查看完整输出数据 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_3456/472188857.py in <module> ----> 1 df = web.DataReader('GE', 'yahoo', start='2019-09-10', end='2019-10-09') 2 3 df.head() c:\Users\jclay\anaconda3\envs\blockchain_dev\lib\site-packages\pandas\util\_decorators.py in wrapper(*args, **kwargs) 205 else: 206 kwargs[new_arg_name] = new_arg_value --> 207 return func(*args, **kwargs) 208 209 return cast(F, wrapper) c:\Users\jclay\anaconda3\envs\blockchain_dev\lib\site-packages\pandas_datareader\data.py in DataReader(name, data_source, start, end, retry_count, pause, session, api_key) 376 retry_count=retry_count, 377 pause=pause, --> 378 session=session, 379 ).read() 380 c:\Users\jclay\anaconda3\envs\blockchain_dev\lib\site-packages\pandas_datareader\base.py in read(self) 251 # 如果是单个标的(例如'GOOG') 252 if isinstance(self.symbols, (string_types, int)): --> 253 df = self._read_one_data(self.url, params=self._get_params(self.symbols)) ... --> 153 data = j["context"]["dispatcher"]["stores"]["HistoricalPriceStore"] 154 except KeyError: 155 msg = "No data fetched for symbol {} using {}" TypeError: string indices must be integers
我猜是这个函数读取数据的方式更新了,但文档里找不到相关变更记录,有人解决过这个问题吗?
解决办法
这个问题是Yahoo的页面结构更新了,旧版pandas_datareader的Yahoo数据源解析逻辑失效,返回的不是预期的JSON格式而是字符串,所以才会触发“字符串索引必须是整数”的错误。给你两个可行方案:
改用yfinance库替代
yfinance是专门对接Yahoo金融的第三方库,维护更及时,用法和原DataReader接近:
先安装库:pip install yfinance替换代码示例:
import yfinance as yf # 读取多个标的 test = yf.download(['TSLA','FB'], start='2018-01-01', end='2019-12-31') # 读取单个标的 df = yf.download('GE', start='2019-09-10', end='2019-10-09')安装修复后的pandas_datareader分支
如果一定要用pandas_datareader,可以安装社区修复的版本:pip install git+https://github.com/pydata/pandas-datareader.git@fix/yahoo不过这个方案稳定性不如
yfinance,毕竟Yahoo的页面结构可能还会变动。
另外,官方pandas_datareader确实没同步更新文档,因为Yahoo数据源属于第三方维护,官方更新速度慢是正常情况。
内容的提问来源于stack exchange,提问作者Jordan Calyton
相关产品推荐
相关产品推荐

