时间序列预测建模的完整流程以及数据分析(新手科研必备)

news2025/1/15 6:45:33

一、本文介绍

本文给大家带来是时间序列建模的完整流程,大家在接触到这个领域的时候,往往都想将数据直接输入到模型中进行训练和预测,对于其中的一些参数都不太理解,这种情况是不可能得到一个好的结果的(本文的内容是我的专栏基础内容,当你拿到我写的任何一个模型无论是深度学习机器学习还是Transformer模型都需要按照本文的流程取分析才能够得到一个好的结果)无论大家是想要发论文还是将时间序列知识应用于其他领域,通过阅读本文都能够有一定的收获。在开始之前先介绍一下我的专栏,本专栏适用于任何群体其中不仅涉及基础知识的完整流程更有接近上百篇的实战案例(总有一篇适合你)本文通过ARIMA模型进行示例。

专栏目录:时间序列预测目录:深度学习、机器学习、融合模型、创新模型实战案例

专栏: 时间序列预测专栏:基础知识+数据分析+机器学习+深度学习+Transformer+创新模型​​​​​​​

下面的图片是一个读者找我调优之后的模型结果对比,大家可以看到经过处理之后同一个模型的不同结果效果真的是天差地别。 

目录

一、本文介绍

​编辑

二、时间序列建模的完整流程

三、 模型选取和数据集

3.1 ARIMA模型

3.2数据集介绍

​四、时间序列建模

4.1 数据获取

4.2 数据预处理

4.2.1 处理数据中的Nan值

4.2.2 检查数据中的异常值和处理

4.3  数据分析

4.3.1 趋势性分析 

4.3.2 季节性分析 

4.3.3 周期性分析 

4.3.4 ACF和PACF

 4.3.5 平稳性检验

 4.4 模型选择

4.5 划分数据集

4.6 模型训练

4.7 模型评估

五、 完整代码

 六、全文总结


二、时间序列建模的完整流程

时间序列预测建模的完整过程通常包括以下步骤:

1. 数据收集:

  • 首先收集时间序列数据。这些数据应该是按时间顺序排列的连续观察值(有过挺多人问我说我的数据时间不连续可以么,我觉得是不可以如果有这种不连续的情况我建议你提高时间单位从而避免这个情况)。

2. 数据预处理:

  •    数据清洗:处理缺失值。
  •    异常值数据转换:如对数转换,归一化等,以稳定数据的方差(此处应该是两部分包括异常之检测和异常值处理)。

3. 数据分析:分析数据的特征,如季节性、趋势、周期性等,这一步是重要的你的模型的效果好坏可能百分之60来源于模型,另外的百分之40就来源于这一步

4. 模型选择:

  •    可以选择的模型包括ARIMA(自回归积分滑动平均模型)、季节性ARIMA、指数平滑、Prophet模型、机器学习模型等。
  •    还可以使用深度学习方法,如循环神经网络(RNN)、长短期记忆网络(LSTM)。
  •    同时还有这两年比较流行的Transformer模型,此方法适合想要发论文的同学

5. 划分数据集:将数据集划分为测试集验证集训练集

6. 模型训练:使用训练数据集来训练选定的模型。

7. 模型评估:

  •     在测试集上评估模型性能。
  •     常用的评估指标包括均方误差(MSE)、均方根误差(RMSE)、平均绝对误差(MAE)等。

8. 参数调优:根据模型在测试集上的表现调整参数,以提高预测准确性。

大家需要注意的是时间序列预测是一个动态过程,可能需要多次迭代来优化模型,我在某些实际应用中一个模型甚至要调优上百次才能最终上到实际生产中。

三、 模型选取和数据集

3.1 ARIMA模型

我给大家讲解用的模型是ARIMA模型,这个模型可以算是时间序列领域最重要的模型之一了,先取这个模型的原因是因为它对于参数的设定是十分敏感的,不同的参选择效果可能差异很大后面会有对比给大家看。

