如何高效解析日期列?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}")
关键说明
- 索引匹配:用
iloc按位置索引,彻底避免索引类型不匹配问题; - 日期特征工程:原始日期索引无法被线性回归直接学习,必须转为数值型衍生特征;
- 模型选择:回归任务需用
LinearRegression,而非分类用的LogisticRegression; - 时间序列验证:必须用
TimeSeriesSplit保证时间顺序,避免未来数据泄露到训练集。
内容的提问来源于stack exchange,提问作者geek
相关产品推荐
相关产品推荐

