请求解决Yahoo Finance数据获取代码中的TypeError问题
解决Yahoo Finance数据获取的TypeError错误
问题代码
import numpy as np import pandas as pd import matplotlib.pyplot as plt import pandas_datareader as data start ='2010-01-01' end = '2019-12-31' df=data.DataReader('AppL', 'yahoo', start, end) df.head()
错误信息
TypeError Traceback (most recent call last) /tmp/ipykernel_1028/3510576555.py in <module> 2 end = '2019-12-31' 3 ----> 4 df=data.DataReader('AppL', 'yahoo', start, end) 5 df.head() ~/conda/envs/python/lib/python3.7/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) ~/conda/envs/python/lib/python3.7/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 ~/conda/envs/python/lib/python3.7/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): ~/conda/envs/python/lib/python3.7/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
错误原因
- 股票代码拼写错误:代码中使用的
'AppL'是错误的,苹果公司的正确股票代码是'AAPL'。 - pandas_datareader的Yahoo接口失效:Yahoo Finance的页面结构已更新,pandas_datareader内置的Yahoo数据解析逻辑无法适配新结构,导致返回的内容不是预期的JSON格式,触发
TypeError。
修复方案
步骤1:修正股票代码
将'AppL'改为正确的'AAPL'。
步骤2:替换为yfinance库
使用专门适配Yahoo Finance的yfinance库替代pandas_datareader,该库维护更活跃,能兼容Yahoo的最新接口。
先安装yfinance:
pip install yfinance
修复后完整代码
import numpy as np import pandas as pd import matplotlib.pyplot as plt import yfinance as yf start = '2010-01-01' end = '2019-12-31' # 使用yfinance获取数据 df = yf.download('AAPL', start=start, end=end) print(df.head())
说明
yfinance的download方法会返回与pandas_datareader格式一致的DataFrame,后续的数据分析、可视化代码无需额外修改即可正常使用。
内容的提问来源于stack exchange,提问作者iamzaidsarwar_
相关产品推荐
相关产品推荐

