【问题标题】:How to use exponential smoothing to smooth the timeseries in python?如何使用指数平滑来平滑python中的时间序列?
【发布时间】:2020-07-12 22:48:49
【问题描述】:

我正在尝试使用指数平滑来平滑时间序列。

假设我的时间序列如下所示:

import pandas as pd

data = [446.6565,  454.4733,  455.663 ,  423.6322,  456.2713,  440.5881, 425.3325,  485.1494,  506.0482,  526.792 ,  514.2689,  494.211 ]
index= pd.date_range(start='1996', end='2008', freq='A')
oildata = pd.Series(data, index)

我想获得该时间序列的平滑版本。

如果我做了这样的事情;

from statsmodels.tsa.api import ExponentialSmoothing    
fit1 = SimpleExpSmoothing(oildata).fit(smoothing_level=0.2,optimized=False)
fcast1 = fit1.forecast(3).rename(r'$\alpha=0.2$')

它只输出预测的三个值,而不是我原始时间序列的平滑版本。有没有办法获得我原始时间序列的平滑版本?

如果需要,我很乐意提供更多详细信息。

【问题讨论】:

    标签: python machine-learning time-series signal-processing forecasting


    【解决方案1】:

    显然,您可以在模型的fittedvalues 属性中获取平滑值。

    import pandas as pd
    
    data = [446.6565,  454.4733,  455.663 ,  423.6322,  456.2713,  440.5881, 425.3325,  485.1494,  506.0482,  526.792 ,  514.2689,  494.211 ]
    index= pd.date_range(start='1996', end='2008', freq='A')
    oildata = pd.Series(data, index)
    
    from statsmodels.tsa.api import SimpleExpSmoothing
    fit1 = SimpleExpSmoothing(oildata).fit(smoothing_level=0.2,optimized=False)
    # fcast1 = fit1.forecast(3).rename(r'$\alpha=0.2$')
    
    import matplotlib.pyplot as plt
    plt.plot(oildata)
    plt.plot(fit1.fittedvalues)
    plt.show()
    

    它产生:

    documentation 声明:

    拟合值:ndarray

    拟合值的数组。由指数平滑模型拟合。

    请注意,您也可以使用包含所有值 + 第一个预测的 fittedfcast 属性,或仅包含预测的 fcastvalues 属性。

    【讨论】:

    • 非常感谢。拟合值是什么意思?它是时间序列的平滑版本吗? :)
    • 这就是我强烈的想法,尤其是第一点是相同的并且系列长度是相同的。编辑这显然不是一个数组而是一个系列,索引是相同的 - 我包含了一个指向fit对象类型文档的链接,这是一个HoltWintersResults
    • 拟合值是模型基于拟合参数的样本内预测。
    【解决方案2】:

    ExponentialSmoothing 不是平滑时间序列数据的工具,它是一种时间序列预测方法

    fit() 函数将返回包含学习系数的 HoltWintersResults 类的实例。可以调用结果对象上的 forecast() 或 predict() 函数进行预测。

    因此,通过调用predict,该类将使用学习的系数提供预测。

    然而,为了平滑时间序列,您可以使用fittedvalues 属性,正如@smarie 指出的那样


    不过,我会使用更合适的工具,例如 savgol_filter

    from scipy.signal import savgol_filter
    savgol_filter(oildata, 5, 3)
    
    array([444.87816   , 461.58666   , 444.99296   , 441.70785143,
           442.40769143, 438.36852857, 441.50125714, 472.05622571,
           512.20891429, 521.74822857, 517.63141429, 493.37037143])
    

    如 cmets 中所述,savgol 过滤器在给定窗口大小 (window_length) 上执行给定 polyorder 的局部泰勒近似,并导致时间序列平滑。

    以上设置如下所示:

    plt.plot(oildata)
    plt.plot(pd.Series(savgol_filter(oildata, 5, 3), index=oildata.index))
    plt.show()
    

    【讨论】:

    • 非常感谢。我喜欢你使用savgol_filter 的建议。你知道 savgol_filter 和移动平均有什么区别吗? :)
    • 我记得的 Savgol 过滤器对给定的窗口大小执行局部泰勒近似,并导致函数 @emj 的平滑
    • 而移动平均线只是一个平均值,正如它的名字所说的@emj
    • 非常感谢。我发现您在 savgol 过滤器中发布的详细信息非常有用。谢谢你:)
    • 我有时间会看看 :) @EmJ
    猜你喜欢
    • 1970-01-01
    • 2019-05-12
    • 2016-06-27
    • 2015-08-09
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多