1

这段代码:

import numpy as np
from statsmodels.tsa.api import ExponentialSmoothing
time_series = np.array([1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4])
print(ExponentialSmoothing(time_series, seasonal_periods=4, trend=None, seasonal="add").fit().forecast(4))    # [1. 2. 3. 4.]

在没有警告的情况下运行并正确打印 [1. 2. 3. 4.] 在我的电脑上(Anaconda Navigator 1.9.12 和 Visual Studio Code 1.45.1,运行 python 3.7.6,numpy 1.18.1,statsmodels 0.11.0)。

然而,在我同事的计算机(运行 Python 3.8、numpy 1.18.4、statsmodels 0.11.0 的 Visual Studio Code)上,相同的代码会在正确打印之前触发以下警告 [1. 2. 3. 4.]:

...\statsmodels\tsa\holtwinters.py:725: RuntimeWarning: 在less_equal loc = initial_p <= lb 中遇到无效值

...\statsmodels\tsa\holtwinters.py:731:RuntimeWarning:在greater_equal loc = initial_p >= ub 中遇到无效值

...\statsmodels\tsa\holtwinters.py:956: RuntimeWarning: 除以零在日志中遇到 aic = self.nobs * np.log(sse / self.nobs) + k * 2

...\statsmodels\tsa\holtwinters.py:962: RuntimeWarning: 除以零出现在日志 bic = self.nobs * np.log(sse / self.nobs) + k * np.log(self.nobs)

我们怎样才能解决问题,以便我的同事不会收到这些 RuntimeWarnings,拜托?还是我们不应该担心他们?非常感谢。

更新:我想我找到了答案。我的测试数据太完美了,因此引起了警告。将抖动引入数据可消除警告。无论哪种方式,我认为,基于此,我们无论如何都可以忽略警告:

import numpy as np
from statsmodels.tsa.api import ExponentialSmoothing
time_series = np.array([1.2, 1.8, 3.2, 3.8, 1, 2, 3, 4, 1.1, 1.9, 3.1, 3.9, 1, 2, 3, 4])
print(ExponentialSmoothing(time_series, seasonal_periods=4, trend=None, seasonal="add").fit().forecast(4))
# [1.07500096 1.92499933 3.07500112 3.92499949]

另一个更新:不,不是这样。在我的电脑上,我仍然没有收到警告,但我的同事收到了

...\statsmodels\tsa\holtwinters.py:725: RuntimeWarning: 在less_equal loc = initial_p <= lb 中遇到无效值

...\statsmodels\tsa\holtwinters.py:731:RuntimeWarning:在greater_equal loc = initial_p >= ub 中遇到无效值

4

1 回答 1

0

看一下库中的函数。这会给你一个答案。

    def _enforce_bounds(self, p, sel, lb, ub):
        initial_p = p[sel]

        # Ensure strictly inbounds
        loc = initial_p <= lb
        upper = ub[loc].copy()
        upper[~np.isfinite(upper)] = 100.0
        eps = 1e-4
        initial_p[loc] = lb[loc] + eps * (upper - lb[loc])

        loc = initial_p >= ub
        lower = lb[loc].copy()
        lower[~np.isfinite(lower)] = -100.0
        eps = 1e-4
        initial_p[loc] = ub[loc] - eps * (ub[loc] - lower)

        return initial_p

您的代码似乎没有使用正确的边界来运行 ExponentialSmoothing()

于 2021-01-12T16:07:06.990 回答