用Python实现时间序列模型实战——Day 8: 季节性ARIMA模型 (SARIMA)

一、学习内容
1. SARIMA 模型的定义与公式推导

SARIMA 模型

  • SARIMA 模型是扩展了 ARIMA 模型的一种方法,全称为季节性自回归积分滑动平均模型(Seasonal AutoRegressive Integrated Moving Average)。它结合了 ARIMA 模型的非季节性部分和季节性成分,用于处理具有季节性模式的时间序列数据。
  • SARIMA 模型可以表示为

\Phi_P(B^m) \phi_p(B) \nabla^d \nabla_m^D y_t = \mu + \Theta_Q(B^m) \theta_q(B) \epsilon_t

其中:

  • y_t 是时间 t 的观察值。
  • \phi_p(B)  是非季节性自回归多项式,阶数为 p
  • \Phi_P(B^m) 是季节性自回归多项式,阶数为 P
  • \theta_q(B) 是非季节性移动平均多项式,阶数为 q
  • \Theta_Q(B^m) 是季节性移动平均多项式,阶数为 Q
  • \nabla^d 表示非季节性差分操作,次数为 d
  • \nabla_m^D​ 表示季节性差分操作,次数为 D
  • \epsilon_t 是白噪声项。
  • m 是季节性周期。

SARIMA 模型的公式

  • SARIMA 模型的数学表达式为:

(1 - \Phi_1 B^{12})(1 - \phi_1 B)(1 - B)(1 - B^{12})y_t = \mu + (1 + \Theta_1 B^{12})(1 + \theta_1 B) \epsilon_t

其中:

  • \phi_1 是非季节性自回归项的系数。
  • \Phi_1是季节性自回归项的系数。
  • \theta_1​ 是非季节性移动平均项的系数。
  • \Theta_1是季节性移动平均项的系数。
  • B 是滞后算子,表示滞后 1 期。
  • \epsilon_t 是白噪声项。
2. SARIMA 模型的参数识别与选择 (P, D, Q)

非季节性参数识别

  • p(非季节性自回归项):通过偏自相关函数(PACF)图确定,如果 PACF 在某个滞后期后截尾,截尾点即为 p 的值。
  • d(非季节性差分次数):通过差分使序列平稳,差分次数 d 通常根据时间序列的平稳性检验或观察差分后的序列图来选择。
  • q(非季节性移动平均项):通过自相关函数(ACF)图确定,如果 ACF 在某个滞后期后截尾,截尾点即为 q 的值。

季节性参数识别

  • P(季节性自回归项):通过季节性 PACF 图确定。
  • D(季节性差分次数):通过季节性差分使序列平稳,季节性差分次数 D 根据季节性周期和数据的季节性特征确定。
  • Q(季节性移动平均项):通过季节性 ACF 图确定。
  • m(季节性周期):季节性周期 m 通常是已知的,如每年或每季度。
3. SARIMA 模型的季节性成分处理

季节性成分处理

  • 在 SARIMA 模型中,季节性成分通过季节性自回归(SAR)、季节性差分(SD)、季节性移动平均(SMA)项进行处理。这些季节性成分使模型能够捕捉周期性模式,并提升对季节性数据的预测能力。
二、实战案例

下面我们将使用 statsmodels 库对航空乘客数据进行 SARIMA 模型的拟合与预测。

1. 数据加载与原始数据可视化
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf# 加载时间序列数据集
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv"
data = pd.read_csv(url, parse_dates=['Month'], index_col='Month')# 绘制原始数据的时间序列图
plt.figure(figsize=(12, 6))
plt.plot(data['Passengers'], label='Original')
plt.title('Original Time Series')
plt.xlabel('Date')
plt.ylabel('Number of Passengers')
plt.legend()
plt.grid(True)
plt.show()

程序解释:

  • 载入航空乘客数据集,并绘制原始时间序列图,观察数据的趋势和季节性波动。

结果输出:

原始数据的时间序列图:图表显示了航空乘客数量随时间的变化,表现出明显的上升趋势和季节性波动。 

