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

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)

额外排查建议

  1. 在循环内添加print(data["Close"].shape),确认输出是(n,)(Series)而非(n,1)(DataFrame),若为后者说明yfinance返回结构确实存在多列,squeeze()能有效解决。
  2. 对比Colab与本地环境的pandas、yfinance版本,版本差异可能导致数据返回结构变化,Colab中可通过!pip show pandas yfinance查看版本信息。

内容的提问来源于stack exchange,提问作者C W

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:52:34