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

如何高效解析日期列?IBM股票线性回归预测训练报错求助

解决日期列解析与IBM股票价格预测的问题

一、先解决当前报错问题

报错核心原因是特征集X和标签集Y的索引不匹配:

  • 将Date设为DataFrame索引后,Y = df['Adj Close']的索引是日期类型;
  • 但X = pd.DataFrame(scaler.fit_transform(X), columns=X.columns)生成的新DataFrame用了默认整数索引;
  • 当TimeSeriesSplit返回整数型train_index/test_index时,Y[train_index]因找不到对应索引抛出KeyError。

修复方法:转换X时保留原日期索引:

# 替换原X转换代码
X_scaled = scaler.fit_transform(X)
X = pd.DataFrame(X_scaled, columns=X.columns, index=X.index)  # 保留原日期索引

二、高效解析日期列的方法

处理日期列无需分步操作,读取CSV时可一步完成解析与索引设置,效率更高:

# 读取时直接解析日期并设为索引
df = pd.read_csv('IBM.csv', parse_dates=['Date'], index_col='Date')

若要让模型更好地学习日期规律,可从日期中提取数值型衍生特征:

  • 提取年份、月份、星期几(转为0-6的数值,周一=0,周日=6)
  • 计算日期距离数据集起始日的天数(转为连续数值)

示例代码:

# 提取日期衍生特征
df['year'] = df.index.year
df['month'] = df.index.month
df['day_of_week'] = df.index.dayofweek
df['days_since_start'] = (df.index - df.index[0]).days

三、修正模型训练流程

你代码中导入的LogisticRegression是分类模型,而股票价格预测属于回归任务,需替换为LinearRegression。以下是完整修正后的代码:

from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import TimeSeriesSplit
from sklearn.linear_model import LinearRegression  # 替换为线性回归
from sklearn.metrics import mean_squared_error
import pandas as pd
import numpy as np

# 高效读取并解析日期
df = pd.read_csv('IBM.csv', parse_dates=['Date'], index_col='Date')

# 提取日期衍生特征(关键:将日期转为模型可学习的数值特征)
df['year'] = df.index.year
df['month'] = df.index.month
df['day_of_week'] = df.index.dayofweek
df['days_since_start'] = (df.index - df.index[0]).days

# 划分特征与标签
X = df.drop(['Adj Close'], axis=1)
Y = df['Adj Close']

# 特征缩放
scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)
X = pd.DataFrame(X_scaled, columns=X.columns, index=X.index)

# 时间序列交叉验证
timesplit = TimeSeriesSplit(n_splits=10)
mse_scores = []

for train_index, test_index in timesplit.split(X):
    X_train, X_test = X.iloc[train_index], X.iloc[test_index]  # 用iloc按位置索引更稳妥
    y_train, y_test = Y.iloc[train_index], Y.iloc[test_index]
    
    # 训练模型
    model = LinearRegression()
    model.fit(X_train, y_train)
    
    # 预测并评估
    y_pred = model.predict(X_test)
    mse = mean_squared_error(y_test, y_pred)
    mse_scores.append(mse)

# 输出交叉验证结果
print(f"平均MSE: {np.mean(mse_scores):.4f}")

关键说明

  1. 索引匹配:用iloc按位置索引,彻底避免索引类型不匹配问题;
  2. 日期特征工程:原始日期索引无法被线性回归直接学习,必须转为数值型衍生特征;
  3. 模型选择:回归任务需用LinearRegression,而非分类用的LogisticRegression;
  4. 时间序列验证:必须用TimeSeriesSplit保证时间顺序,避免未来数据泄露到训练集。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 13:17:05