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

Python线性回归日期类型处理报错:数据库表空间增长预测方案咨询

解决日期类型无法用于线性回归的表空间增长预测问题

我明白你遇到的问题了——scikit-learn的回归模型只能处理数值型特征,直接传入datetime64类型的日期数据肯定会抛出类型转换错误,就像你看到的TypeError: Cannot cast array data from dtype('M8[ns]') to dtype('float64')。下面我会一步步帮你修正代码,正确处理日期并完成表空间的增长预测。

核心问题分析

Python的datetime64[ns]类型本质是带时间戳的对象,不是模型能直接计算的浮点/整数类型。我们需要把日期转换成连续的数值特征,常见的两种方式:

  • 自数据集起始日期以来的天数(最直观,数值范围小,模型稳定性好)
  • 日期对应的Unix时间戳(秒/毫秒级整数)

修正后的完整代码

下面是调整后的代码,我标注了关键修改点:

%matplotlib notebook
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split  # 注意:sklearn.cross_validation已废弃,改用model_selection
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error

# 1. 读取数据并正确解析日期列
data = pd.read_excel('D:/database/2.xlsx', parse_dates=['FETCH_DATE'])

# 2. 将日期转换为数值特征:计算每个日期距离数据集第一个日期的天数
data['days_since_start'] = (data['FETCH_DATE'] - data['FETCH_DATE'].min()).dt.days

# 定义特征X和目标y
X = data['days_since_start'].to_frame()  # 保持为DataFrame格式,方便后续处理
y = data['TS_SIZE']

# 3. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

# --- 线性回归 ---
linreg = LinearRegression().fit(X_train, y_train)
y_test_pred_linear = linreg.predict(X_test)

# --- 多项式回归(二次) ---
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)
pr = LinearRegression().fit(X_poly, y)
y_test_pred_quadratic = pr.predict(poly.transform(X_test))  # 用transform而非fit_transform,避免重新拟合

# --- 可视化部分 ---
plt.figure(figsize=(8, 5))
# 绘制原始数据点
plt.scatter(data['FETCH_DATE'], y, marker='o', label='Actual TS Size', alpha=0.7)

# 绘制线性回归预测(把X_test的天数转回日期)
test_dates = data.loc[X_test.index, 'FETCH_DATE']
plt.plot(test_dates, y_test_pred_linear, label='Linear Fit', linestyle='--', color='r')

# 绘制二次回归预测
plt.plot(test_dates, y_test_pred_quadratic, label='Quadratic Fit', color='g')

# --- 未来日期预测示例 ---
# 预测接下来30天的表空间
last_date = data['FETCH_DATE'].max()
future_dates = pd.date_range(start=last_date, periods=30, freq='D')
# 转换未来日期为天数特征
future_days = (future_dates - data['FETCH_DATE'].min()).days
future_X_poly = poly.transform(future_days.reshape(-1, 1))
future_pred = pr.predict(future_X_poly)

# 绘制未来预测点
plt.scatter(future_dates, future_pred, marker='*', label='Predicted TS Size', color='orange')

# 美化图表
plt.xlabel('Date')
plt.ylabel('Tablespace Size')
plt.title('Tablespace Growth Prediction')
plt.legend(loc='upper left')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

# --- 输出模型评估指标 ---
print(f"Linear Regression Test MSE: {mean_squared_error(y_test, y_test_pred_linear):.3f}")
print(f"Quadratic Regression Test MSE: {mean_squared_error(y_test, y_test_pred_quadratic):.3f}")

关键修改说明

  1. 日期解析与转换:

    • 用parse_dates=['FETCH_DATE']确保读取Excel时自动把日期列转为datetime类型
    • 计算days_since_start作为数值特征,既保留了日期的连续顺序,又让模型能直接处理
  2. 废弃API替换:

    • sklearn.cross_validation.train_test_split已被官方废弃,改用sklearn.model_selection.train_test_split
  3. 多项式回归的正确用法:

    • 对测试集和未来数据使用poly.transform()而非fit_transform(),避免重新拟合多项式特征,保证和训练时的转换规则一致
  4. 可视化优化:

    • 把数值化的天数转回原始日期,让x轴显示可读的日期格式,而非抽象的天数
    • 添加了未来日期预测的示例,展示如何扩展到未观测的时间点

其他可选的日期转换方式

如果你更倾向于用时间戳,可以这样转换:

# 转换为Unix时间戳(秒级,避免数值过大)
data['timestamp'] = data['FETCH_DATE'].astype('int64') // 10**9
X = data['timestamp'].to_frame()

这种方式同样有效,但天数特征的数值范围更小,模型训练时数值稳定性更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:39:25