Colab中yfinance数据集Pandas转换报错:无法赋值多列给单列target_5
解决Colab中Pandas赋值报错:ValueError: Cannot set a DataFrame with multiple columns to the single column target_5
问题本质
你遇到的报错核心是赋值右侧生成了多列DataFrame,但你试图将其存入单列Series。虽然你确认shift(-5)返回的是Series,但Colab环境下yfinance返回的Close列可能并非单值Series(比如因版本差异返回多列收盘价结构),后续计算时会衍生出多列结果,最终导致赋值失败。
修复代码
强制将Close列转换为单值Series,确保所有计算结果都是单列结构,修改后的代码如下:
stock_symbol = "QQQ" today=datetime.today().strftime('%Y-%m-%d') # Download training data (2020 - 2024) train_start = "2018-01-01" train_end = "2024-09-01" train_data = yf.download(stock_symbol, start=train_start, end=train_end, interval="1d") # Download test data (2025) test_start = "2024-09-01" # Ensure at least 50 prior days for rolling windows test_end = datetime.today().strftime("%Y-%m-%d") test_data = yf.download(stock_symbol, start=test_start, end=test_end, interval="1d") for data in [train_data, test_data]: # 强制转为单值Series,消除多列隐患 close_series = data["Close"].squeeze() data["daily_change_%"] = close_series.pct_change() * 100 data["curday_change_%"] = (close_series - data["Open"]) / data["Open"] * 100 data["shift_5"] = close_series.shift(-5) data["shift_10"] = close_series.shift(-10) data["shift_20"] = close_series.shift(-20) # 基于单值Series计算目标列,确保结果为单列 data["target_5"] = ((data["shift_5"] - close_series) / close_series) * 100 data["target_10"] = ((data["shift_10"] - close_series) / close_series) * 100 data["target_20"] = ((data["shift_20"] - close_series) / close_series) * 100 data["target"] = (data["target_20"] > 0).astype(int)
额外排查建议
- 在循环内添加
print(data["Close"].shape),确认输出是(n,)(Series)而非(n,1)(DataFrame),若为后者说明yfinance返回结构确实存在多列,squeeze()能有效解决。 - 对比Colab与本地环境的
pandas、yfinance版本,版本差异可能导致数据返回结构变化,Colab中可通过!pip show pandas yfinance查看版本信息。
内容的提问来源于stack exchange,提问作者C W
相关产品推荐
相关产品推荐

