一文搞懂Python时间序列预测(步骤,模板,python代码)

news2024/11/25 4:57:22

预测包括,数值拟合,线性回归,多元回归,时间序列,神经网络等等

对于单变量的时间序列预测:模型有AR,MA,ARMA,ARIMA,综合来说用ARIMA即可表示全部。

数据和代码链接:数据和Jupyter文件

以预测美国未来10年GDP的变换情况为列:

目录

第一步进行数据导入

第二步进行平稳序列分析

​第三步进行不平稳序列的差分运算

第四步进行模型定阶和模型选择及拟合

​第五步进行模型结果分析和模型检验 

第六步进行模型预测

PS:自动化AUTO-ARIMA的比较


ARIMA流程图如下:

第一步进行数据导入:


    观察要预测变量的数据情况,去除杂数据,得到数据本身的属性如:大小,类型等

import pandas as pd,numpy as np
from matplotlib import pyplot as plt

#加载数据,sheet_name指定excel表的数据页面,header指定指标column属性,loc去除杂数据,可选:parse_dates=[''],index_col='',use_cols=['']
df=pd.read_excel('./data/time1.xls',sheet_name='数据',header=1).loc[1:,:]

#DateFrame索引重置
df=df.set_index('DATE')#df.set_index('DATE',inplace=True)

#查看前5行
print(df.head(5))

#查看列索引
print(df.columns)#print(df.keys())

#查看表的维度
print(df.shape)

#查看行索引
print(df.index)

#np.array()  array1.reshape(,)  df.values.astype(int).tolist() np.vstack((a1,a2))  np.hstack((a1,a2))  round()  iloc

#时间索引拆分
# dates=pd.date_range(start='1991-01-01',end='2007-08-01',freq='MS')#日期取值和格式转换,MS代表每月第一天
# years=[d.strftime('%Y-%m') for d in dates][0:200:25]
# years.append('2007-09')

结果如下:

第二步进行平稳序列分析:


    我们研究分析的时间序列,即面板数据,只有是宽平稳的才有研究意义,如果是非平稳序列需要将其差分转换为平稳序列才能进行分析,
    对于严平稳序列,性质不变化,即序列为白噪声序列,这样的序列没有研究意义。
    
    所以这里拿到GDP的时间序列数据后,先进行原序列的白噪声检验,利用LB统计量,若p值小于显著水平a=0.05,即认为原序列为非白噪声
    序列,有研究的意义。
    
    接着画时序图,主观上判断GDP时间序列的平稳情况,若呈现明显的趋势性,则为非平稳序列;若没有明显趋势,或者出现你不好判断平
    稳的情况,这时候你需要借助ADF单位根统计量来进行辅助判断它是否平稳。对于ADF统计量,你可以比较统计量的值来判断,也可以比较
    p值来判断,如显著水平a=0.05时候,如果你变量的ADF统计量小于a=0.05对于的ADF统计量,则说明该变量对应的时间序列为平稳序列;
    还一种更为直接的方法是,只需要判断该变量的p值如果小于0.05,则也说明为平稳序列。
   

plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
plt.rc('font',family='SimHei')
plt.style.use('ggplot')

df.plot(secondary_y=['CS','INV','P_GDP','GOV_NET'])#单个指标时序图 df['CS'].plot()
plt.xlabel('Date')
plt.ylabel('Value')
plt.title('Time Series Plot')
#plt.grid()
plt.show()

from statsmodels.tsa.stattools import adfuller# ADF检验

for i in df.columns:
    data=df[i]
    print(f'{i}的单位根检验')
    result = adfuller(data)#默认情况下,regression参数为'c',表示使用包含截距项的回归模型。
    print('ADF Statistic: %f' % result[0])#ADF统计量
    print('p-value: %f' % result[1])#p值
    print('Critical Values:')#在置信水平下的临界值
    for key, value in result[4].items():
        print('\t%s: %.3f' % (key, value))
    print()

代码结果:


第三步进行不平稳序列的差分运算:


    一般时间序列的差分不会超过三阶,对原始数据进行差分运算,重复第二步的时序图和ADF单位根检验操作,若发现差分后的序列为平稳
    序列,则记下差分的阶数,这里GDP的差分阶数1,通过了平稳序列检验。再次对差分后的序列进行白噪声检验,若通过为非白噪声序列,
    则进行下一步操作。
    

#差分时序图
diff_data = df.diff(periods=1).dropna()# 创建一阶差分的时间序列,加上dropna()后续不需要执行[1:]
#print(diff_data)

