基于日期列拆分周度时间序列训练集,实现滚动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
相关产品推荐
相关产品推荐