3.2数据集介绍

我们本文用到的数据集是某个领域的交通流量数据集 ,该数据集是一个用于时间序列预测交通流量情况的,。

数据内容该数据集通常包含高峰期和非高峰期的交通流量情况记录。

时间范围和分辨率:数据按半小时为单位进行获取和记录,

以下是该数据集的部分截图->

​四、时间序列建模

4.1 数据获取

这一部分省略了估计大家都都有数据了,我们在这里就讲一下将数据读取进来的代码。

data = pd.read_csv("系统——车流量.csv", index_col=['Date'], parse_dates=['Date'])

在上面的代码中将数据集csv文件读取进来,然后将索引用'Date'列进行替代,替换为的效果为下图,可以看到我们的数据已经变成了一列,原先的Date列变为了索引,这是pandas的基础操作。

4.2 数据预处理

4.2.1 处理数据中的Nan值

moving_avg = data['Volume'].rolling(window=5, min_periods=1).mean()
data['Volume'] = data.fillna(moving_avg)

上面这两句代码是用来处理数据中存在的Nan值,如果数据中存在Nan值是不可以的往往都会导致报错或者结果异常的情况。 

4.2.2 检查数据中的异常值和处理

# 假设 data 是你的 DataFrame,column_name 是需要处理的列名
data['moving_avg'] = data['Volume'].rolling(window=5, min_periods=1).mean()

# 计算 Z-Score
data['z_score'] = (data['Volume'] - data['Volume'].mean()) / data['Volume'].std()

# 将异常值替换为移动平均值
data.loc[data['z_score'].abs() > 1.5, 'Volume'] = data['moving_avg']

这一部分代码是用Z-score检测出异常值同时用移动平均的思想将异常值进行了替换,从而保证我们数据的正常,不受那些因为异常事件导致的特殊值影响。 

4.3  数据分析

这一步就是十分重要的了,分析数据的特征,如季节性、趋势、周期性等(这一步是重要的你的模型的效果好坏可能百分之60来源于模型,另外的百分之40就来源于这一步)。

首先我们来看经过上面的处理之后的数据图像为下图所示->

# 可视化原始数据
data.plot()
plt.title('original data')
plt.show()

 总结:从这张原始的图片上我们可以看出数据又明显的周期性存在单位大概是50个数据左右为一个单位。

4.3.1 趋势性分析 

我们再来看去趋势性分析的图像如下->

# 趋势分析
decomposition = seasonal_decompose(data['Volume'], model='multiplicative', period=50)  # 或者model='multiplicative'取决于数据
trend = decomposition.trend
trend.plot()
plt.title('trend')
plt.show()

 总结:从这张趋势图上其中显示数据存在波动,但无明显的长期上升或下降趋势。我们看到数据点在某个水平线附近上下波动,这可能表示一个周期性的波动模式,而不是线性或单调的趋势。

4.3.2 季节性分析 

下面的图片是季节性分析图像-> 

# 季节性分析
seasonal = decomposition.seasonal
seasonal.plot()
plt.title('season')
plt.show()

总结:基于季节性分量图像,我们可以使用横坐标的数字来估计一个季节周期。通常,一个季节周期是指从一个峰值到下一个相同峰值的距离,或者从一个谷值到下一个相同谷值的距离。

通过观察季节性分量图像,我们可以估计:

  • 从一个峰值到下一个峰值(或谷值到谷值)的距离看起来相对一致。
  • 如果我们可以从图像上精确读取两个相邻峰值或谷值的横坐标值,就可以通过它们的差来估算周期长度。

比如,如果第一个峰值在横坐标50处,下一个峰值在横坐标100处,那么季节周期就是100 - 50 = 50个数据点。

4.3.3 周期性分析 

下面的图片是周期性分析图像->

# 周期性分析(残差)
residual = decomposition.resid
residual.plot()
plt.title('Periodicity (residual)')
plt.show()