diff_data.plot()
plt.xlabel('Date')
plt.ylabel('Value')
plt.title('Time Series Plot')
#plt.grid()
plt.show()

for i in diff_data.columns:
    data=diff_data[i]#Series索引选取,一阶差分第一个数据为NA
    
    print(f'{i}的单位根检验')
    result = adfuller(data)#结果对应位置的数据需要自己判断是什么含义
    print('ADF Statistic: %f' % result[0])#ADF统计量
    print('p-value: %f' % result[1])#p值
    print('Critical Values:')#在置信水平下的临界值
    for key, value in result[4].items():
        print('\t%s: %.3f' % (key, value))
    print()

from statsmodels.stats.diagnostic import acorr_ljungbox

#这里为一阶差分后的平稳序列进行白噪声检验,lags为1,否则lags为0,这里拿上述的GDP指标进行
lags = [1,4,8,16,32]

print('差分序列的白噪声检验结果为:'+'\n',acorr_ljungbox(diff_data['GDP'], lags))  # 返回统计量和p值,这里的lags对应差分阶数

print('原始数据序列的白噪声检验结果为:'+'\n',acorr_ljungbox(df['GDP'], lags))

代码结果如下:

第四步进行模型定阶和模型选择及拟合:


    模型定阶先采用自相关图和偏自相关图进行初步判断:
           自相关系数                偏自相关系数             差分
    AR             拖尾                          p阶截尾                      0
    MA            q阶截尾                    拖尾                            0
    ARMA       拖尾                          拖尾                            0
    ARIMA      拖尾                          拖尾                            d
    总之,上述的模型都可以用ARIMA(p,d,q)来实现,AR,MA,ARMA都是ARIMA的特殊情况。
    
    对于拖尾和截尾的经验判断:
    拖尾:负指数单调收敛到0,或者呈现余弦式衰减
    截尾:迅速衰减到0,并且在0附近波动
    截尾比拖尾趋近于0更加迅速,截尾在后期不会再有明显的增加
    
    在利用图表进行初步判断后,依旧无法拿准模型的阶数,可以利用AIC和BIC准则进行辅助判断,或者叫做优化。比如我判断模型的阶数可能为
    2,1,4,或者3,1,3,这时候我拿不准,你可以先做ARIMA(2,1,4),如果发现后续的模型显著性检验和参数检验都通过了,那么你可以直接
    利用ARIMA(2,1,4)进行预测并得到结论,但你或许也去尝试附近的几个阶数,发现ARIMA(3,1,3),ARIMA(2,1,3)等等也通过了,但是ARIMA
    (3,1,3)的AIC和BIC的值是最小的,即该模型的拟合精度更高,是一个相对最优的模型,这一步便是模型的优化。
    
    这边的定阶和优化在python里的实现是:从q为0到(数据长度/10),从p为0到(数据长度/10),一般阶数不会超过(数据长度/10);
    然后进行q*p次模型拟合,利用模型拟合的结果比较AIC和BIC的值,BIC值越小越小的那个模型就是相对最优模型,再用该模型的阶数作为
    最终模型拟合的阶数。
    

#生成自相关图,偏自相关图
from statsmodels.graphics.tsaplots import plot_acf,plot_pacf

fig, ax = plt.subplots(figsize=(5, 4))
plot_acf(diff_data['GDP'],ax=ax)#可以换成df的数据,这里用一阶差分数据得到平稳序列
    
ax.set_title("Autocorrelation Plot")
lags=list(range(24))
ax.set_xticks(lags)#这里把x坐标刻度变更精细,加网格图更方便,xticklabels替换标签
ax.set_xlabel("Lag")
ax.set_ylabel("Autocorrelation")
ax.grid(alpha=0.5)
plt.legend(['GDP'])#这里区别直接放入df.columns[i],如果是多字符如‘CS’,这样会被认为是一个序列,拆成C和S的图例
plt.show()
    
fig, ax = plt.subplots(figsize=(5, 4))
lags=list(range(24))
ax.set_xticks(lags)#这里把x坐标刻度变更精细,加网格图更方便,xticklabels替换标签
plot_pacf(diff_data['GDP'], ax=ax,method='ywm')#ywm替换默认的yw,去除警告
ax.set_xlabel('Lags')
ax.set_ylabel('Partial Autocorrelation')
ax.grid(alpha=0.5)
plt.legend(['GDP'])
plt.show()

import warnings
warnings.filterwarnings("ignore")
import statsmodels.api as sm


