You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求解决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

错误原因

  1. 股票代码拼写错误:代码中使用的'AppL'是错误的,苹果公司的正确股票代码是'AAPL'。
  2. 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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 14:15:41