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

基于日期列拆分周度时间序列训练集,实现滚动12周预测求助

周度时间序列拆分与Holt-Winters预测实现方案

一、数据预处理

首先将date列转为datetime类型,保证时间序列的连续性:

import pandas as pd

# 读取数据(替换为你的数据路径)
df = pd.read_csv('your_data.csv')
# 转换日期格式
df['date'] = pd.to_datetime(df['date'], format='%m/%d/%Y')
# 按日期排序,确保时序逻辑正确
df = df.sort_values('date').reset_index(drop=True)

二、自定义时间序列拆分逻辑

TimeSeriesSplit无法满足你固定测试集为12周、训练集截止日期按月推进的需求,因此自定义拆分逻辑:

1. 生成训练集截止日期列表

按照需求生成2022年1月至7月的15日作为训练截止节点:

import datetime

# 生成训练截止日期集合
cutoff_dates = [datetime.date(2022, month, 15) for month in range(1, 8)]
# 转为datetime64类型,匹配数据中的日期格式
cutoff_dates = pd.to_datetime(cutoff_dates)

2. 拆分训练集与测试集

遍历每个截止日期,提取对应时段的训练、测试数据:

train_test_splits = []

for cutoff in cutoff_dates:
    # 提取截止日期及之前的所有数据作为训练集
    train = df[df['date'] <= cutoff].copy()
    # 获取训练集最后一条记录的日期
    last_train_date = train['date'].iloc[-1]
    # 计算测试集结束日期:最后训练日 + 12周
    test_end_date = last_train_date + pd.Timedelta(weeks=12)
    # 提取训练集之后12周的数据作为测试集
    test = df[(df['date'] > last_train_date) & (df['date'] <= test_end_date)].copy()
    
    # 校验测试集长度,确保为12条周度数据
    if len(test) == 12:
        train_test_splits.append((train, test))
    else:
        print(f"截止日期{cutoff.date()}对应的测试集不足12周,跳过该拆分")

三、循环执行Holt-Winters预测

使用statsmodels库实现Holt-Winters算法,遍历所有拆分好的训练测试对:

from statsmodels.tsa.holtwinters import ExponentialSmoothing
import numpy as np

# 存储各拆分的预测结果与误差
results = []

for idx, (train, test) in enumerate(train_test_splits, 1):
    # 初始化Holt-Winters模型(假设加法趋势+加法季节性,周期为52周,可按需调整)
    model = ExponentialSmoothing(
        train['visits'],
        trend='add',
        seasonal='add',
        seasonal_periods=52
    )
    # 拟合模型
    fitted_model = model.fit()
    # 预测12周数据
    forecast = fitted_model.forecast(steps=12)
    # 计算平均绝对误差MAE
    mae = np.mean(np.abs(forecast - test['visits']))
    # 保存结果
    results.append({
        '拆分编号': idx,
        '训练截止日期': train['date'].iloc[-1].date(),
        'MAE': round(mae, 2),
        '预测值': forecast,
        '实际值': test['visits']
    })

# 打印各拆分的误差情况
for res in results:
    print(f"拆分{res['拆分编号']} | 训练截止日: {res['训练截止日期']} | MAE: {res['MAE']}")

四、关键调整说明

  • 季节性周期:若你的数据季节性不是52周,可修改seasonal_periods参数;趋势和季节性类型(加法/乘法)可根据数据波动特征调整。
  • 误差指标:可替换为RMSE、MAPE等其他指标,适配你的评估需求。
  • 数据校验:拆分时加入测试集长度校验,避免因数据缺失导致的预测偏差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:45:31