【问题标题】:ExponentialSmoothing generates RuntimeWarnings on one computer but not anotherExponentialSmoothing 在一台计算机上而不是另一台计算机上生成 RuntimeWarnings
【发布时间】:2020-09-08 08:40:45
【问题描述】:

这段代码:

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 中遇到无效值

...\statsmodels\tsa\holtwinters.py:731: RuntimeWarning: 在更大的_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.小伙子)

请问我们如何解决问题,以免我的同事收到这些 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 中遇到无效值

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

【问题讨论】:

    标签: python numpy statsmodels holtwinters


    【解决方案1】:

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

        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()

    【讨论】:

    • 嗨,约翰,你能说得更具体一点吗?此功能与 OP 的问题究竟有何关系?哪些界限不正确,为什么以及如何解决?另外,添加指向函数源代码的链接可能是个好主意?您的回答目前更像是一个提示,而不是一个完整的答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    相关资源
    最近更新 更多