python - 如何使用指数平滑来平滑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$')
它只输出预测的三个值,而不是我原始时间序列的平滑版本。有没有办法获得我原始时间序列的平滑版本?
如果需要,我很乐意提供更多详细信息。
解决方案
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()
推荐阅读
- c++ - 错误未定义对 vtable MyClass 的引用
- ubuntu - kubectl - 访问 GKE 集群时收到 PROTOCOL_ERROR
- flutter - 错误'地图
',但得到了一种类型为“Null”的颤动网络,其安全性为空 - git - 在这两种情况下,快进合并如何解决?
- javascript - 如何使useEffect中的异步函数按顺序执行?
- kubernetes - Alertmanager 由于“解组错误:第 19 行:在 config.plain 类型中找不到字段匹配器”而失败
- typescript - 不变违规:inputRange 必须是单调非递减的 NaN,NaN,NaN
- spring-boot - 如何为 SQL 视图创建 JPA/持久性
- javascript - ExtJS - 如何将 ViewModel 传递给动态创建的组件?
- javascript - 如何从 HTML 打开或关闭 LED?