2. 一阶差分与季节性差分
# 进行一阶差分以去除趋势
data_diff = data.diff().dropna()# 进行季节性差分以去除季节性成分
data_seasonal_diff = data_diff.diff(12).dropna()# 绘制差分后的时间序列图
plt.figure(figsize=(12, 6))
plt.plot(data_seasonal_diff['Passengers'], label='Seasonally Differenced')
plt.title('Seasonally Differenced Time Series')
plt.xlabel('Date')
plt.ylabel('Differenced Passengers')
plt.legend()
plt.grid(True)
plt.show()

程序解释: 

  • 对时间序列进行一阶差分,以去除趋势。
  • 对差分后的数据进行季节性差分,以去除季节性成分。季节性差分是针对周期为 12 的数据进行差分(即 diff(12)),消除一年中的季节性波动。

结果输出:

差分后的时间序列图:一阶差分后的数据消除了趋势,而季节性差分进一步消除了季节性成分,表现为更加平稳的时间序列。 

3. ACF 和 PACF 图的绘制
# 绘制 ACF 和 PACF 图
plt.figure(figsize=(12, 6))
plt.subplot(121)
plot_acf(data_seasonal_diff, lags=40, ax=plt.gca())
plt.title('ACF of Seasonally Differenced Data')plt.subplot(122)
plot_pacf(data_seasonal_diff, lags=40, ax=plt.gca())
plt.title('PACF of Seasonally Differenced Data')plt.tight_layout()
plt.show()

程序解释: 

  • 绘制季节性差分后的 ACF 和 PACF 图,帮助确定 SARIMA 模型的参数。

结果输出:

ACF 和 PACF 图:ACF 和 PACF 图展示了季节性差分后的数据自相关结构,通过这些图可以确定 SARIMA 模型的参数。 

