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

使用pandas_datareader获取AZUL4.SA数据报错:string indices must be integers

解决pandas_datareader获取Yahoo金融数据的TypeError问题

问题背景

在《Python金融数据分析》实践中,执行以下代码尝试获取AZUL4.SA在2019-01-01至2019-12-12的金融数据:

import pandas as pd 
import numpy as np 
from pandas_datareader import data
import matplotlib.pyplot as plt
import seaborn as sns 
import plotly.express as px

azul_df = data.DataReader(name='AZUL4.SA', data_source='yahoo',start='2019-01-01', end='2019-12-12')
print(azul_df)

终端重复抛出如下错误:

Traceback (most recent call last):
  File "d:\python-financas\main.py", line 8, in <module>
    azul_df = data.DataReader(name='AZUL4.SA', data_source='yahoo',start='2019-01-01', end='2019-12-12')
  File "D:\Python\Python310\lib\site-packages\pandas\util\_decorators.py", line 213, in wrapper
    return func(*args, **kwargs)
  File "D:\Python\Python310\lib\site-packages\pandas_datareader\data.py", line 379, in DataReader
    ).read()
  File "D:\Python\Python310\lib\site-packages\pandas_datareader\base.py", line 253, in read
    df = self._read_one_data(self.url, params=self._get_params(self.symbols))
  File "D:\Python\Python310\lib\site-packages\pandas_datareader\yahoo\daily.py", line 153, in _read_one_data
    data = j["context"]["dispatcher"]["stores"]["HistoricalPriceStore"]
TypeError: string indices must be integers

问题原因

该错误源于Yahoo Finance的API接口结构发生变更,pandas_datareader官方维护的Yahoo数据源未及时适配这一变化,导致解析返回数据时出现类型错误。

解决方案

推荐使用yfinance库替代pandas_datareader的Yahoo数据源,该库专门针对Yahoo Finance的最新接口做了适配,稳定性更强。

步骤1:安装yfinance

执行以下命令安装依赖:

pip install yfinance

步骤2:修改代码获取数据

直接使用yfinance的download方法获取数据,返回的DataFrame结构与原代码一致,不影响后续分析操作:

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt
import seaborn as sns 
import plotly.express as px
import yfinance as yf

# 获取AZUL4.SA的历史金融数据
azul_df = yf.download('AZUL4.SA', start='2019-01-01', end='2019-12-12')
print(azul_df)

可选:保留pandas_datareader调用方式

若习惯使用pandas_datareader的语法,可通过yfinance的兼容层实现:

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt
import seaborn as sns 
import plotly.express as px
from pandas_datareader import data as pdr
import yfinance as yf

# 覆盖pandas_datareader的Yahoo数据源
yf.pdr_override()
azul_df = pdr.get_data_yahoo('AZUL4.SA', start='2019-01-01', end='2019-12-12')
print(azul_df)

内容的提问来源于stack exchange,提问作者welingtonvbromer-dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 15:18:41