总结:周期性残差的波动表明除了季节性之外,可能还存在其他非固定周期的影响因素,这些可能是因为其他因素引起的所以我们最好可以增加一些其它变量。 

4.3.4 ACF和PACF

下面的图片是ACF和PACF的图像->

# 自相关和偏自相关图
fig, ax = plt.subplots(2, 1, figsize=(12,8))
sm.graphics.tsa.plot_acf(data['Volume'].dropna(), lags=40, ax=ax[0])
sm.graphics.tsa.plot_pacf(data['Volume'].dropna(), lags=40, ax=ax[1])
plt.show()

 总结:从自相关函数(ACF)和偏自相关函数(PACF)图中,我们可以得出以下结论:

 自相关函数 (ACF):

  •   ACF 图显示出显著的逐渐减小的尾部。这通常表明时间序列可能是非平稳的,并可能包含趋势或季节性成分。
  •   随着滞后数的增加,自相关系数逐渐下降,但在整个图上仍然显著不为零,这意味着时间序列数据可能具有长期依赖关系。

偏自相关函数 (PACF):

  •   PACF 图在第一个滞后处显示了一个显著的尖峰,之后迅速下降至不显著,这是典型的AR(1)过程的特征,意味着一个数据点主要受到它前一个数据点的影响。
  •   在第一滞后之后,大多数滞后的PACF值都不显著(即在蓝色置信区间内),这表明一个阶的自回归模型可能足以捕捉时间序列的相关结构。

综上所述,ACF和PACF的形态表明,时间序列可能适合采用带有差分的自回归模型来建模,如我们本文说的ARIMA模型。通常,这种ACF和PACF的组合会建议我们首先尝试差分时间序列以获得平稳性,然后基于PACF的结果拟合一个AR(1)模型或者根据ACF的衰减模式可能需要考虑更多的AR或MA项。

 4.3.5 平稳性检验

# 平稳性检测
adf_test = adfuller(data['Volume'])
print('ADF 统计量: ', adf_test[0])
print('p-值: ', adf_test[1])

总结: Augmented Dickey-Fuller (ADF) 测试的结果提供了是否拒绝时间序列具有单位根的依据,即时间序列是否是非平稳的。ADF测试的两个关键输出是:

1. ADF 统计量:这是一个负数,它越小,越有可能拒绝单位根的存在。
2. p-值:如果p-值低于给定的显著性水平(通常为0.05或0.01),则拒绝单位根的假设,表明时间序列是平稳的。

在我们的本次测试上的ADF测试结果中:

  • ADF 统计量为 -4.8454501013044675,这是一个相对较小的负值。
  • p-值为 4.4482852446677935e-05,即大约为 0.0000445。

因为 p-值远小于0.05,我们有强有力的证据拒绝单位根的存在假设,表明时间序列是平稳的。这意味着时间序列数据中很可能不存在随时间变化的趋势或季节性成分,或者已经通过适当的变换(如差分)被去除。

结合前面的ACF和PACF图,我们可以推断这个时间序列数据经过差分或其他转换后可能已经是平稳的,并且可能适合使用ARIMA或类似的自回归模型来进行建模和预测。

 4.4 模型选择

经过前面的分析,结合ACF和PACF图,我们可以推断这个时间序列数据经过差分或其他转换后可能已经是平稳的,并且可能适合使用ARIMA或类似的自回归模型来进行建模和预测,所以我们选择ARIMA模型来进行预测,同时我们选用autoarima进行自动拟合。

4.5 划分数据集

train_ds = data['Volume'][:int(0.9 * len(data))]
test_ds = data['Volume'][-int(0.1 * len(data)):]

我们将9成的数据用来训练模型进行拟合,1成的数据用来测试我们的模型拟合效果。 

4.6 模型训练

我们将从上面分析过来的结果输入的auto_arima里面进行模型的拟合,控制台的拟合效果如图所示。

model = auto_arima(train_ds, trace=True, error_action='ignore', suppress_warnings=True, seasonal=True, m=50,
                   stationary=False, D=2)