#diff_data['GDP'].values.astype(float),这里发现Serise的dtype为object,模型用的应该为float或者int类型,需要注意原数据的数据类型是否一致

Min=float('inf')
for i in range(0,6):#AIC,BIC最小找到p,q阶数来定阶,从0开始定阶是否可行??
    for j in range(0,6):
        result=sm.tsa.ARIMA(df['GDP'].values.astype(float),order=(i,1,j)).fit()
        print([i,j,result.aic,result.bic])
        if result.bic<Min:
            Min=result.bic
            best_pq=[i,j,result.aic,result.bic]
print(f'最优定阶为{best_pq}')

代码结果:


第五步进行模型结果分析和模型检验 

    模型检验分为模型参数检验和模型显著性检验。

    模型显著性检验:即残差的白噪声检验,若残差为白噪声序列,即原序列信息提取充分,看LB统计量,python中模型结果的LB统计量
    即为残差的LB统计量,若p值小于0.05,则为非白噪声序列,若p值大于0.05,则说明残差为白噪声序列,这是我们想要的结果。
    这里你可以单独拿出模型的残差值,自己绘制残差的时序图,QQ图,正态分布图,或者自己进行白噪声检验辅助判断。白噪声序列即
    服从正态分布,时序图是平稳波动,QQ图上的数值点在对角线附近。
    
    模型的参数检验:检验每一个未知参数是否显著为0,检验模型是否最精简。参数不显著非零,则可以从拟合模型从剔除,看t统计量。
    
    模型结果部分解释:
    const:常数项       
    ar.L1:自回归项系数
    ma.L1:移动平均项系数
    sigma2:方差
    各个参数下的P>|z|这一行,若小于a=0.05则拒绝原假设,认为参数显著非0,即不需要简化模型。
    Ljung-Box:LB统计量,这里需要注意的是LB的P值需要>0.95,即判断残差序列为白噪声序列,小于0.05为非白噪声序列。
    Jarque-Bera:JB统计量   
    Heteroskedasticity检验的结果表明方差稳定情况

Result=sm.tsa.ARIMA(df['GDP'].values.astype(float),order=(best_pq[0],1,best_pq[1])).fit()
print(Result.summary())  #显示模型的所有信息

print(len(Result.resid))
#print(Result.resid)这里观察到残差的第一项为原数据的1239.5,即差分数据不管第一项,这里需要调整残差的观测

#这里就可以观察到原始模型的结果LB统计量和这里的白噪声检验是一致的,p>0.05,即认为残差为白噪声序列,原序列信息提取充分。
lags = [1,4,8,16,32]
print('差分序列的白噪声检验结果为:'+'\n',acorr_ljungbox(Result.resid[1:], lags))

## 查看模型的拟合残差分布
fig = plt.figure(figsize=(12,5))
ax = fig.add_subplot(1,2,1)
plt.plot(Result.resid[1:])
plt.title("ARIMA(2,1,1)残差曲线")

## 检查残差是否符合正太分布
ax = fig.add_subplot(1,2,2)
sm.qqplot(Result.resid[1:], line='q', ax=ax)
plt.title("ARIMA(2,1,0)残差Q-Q图")
plt.tight_layout()
plt.show()

fig = plt.figure(figsize=(12,5))
Residual=pd.DataFrame(Result.resid[1:])
Residual.plot(kind='kde', title='密度')
plt.legend('')
plt.show()

代码结果为:

  

第六步进行模型预测:


    模型预测即利用上述的相对最优模型进行原始数据变量后续时间对应的值的预测。
    注意在python中,predict函数如果是对差分数据进行预测,注意start的起始和end的中止情况,比如一阶差分的数据是从第二个观测值
    开始进行,对应的残差也是如此,在后续绘图的时候需要注意到差分模型绘图的情况。

#预测,绘制原序列和预测序列值对比图

Predict=Result.predict(start=1, end=len(df['GDP'])-1+1+10); #不加参数默认0到n-1,要加预测个数在end后面N-1+预测n即可
#如果是一阶差分的序列预测,第一个数据已经差分消去了,应该start从第二个观测数据开始,即n=1;如果是0阶,则不需要按默认0到n-1

print(list(zip(range(193,203),Predict[-10:])))#打印预测值

plt.figure()
plt.plot(range(193),df['GDP'].values)#'o-k'
plt.plot(range(193+10),Predict)#'P--'
plt.legend(('原始观测值','预测值'))
plt.xticks(list(range(0,203,10)),rotation=90)
plt.show()

