使用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
相关产品推荐
相关产品推荐