model.fit(train_ds)

4.7 模型评估

我们训练完模型拟合后我们进行预测和结果可视化,如下图所示->

forcast = model.predict(n_periods=len(test_ds))
# forcast = pd.DataFrame(forcast, index=test_ds.index, columns=['Prediction'])

rms = sqrt(mean_squared_error(test_ds, forcast))
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(15, 7))
# plt.figure('Forecast')
plt.title("forecast value as real")
plt.plot(range(len(train_ds)), train_ds, label='Train')
plt.plot(range(len(train_ds), len(train_ds) + len(test_ds)), test_ds.values, label='Test')
plt.plot(range(len(train_ds), len(train_ds) + len(test_ds)), forcast.values, label='Prediction')
plt.legend()
plt.show()

五、 完整代码

项目的完整代码如下,复制粘贴修改文件之后即可运行。

from math import sqrt
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from pmdarima import auto_arima
from sklearn.metrics import mean_squared_error
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.tsa.stattools import adfuller

data = pd.read_csv("系统——车流量.csv", index_col=['Date'], parse_dates=['Date'])

moving_avg = data['Volume'].rolling(window=5, min_periods=1).mean()
data['Volume'] = data.fillna(moving_avg)

# 假设 data 是你的 DataFrame,column_name 是需要处理的列名
data['moving_avg'] = data['Volume'].rolling(window=5, min_periods=1).mean()

# 计算 Z-Score
data['z_score'] = (data['Volume'] - data['Volume'].mean()) / data['Volume'].std()
data.reset_index(drop=True,inplace=True)
# 将异常值替换为移动平均值
data.loc[data['z_score'].abs() > 1.5, 'Volume'] = data['moving_avg']

# 可视化原始数据
data.plot()
plt.title('original data')
plt.show()

# 趋势分析
decomposition = seasonal_decompose(data['Volume'], model='multiplicative', period=50)  # 或者model='multiplicative'取决于数据
trend = decomposition.trend
trend.plot()
plt.title('trend')
plt.show()

# 季节性分析
seasonal = decomposition.seasonal
seasonal.plot()
plt.title('season')
plt.show()

# 周期性分析(残差)
residual = decomposition.resid
residual.plot()
plt.title('Periodicity (residual)')
plt.show()

# 自相关和偏自相关图
fig, ax = plt.subplots(2, 1, figsize=(12,8))
sm.graphics.tsa.plot_acf(data['Volume'].dropna(), lags=40, ax=ax[0])
sm.graphics.tsa.plot_pacf(data['Volume'].dropna(), lags=40, ax=ax[1])
plt.show()

# 平稳性检测
adf_test = adfuller(data['Volume'])
print('ADF 统计量: ', adf_test[0])
print('p-值: ', adf_test[1])

train_ds = data['Volume'][:int(0.9 * len(data))]
test_ds = data['Volume'][-int(0.1 * len(data)):]



model = auto_arima(train_ds, trace=True, error_action='ignore', suppress_warnings=True, seasonal=True, m=50,
                   stationary=False, D=2)

model.fit(train_ds)
forcast = model.predict(n_periods=len(test_ds))
# forcast = pd.DataFrame(forcast, index=test_ds.index, columns=['Prediction'])

rms = sqrt(mean_squared_error(test_ds, forcast))
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(15, 7))
# plt.figure('Forecast')
plt.title("forecast value as real")
plt.plot(range(len(train_ds)), train_ds, label='Train')
plt.plot(range(len(train_ds), len(train_ds) + len(test_ds)), test_ds.values, label='Test')
plt.plot(range(len(train_ds), len(train_ds) + len(test_ds)), forcast.values, label='Prediction')
plt.legend()
plt.show()

 六、全文总结