4. SARIMA 模型拟合
# SARIMA 模型拟合 (p, d, q) x (P, D, Q, m) = (1, 1, 1) x (1, 1, 1, 12)
model = SARIMAX(data['Passengers'], order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
results = model.fit()# 输出模型摘要
print(results.summary())

程序解释: 

  • 使用 SARIMAX 函数拟合 SARIMA 模型。本例中选择 (p, d, q) = (1, 1, 1)(P, D, Q, m) = (1, 1, 1, 12) 来拟合模型。
  • 输出模型的摘要信息,包括 AIC、BIC 等指标。

结果输出:

SARIMAX Results                                      
==========================================================================================
Dep. Variable:                         Passengers   No. Observations:                  144
Model:             SARIMAX(1, 1, 1)x(1, 1, 1, 12)   Log Likelihood                -506.149
Date:                            Mon, 02 Sep 2024   AIC                           1022.299
Time:                                    12:59:16   BIC                           1036.675
Sample:                                01-01-1949   HQIC                          1028.140- 12-01-1960                                         
Covariance Type:                              opg                                         
==============================================================================coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
ar.L1         -0.1272      0.356     -0.357      0.721      -0.825       0.570
ma.L1         -0.2149      0.325     -0.660      0.509      -0.853       0.423
ar.S.L12      -0.9272      0.214     -4.341      0.000      -1.346      -0.509
ma.S.L12       0.8395      0.309      2.717      0.007       0.234       1.445
sigma2       130.7819     15.420      8.481      0.000     100.559     161.005
===================================================================================
Ljung-Box (L1) (Q):                   0.00   Jarque-Bera (JB):                 7.05
Prob(Q):                              0.99   Prob(JB):                         0.03
Heteroskedasticity (H):               2.65   Skew:                             0.13
Prob(H) (two-sided):                  0.00   Kurtosis:                         4.11
===================================================================================

SARIMA 模型的摘要:模型摘要中包含了各参数的估计值、标准误差、t 统计量,以及 AIC/BIC 等信息准则,用于评估模型的拟合效果。 

5. 模型预测
# 进行预测
pred = results.get_forecast(steps=24)
pred_ci = pred.conf_int()# 绘制预测结果
plt.figure(figsize=(12, 6))
plt.plot(data.index, data['Passengers'], label='Observed')
plt.plot(pred.predicted_mean.index, pred.predicted_mean, color='red', label='Forecast')
plt.fill_between(pred_ci.index, pred_ci.iloc[:, 0], pred_ci.iloc[:, 1], color='pink', alpha=0.3)
plt.title('SARIMA Model Forecast')
plt.xlabel('Date')
plt.ylabel('Number of Passengers')
plt.legend()
plt.grid(True)
plt.show()

程序解释: 

  • 使用拟合的 SARIMA 模型进行未来 24 个月的乘客数量预测。
  • 绘制预测结果图,并包含置信区间(confidence interval),展示模型预测的范围。

结果输出:

模型预测结果:预测结果图展示了未来 24 个月的航空乘客数量预测值,并在图中包含了置信区间,表示预测的不确定性范围。预测结果与观测数据的趋势和季节性波动相一致,表明 SARIMA 模型能够有效捕捉季节性时间序列的数据结构。 

三、运行结果分析
1. 季节性处理
  • SARIMA 模型通过季节性自回归、季节性差分和季节性移动平均的组合,成功捕捉了时间序列中的季节性成分。这种处理方式特别适用于具有周期性模式的时间序列。
2. ACF 和 PACF 图分析
  • 通过季节性差分后的 ACF 和 PACF 图,确定了 SARIMA 模型的参数。这些图表帮助识别了数据中的自相关性和季节性成分,为模型参数的选择提供了依据。
3. SARIMA 模型的拟合与预测
  • SARIMA 模型拟合后的结果表明,模型能够有效地解释和预测时间序列数据。AIC/BIC 指标可以用来评估模型的优劣。
  • 预测结果显示了未来的乘客数量,并且预测结果与观测数据的季节性波动相一致,表明模型的预测效果良好。

通过这次学习,您掌握了如何构建和应用 SARIMA 模型来处理具有季节性模式的时间序列数据。SARIMA 模型在实际应用中非常有用,特别是在预测那些具有周期性模式的数据时,如销售数据、气象数据等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/414639.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sed awk 第二版学习(二)—— 正则表达式语法

目录 一、表达式 二、成行的字符 1. 反斜杠 2. 通配符 3. 编写正则表达式 4. 字符类 (1)字符的范围 (2)排除字符类 (3)POSIX 字符类补充 5. 重复出现的字符 6. 匹配单词 7. gres 替换脚本 8. …

超越卷积滤波器,HyCoT利用Transformer捕捉高光谱图像的全局依赖性 !

近年来,基于学习的高光谱图像(HSI)压缩模型的开发引起了大量关注。现有的模型主要使用卷积滤波器,仅捕捉局部依赖性。 此外,它们通常会带来高昂的训练成本,并具有较大的计算复杂性。 为了解决这些问题&…

upload-labs通关攻略

Pass-1 这里上传php文件说不允许上传 然后咱们开启抓包将png文件改为php文件 放包回去成功上传 Pass-2 进来查看提示说对mime进行检查 抓包把这里改为image/jpg; 放包回去就上传成功了 Pass-3 这里上传php文件它说不允许上传这些后缀的文件 那咱们就可以改它的后缀名来绕过…

KinectFusion

1.KinectFusion 笔记来源: 论文地址:KinectFusion: Real-time 3D Reconstruction and Interaction Using a Moving Depth Camera* 项目地址:github/KinectFusion [1] 截断符号距离 | TSDF, Truncated Signed Distance Function 本篇对Kinec…

工业储能柜内部运行状态监测装置

工商业储能是用户侧储能的主要应用之一,其核心场景包括峰谷套利、需(容)量管理、应急备电、动态增容和需求侧响应。为了实现这些功能并确保储能系统的安全、可靠与经济运行,储能集成厂家必须关注多个方面,其中储能设备…

WPF ToolkitMVVM IOC IServiceConllection

用微软自带的 IOC 需要安装 using Microsoft.Extensions.DependencyInjection; using System.Configuration; using System.Data; using System.Windows;namespace WpfApp3 {/// <summary>/// Interaction logic for App.xaml/// </summary>public partial class…

BITCN合集(BITCN 、BITCN-GRU、BITCN-BIGRU、BITCN-LSTM、BITCN-BILSTM、BITCN-SVM)

BITCN合集&#xff08;BITCN 、BITCN-GRU、BITCN-BIGRU、BITCN-LSTM、BITCN-BILSTM、BITCN-SVM&#xff09; BITCN合集&#xff08;BITCN 、BITCN-GRU、BITCN-BIGRU、BITCN-LSTM等&#xff09;代码获取戳此处代码获取戳此处代码获取戳此处 BITCN&#xff08;双向时间卷积神经网…

uniapp引入最新版Animate.css及使用示例

亲测可用,不好用请移至评论区揍我 动画库官网:https://animate.style/ cdn地址:https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css(截至目前最新版为:v4.1.1) 1. 将css下载后导入项目static目录中 2. 重要!修改下载的css文件内容 文件内容如…

vue脚手架路由快速入门

这里写目录标题 路由 router路由插件的引用离线在线CDN 单独路由使用案例项目中如何定义路由1\安装路由2\创建路由文件router.js以及创建相关文件3\应用插件main.js4\实现切换<router-link></router-link>5\展示位置 <router-view></router-view> 嵌套…

在线绘制哑铃图(dumbbell chart)展示基因拷贝数变异(CNV)

导读&#xff1a; 哑铃图的名称来源于其形状&#xff0c;它看起来像一个哑铃&#xff0c;有两个圆形的“重量”在两端&#xff0c;通过一根“杆”连接。常用于展示两个或多个数据集之间的差异。本文介绍了如何使用哑铃图展示基因的拷贝数变异。 Journal of Translational Medi…

UDP简单聊天室创建

目录 一. 服务端模块实现 二. 处理聊天消息模块实现 三. 调用服务端模块实现 四. 客户端模块实现 五. 效果展示 本文介绍了如何用UDP创建一个简单的聊天室。 一. 服务端模块实现 服务端仍然沿用我们前面的思想&#xff08;高内聚低耦合&#xff09;&#xf…

C语言小tip之函数递归

hello&#xff0c;各位小伙伴们今天我们来学习一下函数递归。 什么是函数递归呢&#xff1f;简单来说就是函数自己来调用自己。函数递归的主要思想是把大事化小&#xff0c;递归包含两层方面&#xff1a;1、递推 2、回归 在使用函数递归的时候要注意包含两个限制条件&#…

Linux 软硬连接

1. 硬链接 实际上并不是通过文件名来找到磁盘上的文件&#xff0c;而是通过inode。在linux中可以让多个文件名对应于同一个 inode&#xff0c;而这种方式就是建立硬链接。硬链接是文件系统中的一种链接类型&#xff0c;它创建了文件的一个额外的目录项&#xff0c;但不占用额外…

全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用

SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型&#xff0c;它综合考虑了土壤-水分-大气以及植被间的相互作用&#xff1b;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程&#xff0c;使其能够精确的模拟土壤中水分的运动&#xff0c;而且耦合了W…

EmguCV学习笔记 C# 7.1 角点检测

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

Ubuntu22.04安装 docker和docker-compose环境

Docker简介 Docker 是一个开源的应用容器引擎&#xff0c;它使开发者能够打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口&#xff08;…

蓝色炫酷碎粒子HTML5导航源码

源码介绍 蓝色炫酷碎粒子HTML5导航源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果预览 源码获取 蓝色炫酷碎粒…

Halcon提取边缘线段lines_gauss 算子

Halcon提取边缘线段lines_gauss 算子 edges_color_sub_pix和edges_sub_pix两个算子使用边缘滤波器进行边缘检测。还有一个常用的算子lines_gauss算子&#xff0c;也可以用于提取边缘线段&#xff0c;它的鲁棒性非常好&#xff0c;提取出的线段类型是亚像素精度的XLD轮廓。其原…

LLM训练、精调与加速:大型语言模型的高效开发与应用策略

创作不易&#xff0c;您的关注、点赞、收藏和转发是我坚持下去的动力&#xff01; 大家有技术交流指导、论文及技术文档写作指导、项目开发合作的需求可以私信联系我 LLM&#xff08;大型语言模型&#xff09;的训练、精调和加速是当前人工智能研究和应用中的重要话题。下面将…

JVM垃圾判定算法

垃圾收集技术是Java的一堵高墙。Java堆内存中存放着几乎所有的对象实例&#xff0c;垃圾收集器在对堆内存进行回收前&#xff0c;第一件事情就是要确定这些对象中哪些还存活&#xff0c;哪些已经死去&#xff08;即不可能再被任何途径使用的对象&#xff09;。也就是判定垃圾。…