来自 statsmodels ExponentialSmoothing 的 ValueError

数据挖掘 Python 熊猫 预报
2022-01-31 12:42:36

我一直对 statsmodels 的 ExponentialSmoothing 模块有一个令人沮丧的问题。

我的数据是一个熊猫系列,每周有 74 个数据点,如下所示:

2017-12-31    6069
2018-01-07    8143
2018-01-14    6740
2018-01-21    6433
2018-01-28    6631
2018-02-04    6308
2018-02-11    5536
2018-02-18    6025
2018-02-25    5171
...           ...

当我调用以下函数时:

model = ExponentialSmoothing(data, trend='add',damped=True,seasonal='mul',seasonal_periods=52)
model_fit = model.fit()

我得到:

Traceback (most recent call last):
  File ".\smoothingjuly.py", line 24, in <module>
    model_fit = model.fit()
  File "C:\Users\lhughes\AppData\Local\Programs\Python\Python37\lib\site-packages\statsmodels\tsa\holtwinters.py", line 641, in fit
    l0, b0, s0 = self.initial_values()
  File "C:\Users\lhughes\AppData\Local\Programs\Python\Python37\lib\site-packages\statsmodels\tsa\holtwinters.py", line 773, in initial_values
    b0 = ((lead - lag) / m).mean()
ValueError: operands could not be broadcast together with shapes (22,) (52,)

为什么是这样?如果我减少季节性周期的数量,它会起作用,但这会使我的模型无用。74 个数据点对模型来说还不够吗?如果是这样,最低限度是多少?

谢谢

1个回答

错误来自lead - lag; 在 中initial_values,这些分别设置为y[m:2m]y[:m],其中m是季节性长度(在您的情况下为 52)。所以lead只能得到 22 个值,因此会出现大小不匹配的投诉。

所以是的,要让它直接工作,你至少需要 104 个数据点。请参阅源代码文档页(注意,这是针对 0.10 版的。在 v0.12 中进行了一些更改,其中初始化需要更多选项。但是 OP 的上下文是特定于版本的,所以我将保留它。)

但是,您可以通过将自己的代码传递initial_slopefit*. 我可能会建议模仿 statsmodels 的方法,但将同比斜率限制在您可用的范围内:(y[52:74] - y[:22]).mean() / 52
* 这是 v0.12 中的一个变化;这些参数是在模型实例化时传递的,不适合。如果您想在较新版本中执行此操作,请参阅文档。