使用yfinance下载股票基本面数据时遇TypeError问题求助
解决yfinance获取股票基本面数据的TypeError问题
我尝试使用yfinance库从Yahoo Finance下载股票基本面数据,初始代码如下:
import pandas as pd import yfinance as yf symbol = 'AAPL' ticker = yf.Ticker(symbol) ticker.income_stmt
运行后出现错误:TypeError: string indices must be integers。我尝试了另一种通过ticker.info转换为DataFrame的方案:
import pandas as pd tickers_list = ["aapl"] # example list tickers_data= {} # empty dictionary for ticker in tickers_list: ticker_object = yf.Ticker(ticker) #convert info() output from dictionary to dataframe temp = pd.DataFrame.from_dict(ticker_object.info, orient="index") temp.reset_index(inplace=True) temp.columns = ["Attribute", "Recent"] # add (ticker, dataframe) to main dictionary tickers_data[ticker] = temp tickers_data
但问题仍未解决,恳请帮助。
修复方案
1. 升级yfinance到最新版本
旧版本yfinance的API解析逻辑存在bug,是引发这类错误的常见原因,先执行升级:
pip install --upgrade yfinance
2. 调整利润表的获取方式
新版本中income_stmt返回DataFrame,但偶尔会因数据加载问题返回异常内容,建议增加空值判断,或切换到季度数据:
import pandas as pd import yfinance as yf symbol = 'AAPL' ticker = yf.Ticker(symbol) # 尝试获取年度利润表 annual_income = ticker.income_stmt if not annual_income.empty: print(annual_income) else: # 若年度数据为空,获取季度利润表 print(ticker.quarterly_income_stmt)
3. 增加ticker.info的类型校验
如果Yahoo Finance返回的不是预期的字典(比如错误字符串),会导致DataFrame转换失败,先校验返回类型:
import pandas as pd tickers_list = ["aapl"] tickers_data= {} for ticker in tickers_list: ticker_object = yf.Ticker(ticker) info_dict = ticker_object.info # 确认返回的是字典再转换 if isinstance(info_dict, dict): temp = pd.DataFrame.from_dict(info_dict, orient="index") temp.reset_index(inplace=True) temp.columns = ["Attribute", "Recent"] tickers_data[ticker] = temp else: print(f"{ticker}信息获取失败,返回内容:{info_dict}") print(tickers_data)
4. 排查网络与请求限制
Yahoo Finance会对频繁请求做限制,若升级和代码调整后仍失败,可尝试:
- 更换网络环境重试
- 批量获取时增加请求间隔
内容的提问来源于stack exchange,提问作者Maksim
相关产品推荐
相关产品推荐