到此本文已经全部讲解完成了,希望能够帮助到大家,在这里也给大家推荐一些我其它的博客的时间序列实战案例讲解,其中有数据分析的讲解就是我前面提到的如何设置参数的分析博客,最后希望大家订阅我的专栏,本专栏均分文章均分98,并且免费阅读。

专栏回顾->时间序列预测专栏——包含上百种时间序列模型带你从入门到精通时间序列预测

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于 Flink CDC 打造企业级实时数据集成方案

本文整理自Flink数据通道的Flink负责人、Flink CDC开源社区的负责人、Apache Flink社区的PMC成员徐榜江在云栖大会开源大数据专场的分享。本篇内容主要分为四部分: CDC 数据实时集成的挑战Flink CDC 核心技术解读基于 Flink CDC 的企业级实时数据集成方案实时数据集…

实现centos7与windows共享文件夹

第一步 点击设置 第二步 第三步 第四步 让共享文件夹挂载到hgfs目录下 输入如下命令: sudo vmhgfs-fuse .host:/ /mnt/hgfs -o subtypevmhgfs-fuse,allow_other完成共享

电脑桌面便签工具选择哪一款?

随着互联网时代的不断发展,电脑成为日常工作及办公中必不可少的工具,通过电脑这款工具,大家可以更好的进行工作、学习等方面的交流;电脑桌面便签由于可以为大家整合一些工作及学习方面的备忘事项及笔记等,因而深受大家…

智慧社区建设管理方案,AI技术让小区更智能、更舒适

一、背景与需求分析 智慧社区是充分应用大数据、云计算、人工智能等信息技术手段,整合社区各类服务资源,打造基于信息化、智能化管理与服务的社区治理新形态。根据《关于深入推进智慧社区建设的意见》,到2025年,基本构建起网格化…

数据库数据恢复—MongoDB数据库文件拷贝出现错误的数据恢复案例

MongoDB数据库数据恢复环境: 一台Windows Server操作系统的虚拟机,虚拟机上部署有MongoDB数据库。 MongoDB数据库故障&检测: 在未关闭MongoDB服务的情况下,工作人员将MongoDB数据库文件拷贝到其他分区,然后将原数…

【idea】解决idea 执行maven build总下载 Downloading maven-metadata.xml文件

可以看到如下日志中打印了执行的命令行,其中包含 --update-snapshots,是强制更新的意思。 日志内容如下: D:\env\jdk1.8.0_261\bin\java.exe --update-snapshots -s D:\env\apache-maven-3.8.6\conf\settings.xml -Dmaven.repo.localD:\env\…

元素的点击操作

元素的点击操作 .click 语法 // 单击某个元素 .click()// 带参数的单击 .click(options)// 在某个位置点击 .click(position)// 在某个位置点击,且带参数 .click(position, options)// 根据页面坐标点击 .click(x, y)// 根据页面坐标点击,且带参数 .c…

三极管基础知识

三极管 基本概念应用电路 基本概念 三极管 NPN 和PNP 电流方向 PNP是从e 流向 b c NPN是从 b c流向e 应用电路 箭头出发方向的电极比箭头指向方向的电极,高0.7v才导通。 NPN控制下游是否接到地,PNP控制上游的电源能否接过来。

功率放大器在无线收发系统中的作用

功率放大器在无线收发系统中也扮演着至关重要的角色。无线通信是一种通过电磁波传输信息的技术,它具有便捷、灵活、广覆盖等优势,在现代社会得到了广泛应用。而功率放大器则是无线收发系统中的核心组件之一,主要用于增强信号的功率和距离。下…

印刷企业实施WMS仓储管理系统需要哪些硬件设施

随着科技的快速发展,印刷企业的运营模式也正在经历着变革。为了提升效率,降低成本,并实现精细化管理,越来越多的印刷企业开始引入WMS仓储管理系统解决方案。然而,要成功实施这样的系统,必要的硬件设施是不可…

C#语言高阶开发