plt.figure()
plt.plot(range(193),df['GDP'].values)#'o-k'
plt.plot(range(192,193+10),Predict[-11:])#'P--'#接着原数据最后一个,进行拟合预测表示
plt.legend(('原始观测值','预测值'))
plt.xticks(list(range(0,203,10)),rotation=90)
plt.show()

代码结果:

PS:自动化AUTO-ARIMA的比较

import pmdarima as pm
# ## 自动搜索合适的参数
model = pm.auto_arima(df['GDP'].values,
                      start_p=1, start_q=1, # p,q的开始值
                      max_p=12, max_q=12, # 最大的p和q
                      d = 0,            # 寻找ARMA模型参数
                      m=1,              # 序列的周期
                      seasonal=False,   # 没有季节性趋势
                      trace=True,error_action='ignore',  
                      suppress_warnings=True, stepwise=True)
 
print(model.summary())

这一块个人没有深入研究,auto的方法有优点也有缺点, 也算提供一个写代码的思路。

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

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

相关文章

ArcGIS10.8下载及安装教程(附安装步骤)

谷歌云&#xff1a; https://drive.google.com/drive/folders/10igu7ZSMaR0v0WD7-2W-7ADJGMUFc2ze?uspsharing ArcGIS10.8 百度网盘&#xff1a; https://pan.baidu.com/s/1s5bL3QsCP5sgcftCPxc88w 提取码&#xff1a;kw4j 阿里云&#xff1a; https://www.aliyundriv…

Linux—实操篇:远程登录到linux服务器

远程登录客户端工具有 Xshell7(远程登录)&#xff0c;Xftp7&#xff08;文件传输&#xff09;,这里介绍Xshell和Xftp&#xff0c;其他的远程工具大同小异 1、远程登录Linux—Xshell 介绍&#xff1a;Xshell是目前最好的远程登录到Linux的软件&#xff0c;流畅的速度并且完美解…

如何制作污水处理流程图?简单方式说明

污水处理是指对污水进行处理&#xff0c;以使其能够满足环境保护和人类生产生活用水的需要。污水处理流程图是整个污水处理过程的图解&#xff0c;能够直观地展现污水处理的步骤和流程。 有很多方式可以制作流程图&#xff0c;比如一些站点可以在线制作&#xff0c;还兼具了思维…

chatgpt赋能python:Python下载代码:探索更快、更简单的方式

Python下载代码&#xff1a;探索更快、更简单的方式 Python是一个功能强大的编程语言&#xff0c;可以用来开发各种应用程序&#xff0c;从Web应用程序到数据科学和机器学习。作为一个高级语言&#xff0c;它通常看起来更易于理解和编写&#xff0c;相比其他编程语言更容易维护…

现阶段检验检测认证行业到底是一个什么样的行业?

为企业创造不一样的价值&#xff01; TIC行业研究先行者、行业信息送水人&#xff01; 内容摘要 此文章重点讲述了现阶段检验检测认证行业到底是一个什么样的行业&#xff0c;以及分析这个行业好与不好的明显特点。 此文章重点分析了现阶段检验检测认证行业的驱动力、竞争格…

Socket通信讲解及C/S结构实现UDP协议通信

Sokcet 一. Socket套接字 1.1 什么是套接字 所谓套接字(Socket)&#xff0c;就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端&#xff0c;提供了应用层进程利用网络协议交换数据的机制&#xff0c;是支持TCP/IP协议的路通…

java:map集合的应用,含代码以及输出样例

目录 1.Map集合 创建 基本的map使用方法 添加数据&#xff0c;打印数据 获取长度&#xff0c;删除元素&#xff0c;判断元素是否存在 map中常用的函数 1.Map集合 创建 Map<String,String> map new HashMap<>(); 基本的map使用方法 添加数据&#xff0c;打…

五.Glide

文章目录 前言1.with方法1.1 如何监听Glide的生命周期1.2 生命周期作用域Application、Activity、Fragment1.3 生命周期的绑定1.4 生命周期的监听1.5生命周期的回调 2.load方法3.into方法3.1 into方法的源码中流程走向3.2 Glide活动缓存的由来 4.Glide缓存机制4.1 资源封装4.2 …

(一)、Arcgis Server等一系列软件安装前准备

文章目录 &#xff08;一&#xff09;、win10修改机器名&#xff08;1&#xff09;、打开&#xff1a;设置->重命名这台电脑&#xff08;2&#xff09;、在弹出的系统属性框点击 "更改按钮"&#xff08;3&#xff09;、在弹出的计算机名/域更改点击 "其他&qu…

