Python使用Exponential Smoothing预测时forecast传步数报错如何解决
报错解决方法
根因分析
你遇到的报错是因为训练数据的时间索引没有显式声明频率属性(freq),statsmodels的forecast()方法无法基于整数步数自动推算未来预测的时间戳,同时高版本pandas禁止直接对Timestamp类型做整数加减操作,必须基于时间频率做偏移计算。
原始报错信息:
TypeError: Addition/subtraction of integers and integer-arrays with Timestamp is no longer supported. Instead of adding/subtracting
n, usen * obj.freq
修复方案
方案1:显式设置训练数据的时间频率(最简便)
先给训练数据的时间索引设置和采样周期匹配的频率,再训练模型即可正常调用forecast()方法:
import pandas as pd from statsmodels.tsa.holtwinters import ExponentialSmoothing # 第一步:给训练数据设置正确的时间频率 # 按需替换freq参数:日度用'D'、月度用'M'、小时级用'H'、周度用'W'、季度用'Q' traindata = traindata.asfreq('D') # 后续训练预测逻辑不变 model = ExponentialSmoothing(traindata) ets_fit = model.fit(smoothing_level = 0.2,optimized = False ) train['fittedvalues'] = ets_fit.fittedvalues ets_pred = ets_fit.forecast(steps=len(test))
注意:asfreq()会自动补全缺失的时间点,对应数值会填充为NaN,可根据业务需求用fillna()方法处理缺失值后再训练模型。
方案2:手动指定预测时间范围
如果不想修改原始训练数据的索引,也可以手动生成预测的时间索引,用predict()方法代替forecast():
# 手动生成测试集对应的时间索引,freq按你的数据实际周期填写 pred_index = pd.date_range(start=traindata.index[-1] + pd.Timedelta(days=1), periods=len(test), freq='D') ets_pred = ets_fit.predict(start=pred_index[0], end=pred_index[-1])
内容的提问来源于stack exchange,提问作者Sneha B
相关产品推荐
相关产品推荐

