当前位置: 首页 > news >正文

用Python实现时间序列模型实战——Day 18: 时间序列中的季节性与周期性预测

一、学习内容
1. 季节性调整与周期性预测

季节性调整 是在时间序列分析中常用的技术,旨在去除数据中因季节性波动导致的周期性变化,使数据更易于解释和预测。通常,我们可以使用季节性分解方法来分离时间序列中的趋势、季节性和随机成分。

周期性预测 主要关注数据中的周期性模式,例如每年、每月或每季度发生的重复行为。季节性模式通常可以通过 SARIMA (季节性 ARIMA) 或 Holt-Winters 等模型进行建模。

2. 基于周期性模式的长期预测方法

基于周期性模式的预测方法,通常使用模型如 SARIMA 或 Holt-Winters 模型。这些模型可以捕捉时间序列中的季节性模式,并根据历史周期预测未来的值。

SARIMA 模型 的季节性部分通过在标准 ARIMA 模型中增加季节性自回归和移动平均成分来处理季节性波动。

Holt-Winters 模型 能够同时处理趋势、季节性和残差成分,它是非常经典的时间序列预测模型。

二、实战案例

我们将使用 Python 的 statsmodelsholtwinters 模型对带有季节性和周期性的时间序列数据进行预测。

1. 数据生成

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.tsa.holtwinters import ExponentialSmoothing# 生成模拟的时间序列数据(带有季节性和趋势)
np.random.seed(42)
n_obs = 200
time = pd.date_range(start='2000-01-01', periods=n_obs, freq='M')
trend = 0.05 * np.arange(n_obs)  # 线性趋势
seasonal = 10 * np.sin(2 * np.pi * time.month / 12)  # 季节性
noise = np.random.normal(0, 1, n_obs)
data = trend + seasonal + noise# 创建数据框
ts_data = pd.DataFrame({'Date': time, 'Value': data})
ts_data.set_index('Date', inplace=True)# 绘制时间序列
plt.figure(figsize=(10, 6))
plt.plot(ts_data['Value'], label='Original Data')
plt.title('Simulated Time Series with Seasonality and Trend')
plt.legend()
plt.show()

代码解释:

  • 我们生成了一个带有线性趋势和季节性波动的模拟时间序列。每个月的数据受到季节性波动(周期性为 12 个月)的影响,并带有噪声干扰。

结果输出:

2. 季节性分解
# 对时间序列进行季节性分解
result = seasonal_decompose(ts_data['Value'], model='additive', period=12)
result.plot()
plt.show()

代码解释:

  • 使用 seasonal_decompose 对时间序列进行分解,将其分为趋势、季节性和残差三部分。分解后的结果可以帮助我们理解时间序列的组成部分。

结果输出:

3. SARIMA 模型预测
# 使用 SARIMA 模型进行季节性预测
sarima_model = SARIMAX(ts_data['Value'], order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
sarima_fitted = sarima_model.fit()# 进行未来24个月的预测
sarima_forecast = sarima_fitted.forecast(steps=24)# 绘制SARIMA预测结果
plt.figure(figsize=(10, 6))
plt.plot(ts_data.index, ts_data['Value'], label='Original Data')
plt.plot(pd.date_range(start=ts_data.index[-1], periods=24, freq='M'), sarima_forecast, label='SARIMA Forecast')
plt.title('SARIMA Model Forecast')
plt.legend()
plt.show()

代码解释:

  • 我们使用 SARIMA 模型对数据进行建模,并预测未来 24 个月的值。SARIMA 模型能够捕捉时间序列中的趋势和季节性模式。

结果输出:

4. Holt-Winters 模型预测
# 使用 Holt-Winters 模型进行预测
hw_model = ExponentialSmoothing(ts_data['Value'], trend='add', seasonal='add', seasonal_periods=12).fit()
hw_forecast = hw_model.forecast(steps=24)# 绘制 Holt-Winters 预测结果
plt.figure(figsize=(10, 6))
plt.plot(ts_data.index, ts_data['Value'], label='Original Data')
plt.plot(pd.date_range(start=ts_data.index[-1], periods=24, freq='M'), hw_forecast, label='Holt-Winters Forecast')
plt.title('Holt-Winters Model Forecast')
plt.legend()
plt.show()

代码解释:

  • 使用 Holt-Winters 模型进行建模,预测未来 24 个月的趋势和季节性。Holt-Winters 模型同样适合处理含有季节性和趋势的时间序列。

结果输出:

三、结果分析
1. 季节性分解结果
  • 分解图展示了时间序列中的趋势、季节性和随机波动。趋势成分显示了时间序列的线性增长,季节性成分显示了每年的周期性波动。
2. SARIMA 模型预测
  • SARIMA 模型的预测结果展示了未来 24 个月的预测值,预测曲线捕捉了季节性波动,并跟随原始数据的趋势变化。
3. Holt-Winters 模型预测
  • Holt-Winters 模型同样能够捕捉季节性和趋势,预测结果展示了与 SARIMA 相似的趋势和周期性变化。
四、总结

通过 SARIMA 和 Holt-Winters 模型,我们能够对带有季节性和周期性特征的时间序列数据进行长期预测。季节性分解帮助我们理解数据的组成部分,而基于周期性模式的模型能够提供准确的预测结果。

http://www.lryc.cn/news/435904.html

相关文章:

  • JavaScript ES6特性(var let const、function=>、增强表达赋值、类与对象)
  • Paddle安装详解(CPU版本)
  • PHP即刻送达同城派送小程序系统
  • RabbitMQ的Direct Exchange模式实现的消息发布案例
  • 数据结构-二叉树-基础知识
  • wangeditor——cdn引入的形式创建一个简易版编辑器——js技能提升
  • 9.11.
  • 【GeekBand】C++设计模式笔记1_介绍
  • MySQL 数据库:原理、应用与发展
  • 7.2图像旋转
  • 学学vue-2
  • 什么是 Grafana?
  • 【Prompt Engineering:思维树 (ToT)、检索增强生成 (RAG)、自动推理并使用工具 (ART)】
  • 【习题】应用/元服务上架
  • 性能测试的复习3-jmeter的断言、参数化、提取器
  • ORB-SLAM2关键点总结
  • 拱式桥安全结构健康监测解决方案
  • windows和linux安装mysql5.7.31保姆级教程
  • 如何使用 PowerShell 脚本来自动化 Windows 开发流程的教程(包括理论介绍和实践示例)
  • CTFHub技能树-信息泄露-HG泄漏
  • OpenCV结构分析与形状描述符(18)比较两个轮廓相似度的函数matchShapes()的使用
  • CCS811二氧化碳传感器详解(STM32)
  • Navicat 17 新特性 | 聚焦 MongoDB
  • openssl的使用
  • ICETEK-DM6437-AICOM—— DMA直接存储器访问设计
  • 【AcWing】快速排序的Go实现
  • 使用C++11的`std::future`和`std::promise`实现异步网络通信
  • 【C++登堂入室】类与对象(上)
  • 【西电电装实习】5. 无人机模块及作用、上位机的操作
  • 有关WSL和docker的介绍