如何正确实现web.DataReader?Yahoo数据源读取遇AttributeError
pandas_datareader调用Yahoo数据源报错的解决
问题描述
执行官方示例代码获取Yahoo金融数据时触发AttributeError: 'NoneType' object has no attribute 'group'错误,示例代码如下:
import pandas_datareader.data as web import pandas as pd import datetime as dt df = web.DataReader('GE', 'yahoo', start='2019-09-10', end='2020-10-09')
完整错误栈:
AttributeError Traceback (most recent call last) Cell In[4], line 1 ----> 1 df = web.DataReader('GE', 'yahoo', start='2019-09-10', end='2020-10-09') File ~\anaconda3\Lib\site-packages\pandas\util\_decorators.py:213, in deprecate_kwarg.<locals>._deprecate_kwarg.<locals>.wrapper(*args, **kwargs) 211 raise TypeError(msg) 212 kwargs[new_arg_name] = new_arg_value --> 213 return func(*args, **kwargs) File ~\anaconda3\Lib\site-packages\pandas_datareader\data.py:379, in DataReader(name, data_source, start, end, retry_count, pause, session, api_key) 367 raise NotImplementedError(msg) 369 if data_source == "yahoo": 370 return YahooDailyReader( 371 symbols=name, 372 start=start, 373 end=end, 374 adjust_price=False, 375 chunksize=25, 376 retry_count=retry_count, 377 pause=pause, 378 session=session, --> 379 ).read() 381 elif data_source == "iex": 382 return IEXDailyReader( 383 symbols=name, 384 start=start, (...) 390 session=session, 391 ).read() File ~\anaconda3\Lib\site-packages\pandas_datareader\base.py:253, in _DailyBaseReader.read(self) 251 # If a single symbol, (e.g., 'GOOG') 252 if isinstance(self.symbols, (string_types, int)): --> 253 df = self._read_one_data(self.url, params=self._get_params(self.symbols)) 254 # Or multiple symbols, (e.g., ['GOOG', 'AAPL', 'MSFT']) 255 elif isinstance(self.symbols, DataFrame): File ~\anaconda3\Lib\site-packages\pandas_datareader\yahoo\daily.py:152, in YahooDailyReader._read_one_data(self, url, params) 150 ptrn = r"root\.App\.main = (.*?);\n}\(this\)\);" 151 try: --> 152 j = json.loads(re.search(ptrn, resp.text, re.DOTALL).group(1)) 153 data = j["context"]["dispatcher"]["stores"]["HistoricalPriceStore"] 154 except KeyError: AttributeError: 'NoneType' object has no attribute 'group'
问题原因
Yahoo Finance的页面结构和数据返回格式已更新,pandas_datareader官方维护的Yahoo数据读取模块未跟进适配,导致正则表达式无法匹配到目标数据结构,返回None后调用group()方法触发错误。
解决方法
推荐方案:使用yfinance库替代
yfinance是专门用于获取Yahoo金融数据的第三方库,兼容原pandas_datareader的使用习惯,且持续维护适配Yahoo的更新:
- 安装依赖
pip install yfinance
- 替换后的代码示例
import yfinance as yf import pandas as pd import datetime as dt start = dt.datetime(2019, 9, 10) end = dt.datetime(2020, 10, 9) # 下载数据,返回格式与原web.DataReader一致 df = yf.download('GE', start=start, end=end)
备选方案(不推荐):使用第三方修复版pandas_datareader
部分社区开发者对pandas_datareader的Yahoo模块进行了修复,可以安装分支版本,但由于官方已放弃维护Yahoo数据源,后续仍可能出现兼容问题:
pip install git+https://github.com/ranaroussi/fix-yahoo-finance.git
安装后可继续使用原web.DataReader代码,但稳定性无法保证。
内容的提问来源于stack exchange,提问作者Alan Porter
相关产品推荐
相关产品推荐