目录 数据结构 集合 动态数组ArrayList 习题:声明一个Monster类,有一个Attack方法,用一个ArrayList去封装Monster的对象,装10个,遍历monster的list让他们释放攻击方法 哈希表HashTable 创建一个武器类,有一个属性叫做id,每个…

Apache配置文件详解

引言: Apache是一种功能强大的Web服务器软件,通过配置文件可以对其行为进行高度定制。对于初学者来说,理解和正确配置Apache的配置文件是非常重要的。本文将详细解释Apache配置文件的各个方面,并给出一些入门指南,帮助读者快速上手。 1、主配置文件(httpd.conf): 主…

集群路径规划学习(一)之EGO-swarm仿真

代码调试与编译 源代码下载 https://github.com/ZJU-FAST-Lab/ego-planner-swarm/tree/master 按照代码要求配置安装环境 sudo apt-get install libarmadillo-dev 文件对应拷贝与调整 新建工作空间文件夹 XF_EGOworkspace 新建src 在src文件夹下开启终端,输…

(c语言)偶然发现的易错点

1.scanf函数中的占位符是严格调用的&#xff0c;占位符是什么类型就只会读取相应类型。 2.printf函数和参数调用时则会发生截取和扩展来转化为相应类型 &#xff08;1&#xff09;字符型参数以整形输出 #include<stdio.h> int main() {char p a;printf("%d&quo…

一个工具让你明白“万丈高楼平地起”,拒绝重复造轮子!

大家在公司工作当中是不是很多时间装环境很麻烦&#xff0c;一个项目要上线了&#xff0c;开始网上搜了一边又一遍的环境搭建教程&#xff1f;等到下一个项目要上线了&#xff0c;又上网上搜了一边又一遍的环境搭建教程。关键天花乱坠的互联网&#xff0c;找不到很靠谱的呀。有…

【腾讯云云上实验室-向量数据库】腾讯云VectorDB:深度学习场景下的新一代数据存储方案

引言 ​  在深度学习领域的实践中&#xff0c;一般会涉及到向量化处理的数据&#xff0c;如图像、文本、音频等&#xff0c;这些数据的存储和检索对于许多深度学习任务至关重要。传统的关系型数据库和NoSQL数据库在存储和检索这类大规模向量数据时&#xff0c;通常不能满足高…

铸就匠心,打造西部最具权威的行业商会组织

中国商报陕西报道&#xff08;记者 朱清平&#xff09;西安市五金机电商会(以下简称商会)第二届一次会员代表大会暨新任理事、监事就职典礼于11月17日在西安经开洲际酒店召开。 商会于2018年10月成立,在5年的发展中,依托“一带一路”发展的“快车道”,通过新丝路国际工业品数字…

Vatee万腾的数字化探险:Vatee科技创新勾勒新的独特轨迹

在数字化时代的浪潮中&#xff0c;Vatee万腾以其强大的科技创新力量&#xff0c;开启了一场引人瞩目的数字化探险之旅。这不仅是一次技术的探索&#xff0c;更是对未知领域的大胆冒险&#xff0c;为科技的未来勾勒出一条独特的轨迹。 Vatee的数字化探险并非仅仅局限于技术的提升…

Redis面试内容,Redis过期策略,Redis持久化方式,缓存穿透、缓存击穿和缓存雪崩,以及解决办法

文章目录 一、redis什么是RedisRedis使用场景1、缓存2、数据共享[分布式](https://so.csdn.net/so/search?q分布式&spm1001.2101.3001.7020)3、分布式锁4、全局ID5、计数器6、限流7、位统计 Redis有5中数据类型&#xff1a; SSHLZRedis中一个key的值每天12点过期&#xff…

对比多家互联网医院系统技术代码:数字医疗服务的背后

1. 在线问诊模块 1.1 A医疗系统 A医疗系统采用WebSocket实现实时通信&#xff0c;使用Node.js和Socket.io来建立WebSocket连接&#xff1a; // 服务器端 Node.js 代码 const express require(express); const http require(http); const socketIo require(socket.io);const…