赋能数字化!企企通荣获“中国企业服务产业最佳投资案例TOP10”

近日&#xff0c;国内投资行业权威机构「投中信息」发布的投中2022年度中国创业投资机构暨私募股权投资机构系列榜单&#xff08;“投中2022年度榜单”&#xff09;隆重揭晓&#xff0c;企企通作为国内一站式采购数字化管理平台领军者&#xff0c;成功入选“2022年度企业服务产…

体积小、无广告、超实用的5款小工具

大家好&#xff0c;我又来啦&#xff0c;今天给大家带来的5款软件&#xff0c;共同特点都是体积小、无广告、超实用&#xff0c;大家观看完可以自行搜索下载哦。 1.动态桌面——WinDynamicDesktop WinDynamicDesktop是一款用于根据时间和地点自动更换桌面壁纸的工具。它可以让…

从零搭建微服务-认证中心(四)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff1a;https://gitee.com/csps/mingyue 文档地址&#xff1a;https://gitee.com/csps/mingyue/wikis 搭建前端框架 感谢开源项目【vue-next-adm…

TDengine 启动 taosAdapter,提供基于6041端口的RESTful 接口,建立REST 连接

一、前文 TDengine 入门教程——导读 二、开发指南 TDengine 完整的软件包包括&#xff1a; 服务端&#xff08;taosd&#xff09;&#xff1b;命令行程序 (CLI&#xff0c;taos) 和一些工具软件&#xff1b;用于与第三方系统对接并提供 RESTful 接口的 taosAdapter&#xff1…

evpn route抓包

EVPN路由的种类比较多&#xff0c;每个类型抓一个包在此留存&#xff0c;以备不时之需。 与君共勉。 每种EVPN路由的具体作用及工作方式可以参见VXLAN专栏中其它文章。 Type1 当各网关设备之间的BGP EVPN邻居关系建立成功后&#xff0c;网关设备之间会传递以太自动发现路由。…

Pod生命周期

Pod生命周期 Pod创建过程运行初始化容器过程运行主容器过程 容器启动后钩子&#xff0c;容器终止前钩子容器存活性&#xff0c;就绪性探测 Pod终止过程 在整个Pod生命周期&#xff0c;会出现5中状态&#xff1a; 取值描述Pending&#xff08;悬决&#xff09;Pod 已被 Kubern…

聚数成峰,共赢未来,openGauss Developer Day 2023在京举行

[2023年5月26日 中国 北京]5月25日-26日&#xff0c;以“聚数成峰&#xff0c;共赢未来”为主题的 openGauss Developer Day 2023&#xff08;openGauss开发者大会2023&#xff09;在北京举办。本届大会在中国计算机学会、国家工业信息安全发展研究中心指导下&#xff0c;由ope…

Springboot +spring security,认证方式---Form表单认证的实现(一)

一.简介 这篇文章来学习下security的认证方式其中的Form表单认证 二.Spring Security的认证方式 2.1什么是认证 认证: 就是用来判断系统中是否存在某用户&#xff0c;并判断该用户的身份是否合法的过程&#xff0c;解决的其实是用户登录的问题。认证的存在&#xff0c;是为…

数据挖掘实战(以kaggle为例)

第一课 主要分为以下内容进行讲述 机器学习工业应用领域 机器学习常用算法 机器学习常用工具 解决问题流程 数据的处理比模型更为重要 老师的博客&#xff0c;内容很详细 数据预处理 有时候可以一个feature一个feature去做 特征工程 模型选择 模型状态评估 模型融合 B…

消息通知配置-shorp

消息通知配置 注意事项&#xff1a; 消息均采用异步发送&#xff0c;请提前配置好队列&#xff0c;点这里配置队列配置完之后请别忘记在列表切换消息为启用状态 模板消息配置方式 (以订单发货通知为例) 准备工作 查看后台 消息通知 -》 消息配置 -》 订单发货通知编辑 微信公…

牛客网基础语法1~10题

牛客网基础语法1~10题 前言&#xff1a;今天是咱们第一期刷牛客网上的题目。 目标&#xff1a;掌握基础编程&#xff0c;打牢基础知识&#xff0c;有一定的编程思想 鸡汤&#xff1a;读不在三更五鼓&#xff0c;功只怕一曝十寒。先干为敬&#xff0c;大家随意。 第一题 #includ…