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

拆分DataFrame为训练集与测试集时遇IndexError问题求助

拆分DataFrame时IndexError的解决方案

问题根源

  1. 变量赋值错误:dfc = df.columns将DataFrame的列名索引对象赋值给了dfc,而非原DataFrame的副本。列名对象不支持通过列名列表(如['SMA 15', 'SMA 60'])进行索引,也无法使用.iloc按行切片,这是触发IndexError的直接原因。
  2. 列名引用错误:代码中尝试调用MSD 30列,但实际仅生成了MSD 15和MSD 60,后续会引发列不存在的错误。
  3. 拆分逻辑错误:split = int(0.80*len(dfc))计算的是列数的80%,而我们需要的是数据集行数的80%来划分训练集和测试集。

修正后的代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use("seaborn-v0_8")
import warnings
warnings.filterwarnings("ignore")
import yfinance as yf
import ta


df = yf.download("GOOG")
df = df[["Adj Close"]]

df.columns = ["close"]
df = df.sort_index(ascending=False)

df["returns"] = df['close'].pct_change(1)
df["SMA 15"] = df[["close"]].rolling(15).mean().shift(1)
df["SMA 60"] = df[["close"]].rolling(60).mean().shift(1)
df["MSD 15"] = df[["returns"]].rolling(15).std().shift(1)
df["MSD 60"] = df[["returns"]].rolling(60).std().shift(1)
# 若确实需要MSD 30,添加以下行
# df["MSD 30"] = df[["returns"]].rolling(30).std().shift(1)

RSI = ta.momentum.RSIIndicator(df["close"], window=14, fillna=False)
df["rsi"] = RSI.rsi()
df["rsi"].loc["2010"].plot(figsize=(15,8))

# 修正:复制原DataFrame而非列名
dfc = df.copy()

# 按行数的80%计算拆分点
split = int(0.80 * len(dfc))

# 训练集创建(修正列名,若未添加MSD 30则移除该列)
X_train = dfc[['SMA 15', 'SMA 60', 'MSD 15', 'MSD 60', 'rsi']].iloc[:split]
Y_train = dfc[['returns']].iloc[:split]

# 测试集创建
X_test = dfc[['SMA 15', 'SMA 60', 'MSD 15', 'MSD 60', 'rsi']].iloc[split:]
Y_test = dfc[['returns']].iloc[split:]

关键修正点

  • 将dfc = df.columns改为dfc = df.copy(),确保dfc是完整的DataFrame对象。
  • 修正列名引用,确保调用的列已在DataFrame中生成。
  • 基于DataFrame的行数计算拆分比例,符合数据集划分的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 05:50:11