使用pandas_datareader调用Yahoo Finance数据时出现TypeError错误的原因
问题:pandas_datareader调用Yahoo Finance时出现TypeError错误
我正在学习Udemy平台的Python与金融课程,使用pandas_datareader调用Yahoo Finance的股票数据时遇到了问题。
执行的代码:
import numpy as np import pandas as pd from pandas_datareader import data as wb PG = wb.DataReader('PG', data_source='yahoo', start='1995-1-1')
返回的错误信息:
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_16532\693660725.py in <module> ----> 1 PG = wb.DataReader('PG', data_source='yahoo', start='1995-1-1') ~\anaconda3\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) ~\anaconda3\lib\site-packages\pandas_datareader\data.py in DataReader(name, data_source, start, end, retry_count, pause, session, api_key) 368 369 if data_source == "yahoo": --> 370 return YahooDailyReader( 371 symbols=name, 372 start=start, ~\anaconda3\lib\site-packages\pandas_datareader\base.py in 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): ~\anaconda3\lib\site-packages\pandas_datareader\yahoo\daily.py in _read_one_data(self, url, params) 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: 155 msg = "No data fetched for symbol {} using {}" TypeError: string indices must be integers
错误原因分析:
这个TypeError的核心原因是Yahoo Finance的页面结构已更新,而你当前使用的pandas_datareader版本仍依赖旧的页面解析逻辑:
- pandas_datareader的YahooDailyReader模块会通过正则表达式从Yahoo Finance的页面源码中提取一段内容,试图将其转为JSON字典(
j = json.loads(...))。 - 但现在Yahoo Finance返回的页面结构发生了变化,正则匹配到的内容不再是有效的JSON字符串,而是普通文本,导致
j变成了字符串类型。 - 当代码尝试用字典索引方式(
j["context"]...)访问字符串时,就会触发"string indices must be integers"的错误——因为字符串只能用整数下标访问字符,不能用字符串键。
内容的提问来源于stack exchange,提问作者boovey
相关产品推荐
相关产品推荐

