拆分DataFrame为训练集与测试集时遇IndexError问题求助
拆分DataFrame时IndexError的解决方案
问题根源
- 变量赋值错误:
dfc = df.columns将DataFrame的列名索引对象赋值给了dfc,而非原DataFrame的副本。列名对象不支持通过列名列表(如['SMA 15', 'SMA 60'])进行索引,也无法使用.iloc按行切片,这是触发IndexError的直接原因。 - 列名引用错误:代码中尝试调用
MSD 30列,但实际仅生成了MSD 15和MSD 60,后续会引发列不存在的错误。 - 拆分逻辑错误:
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
相关产品推荐
相关产品推荐

