python 时间序列分解 stl_【时间序列】时间序列分解总结

昵称 | 追光者

研究 | 机器学习与时间序列

出品 | AI蜗牛车

1.朴素分解

一个时间通常由长期趋势,季节变动,循环波动,不规则波动几部分组成

长期趋势指现象在较长时期内持续发展变化的一种趋向或状态。

季节波动是由于季节的变化引起的现象发展水平的规则变动

循环波动指在某段时间内,不具严格规则的周期性连续变动

不规则波动指由于众多偶然因素对时间序列造成的影响

分解模型又分为加法模型和乘法模型。加法指的是时间序分的组成是相互独立的,四个成分都有相同的量纲。乘法模型输出部分和趋势项有相同的量纲,季节项和循环项是比例数,不规则变动项为独立随机变量序列,服从正态分布。

加法模型:

乘法模型:

这里提一点,乘法模型可以通过取对数变换为加法模型

混合模型

1.1 因素分解

移动平均:

选取当前观测及其过去的

个数据还有未来

个数据去平均,

,称为m阶移动平均(m-MA),一般来说,阶数越高,曲线越平滑

随机性是围绕中间值波动的,用平均刚好可以在一定程度上抵消随机性,也没有季节性因素。所以

### Python 时间序列 STL 分解教程 #### 什么是STL分解STL(Seasonal and Trend decomposition using Loess)是一种用于时间序列分析的技术,它通过局部加权回归(LOESS)将时间序列数据分为三个主要部分:趋势分量、季节性分量和残差分量[^3]。 #### 使用Python实现STL分解Python中可以利用`statsmodels`库中的`tssa.STL`模块来完成STL分解。以下是详细的代码示例: ```python import numpy as np import pandas as pd from statsmodels.tsa.seasonal import STL import matplotlib.pyplot as plt # 创建模拟的时间序列数据 np.random.seed(42) time_index = pd.date_range('2016-01-01', '2020-12-31', freq='M') data = (5 * np.sin(np.linspace(0, 8 * np.pi, len(time_index))) + np.linspace(0, 10, len(time_index)) + np.random.normal(size=len(time_index))) series = pd.Series(data, index=time_index) # 进行STL分解 stl = STL(series, period=12) # 假设周期为12个月 result = stl.fit() # 绘制分解结果 fig, axes = plt.subplots(4, 1, sharex=True, figsize=(10, 8)) axes[0].set_title("STL Decomposition", fontsize=16) axes[0].plot(series, label="Original Series") axes[0].legend(loc="upper left") axes[1].plot(result.trend, label="Trend Component") axes[1].legend(loc="upper left") axes[2].plot(result.seasonal, label="Seasonal Component") axes[2].legend(loc="upper left") axes[3].plot(result.resid, label="Residuals") axes[3].legend(loc="upper left") plt.tight_layout() plt.show() ``` 上述代码展示了如何创建一个带有趋势和季节性的模拟时间序列,并对其进行STL分解。最终的结果会显示原始系列及其对应的趋势、季节性和残差成分[^5]。 #### 参数说明 - `period`: 表示时间序列的周期长度,在月度数据中通常设置为12表示一年内的循环模式。 - `fit()`: 调用此方法执行实际的分解操作并返回包含各组成部分的对象。 #### 结果解释 通过对时间序列应用STL分解,可以获得更清晰的理解关于数据内部结构的信息: - **趋势(Trend)** 显示长期变化方向; - **季节性(Seasonality)** 描述重复发生的短期波动; - **残差(Residuals)** 则捕捉那些无法被前两者所描述的部分。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值