Python实现时间序列分析使用LOESS(STL)模型进行季节性趋势分解(STL算法)项目实战

说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。

1.项目背景

时间序列分析中,LOESS(局部加权回归平滑)和STL(Seasonal and Trend decomposition using Loess)是两种用于分解时间序列数据以提取其内在趋势、季节性和随机波动的方法。

LOESS(Locally Weighted Scatterplot Smoothing)是一种非参数回归技术,它对数据点周围的一个小窗口内的数据进行加权最小二乘回归,以得到该点的平滑估计值。LOESS通过自适应地改变每个数据点的邻域权重来反映局部结构,从而有效地捕获复杂曲线上的模式。

STL算法利用了LOESS方法的特性来进行时间序列的季节性趋势分解。STL将时间序列分解为三个主要组成部分:

趋势(Trend):长期变化的趋势成分,反映了数据随时间推进的基本走向。

季节性(Seasonality):周期性的重复模式,如每日、每周、每月或每年的规律性波动。

残差(Residuals/Noise):除去趋势和季节性后的随机波动,通常被视为“不规则”或“异常”。

在STL分解过程中,首先使用一个循环过程来估计并去除季节性分量,然后应用LOESS方法估算趋势分量,最后从原始数据中减去趋势和季节性分量,得出残差。这个过程是迭代进行的,直到各个组件达到一定的稳定状态。

总的来说,STL算法基于LOESS实现了一种灵活且稳健的时间序列分解方法,能够有效处理各种复杂的时间序列数据,并且特别适用于具有复杂季节性特征的数据集,以便于进一步的分析和预测工作。

本项目通过STL算法来构建时间序列分析使用LOESS(STL)模型进行季节性趋势分解。          

2.数据获取

本次建模数据来源于网络(本项目撰写人整理而成),数据项统计如下:

编号 

变量名称

描述

1

DATE

2

y

数据详情如下(部分展示):

3.数据预处理

3.1 用Pandas工具查看数据

使用Pandas工具的head()方法查看前五行数据:

关键代码:

3.2 数据缺失查看

使用Pandas工具的info()方法查看数据信息:

      

从上图可以看到,总共有1个变量,数据中无缺失值,共257条数据。

关键代码:

3.3 数据描述性统计

通过Pandas工具的describe()方法来查看数据的平均值、标准差、最小值、分位数、最大值。 

关键代码如下:    

  

4.探索性数据分析

4.1 变量直方图

用Matplotlib工具的hist()方法绘制直方图:

从上图可以看到,变量主要集中在70~130之间。  

4.2 折线图

从上图中可以看到,数据有一定的波动性。

5.构建LOESS(STL)模型进行季节性趋势分解 

主要使用STL算法,用于时间序列分析使用LOESS(STL)模型进行季节性趋势分解。      

5.1 构建模型

编号

模型名称

参数

1

LOESS(STL)模型进行季节性趋势分解

period=12

2

seasonal_deg=0

3

trend_deg=0

4

low_pass_deg=0

5

robust=True

  1. 模型评估

6.1 STL分解后的趋势、季节性和残差部分的折线图一

采用鲁棒的方法来处理离群值和不采用鲁棒的方法来处理离群值进行绘图。

6.2 绘制鲁棒性STL分解的权重图

6.3 STL分解后的趋势、季节性和残差部分的折线图二

不使用多项式拟合季节性部分,不使用多项式拟合趋势,低通滤波器进行绘图。

7.结论与展望

综上所述,本文采用了STL算法来构建时间序列分析使用LOESS(STL)模型进行季节性趋势分解,最终证明了我们提出的模型效果良好。此模型可用于日常产品的预测。   

### 使用 Python 实现 STL 分解去掉时间序列趋势季节性时间序列分析中,STLSeasonal and Trend decomposition using LOESS)是一种强大的方法,可以将时间序列分解趋势季节性和残差三个部分。通过这种方法,可以从原始数据中移除趋势季节性成分,从而专注于剩余的随机波动。 以下是基于 `statsmodels` 库实现 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('2023-01-01', periods=100, freq='D') trend_component = np.linspace(0, 5, num=len(time_index)) seasonal_component = 2 * np.sin(np.pi * time_index.dayofyear / 365 * 2) noise_component = np.random.normal(loc=0, scale=0.5, size=len(time_index)) # 合成时间序列 series_data = trend_component + seasonal_component + noise_component sdata = pd.Series(series_data, index=time_index) # 执行 STL 分解 stl_model = STL(sdata, period=7) # 假设周期为每周一次 result = stl_model.fit() # 提取各组成部分 trend = result.trend seasonal = result.seasonal residual = result.resid # 移除趋势季节性后的结果 detrended_and_deseasonalized = sdata - (trend + seasonal) # 可视化结果 plt.figure(figsize=(12, 8)) plt.subplot(4, 1, 1) plt.plot(sdata, label="Original Data", color="blue") plt.legend() plt.title("Original Time Series") plt.subplot(4, 1, 2) plt.plot(trend, label="Trend Component", color="green") plt.legend() plt.title("Trend Component") plt.subplot(4, 1, 3) plt.plot(seasonal, label="Seasonal Component", color="red") plt.legend() plt.title("Seasonal Component") plt.subplot(4, 1, 4) plt.plot(detrended_and_deseasonalized, label="Detrended & Deseasonalized", color="purple") plt.legend() plt.title("Residual After Removing Trend and Seasonality") plt.tight_layout() plt.show() ``` 上述代码实现了以下功能: 1. **创建合成时间序列**:包含线性趋势、正弦波形式的季节性以及噪声。 2. **执行 STL 分解**:利用 `statsmodels.tsa.seasonal.STL` 方法对时间序列进行分解[^1]。 3. **提取组件**:分别获取趋势季节性和残差部分。 4. **去趋势和去季节性**:通过从原序列中减去趋势季节性分量得到新的序列[^2]。 #### 注意事项 - 参数 `period` 需要根据实际数据中的周期长度设置。如果不确定具体周期,可以通过自相关函数或其他探索性数据分析工具来估计。 - 如果存在异常值或不规则模式,建议启用稳健选项(如 R 中的 `robust=True`),但在当前 Python 的 `STL` 实现中尚未提供此参数。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张陈亚

您的鼓励,将是我最大的坚持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值