首页 > 解决方案 > 如何使用指数平滑来平滑python中的时间序列?

问题描述

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

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

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$')

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

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

标签: pythonmachine-learningtime-seriessignal-processingforecasting

解决方案


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

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

上面的设置如下所示:

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

在此处输入图像描述


推荐阅读