调用get_quote_yahoo批量获取股票市值时报'Ticker'对象不可迭代TypeError
问题根因定位
- 触发
TypeError: 'Ticker' object is not iterable的核心原因:pdr.get_quote_yahoo()的入参要求是可迭代的股票代码字符串集合,原代码传入了yf.Ticker生成的实例对象,类型不匹配导致报错。 - 数据逻辑缺陷:原循环内仅临时赋值
market_cap变量,没有把每只股票的代码、对应市值存储到统一容器中,后续导出时market_cap只会保留最后一次循环的临时值,无法形成完整数据集。 - 表格构造错误:
pd.DataFrame的参数匹配逻辑出错,原代码将tickers和market_cap分别作为第一、第二个位置参数传入,不符合pandas构造二维表的语法规则,生成的表格结构完全不符合预期。
可直接运行的修正实现
import pandas as pd import pandas_datareader as pdr import yfinance as yf import get_tickers as gt # 获取筛选后的目标股票列表 tickers = gt.get_tickers_filtered(mktcap_min=500, mktcap_max=10000) print(f"待采集股票总数:{len(tickers)}") # 初始化统计变量与结构化结果存储容器 Amount_of_API_Calls = 0 Stock_Failure = 0 Stocks_Not_Imported = 0 result_dict = { "Ticker": [], "Market Cap": [] } i = 0 while (i < len(tickers)) and (Amount_of_API_Calls < 1900): try: stock_code = str(tickers[i]) # 直接传入股票代码字符串,避免传入Ticker实例触发类型错误 quote_data = pdr.get_quote_yahoo(stock_code) market_cap = quote_data['marketCap'].iloc[0] # 将当前采集结果存入结构化容器,避免临时变量被覆盖 result_dict["Ticker"].append(stock_code) result_dict["Market Cap"].append(market_cap) Amount_of_API_Calls += 1 Stock_Failure = 0 i += 1 except ValueError: print("雅虎财经后端接口临时错误,正在重试") if Stock_Failure > 3: i += 1 Stocks_Not_Imported += 1 Amount_of_API_Calls += 1 Stock_Failure += 1 # 构造最终导出用DataFrame export_df = pd.DataFrame(result_dict) print(f"成功采集股票数量:{len(export_df)}") print(export_df) # 导出为Excel文件,可直接供其他项目读取使用 export_df.to_excel("target_stock_market_cap.xlsx", index=False)
核心调整说明
- 移除了冗余的
yf.Ticker实例创建步骤,直接将标准化的股票代码字符串传入pdr.get_quote_yahoo,彻底解决入参不匹配引发的迭代错误。 - 新增键值对形式的结果存储字典,替代原代码中被循环反复覆盖的临时单值变量,确保每只股票的采集结果都被完整留存。
- 修正DataFrame构造逻辑,不再按照错误的位置参数传入两个独立列表,直接将同维度的结构化字典传入即可生成符合要求的两列表格。
- 补全Excel导出逻辑,同时保留了原代码的API调用次数限制、接口错误重试、失败统计的原有业务逻辑,没有额外改动原有流程。
内容的提问来源于stack exchange,提问作者nievans24
相关产品推荐
相关产品推荐

