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

2023-11-08

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

对于单变量的时间序列预测:模型有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的方法有优点也有缺点, 也算提供一个写代码的思路。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 2023华为OD机试python【代表团坐车】

    前言 本答案使用python解答 如果需要Java版本题解 请参考 Java版本 题目 现在要组织一场活动 有多个代表团需要参加活动 已知多个代表团同时到达 但是接待处可用的客车只有一辆 你现在需要计算的是 可以坐满车的接待方案 并且输出有
  • 随笔:使用OpenAI的Embeddings API和Complation API实现客服问答

    去年11月openAI推出了Chat GPT 掀了好大一股浪 前段时间看了一下openAI的API看不看如何通过openAI 的语言处理模型来处理一下客服回复 下面做个笔记记录一下 为什么研究 Open AI 现有的模型没有我们特定场景下的
  • 【Centos】服务管理、解/压缩、磁盘、进程管理相关命令

    文章目录 一 服务管理 1 service 2 chkconfig设置后台服务器的自启配置 3 systemctl 设置后台服务器自启配置 防火墙关闭 4 开关机重启 5 搜索查找类find 6 locate快速定位文件路径 7 其他命令
  • Java语言特点与学习

    Java语言是一款面向对象的一款高级语言是由Sun Microsystems公司 现已被oracle公司收购 由James Gosling和同事们共同研发 并在1995年正式推出 据oracle官方数据指数 目前全球已有上亿的系统是使用Ja
  • io流中用到的设计模式

    总括 适配器模式 装饰者模式 public void testInputStreamReader throws Exception private static final String SEPARATOR File separator F
  • 【Antlr】使用语义判定修改语法分析过程

    文章目录 1 概述 2 识别编程语言中的多种方言 2 案例 2 1 完整案例 1 概述 上一篇文章 Antlr Antlr属性和动作 识别关键字不固定的语句 出自 antlr 权威指南 并且补充 在上一章中 我们学习了如何在语法中嵌入动作
  • 简单了解机器学习(Machine Learning)

    首先 什么是机器学习 笼统来讲 机器学习是通过让机器去学习从而帮助人类做出决定 人类可以说在任何时刻 做任何事情时都在面临着无数的决定 从小的决定 晚饭吃什么 穿哪双鞋 喝什么饮料 到大的决定 专业选什么 工作选什么 定居在哪里 等 我们所
  • 【关于笔记软件的感受、期望,以及初期预案】

    市场 现状 首先看格式 md比较轻量级 支持这个格式的软件也比较广泛 生产力决定生产关系 就目前需要记录的内容和频率数量来看 个人感觉用这个格式承载笔记是最合适的 文字方面 图画多媒体编辑除外 包括在项目中也会用它来做简介 语雀 飞书等等的
  • matlab矩阵分割示例

    下面介绍了使用mat2cell函数把矩阵分割为我们想要的形状 1 先产生一个6x6的随机矩阵作为被分割矩阵 2 比如想把矩阵a分割为4块 也就分为4个3x3的矩阵 方法如下 b mat2cell a 3 3 3 3 运行结果如下 再比如c
  • (一)Android布局时资源文件使用

    一 Android布局时菜单资源文件使用 Android Menu资源的使用 菜单分为三种 OptionsMenu 选项菜单 ContextMenu 上下文菜单 SubMenu 子菜单 OptionsMenu默认情况下是在点击Menu键后出
  • Python 开发桌面应用居然如此简单

    我们都知道 Python 可以用来开发桌面应用 一旦功能开发完成 最后打包的可执行文件体积大 并且使用 Python 开发桌面应用周期相对较长 假如想快速开发一款 PC 端的桌面应用 推荐使用 Aardio Python 搭配的方式进行开发
  • Session(服务端会话跟踪技术)

    开发工具与关键技术 IDEA 撰写时间 2022 10 18 服务端会话跟踪技术 将数据保存到服务端 javaEE 提供HttpSession接口 来实现一次会话的多次请求间数据共享功能 注意 Session 是基于Cookie实现的 Se
  • iOS--Runloop

    Runloop概述 一般来说 一个线程一次只能执行一个任务 执行完成后线程就会退出 就比如之前学OC时使用的命令行程序 执行完程序就结束了 而runloop目的就是使线程在执行完一次代码之后不会结束程序 而是使该线程处于一种休眠的状态 等待
  • 力扣刷题——数组(c++)

    题目 给你一个数组 nums 和一个值 val 你需要 原地 移除所有数值等于 val 的元素 并返回移除后数组的新长度 不要使用额外的数组空间 你必须仅使用 O 1 额外空间并 原地 修改输入数组 元素的顺序可以改变 你不需要考虑数组中超
  • va_list、va_start、va_arg、va_end宏的使用

    当你的函数的参数个数不确定时 就可以使用上述宏进行动态处理 这无疑为你的程序增加了灵活性 Example CString AppendString CString str1 一个连接字符串的函数 参数个数可以动态变化 LPCTSTR str
  • 特斯拉Model 3 Key Card里的黑科技

    特斯拉Model 3给用户提供了三种解锁电动车的姿势 遥控钥匙 可选 需付费购买 手机APP蓝牙解锁 以及 Key Card 钥匙卡片 其中Key Card作为手机蓝牙钥匙的备份方案 以应对手机没电了 忘带了 APP故障 车机蓝牙故障等上不
  • Python实现逻辑回归(LogisticRegression)完整过程

    最近正在做的项目正好利用到了逻辑回归 所以正好系统的学习了下 本篇博文把自己的学习笔记 项目思路及代码都记录下来 它的计算原理很多网站和书籍都有介绍 就不在这班门弄斧了 主要还是记录自己如何实现 一 逻辑回归简介 Logistic Regr
  • matlab中未定义与 ‘cell‘ 类型的输入参数相对应的运算符 ‘+‘ 的解决方案

    在函数文件中写入以下内容 function re fun a b varargin if nargin 2 re a b elseif nargin 3 c varargin 1 re a b c else error wrong end
  • 排序法 C语言常考的十大排序法 数列、字符的排序

    通过对近各大试卷题型分析 总结出 对于数据排序的十大方法 希望对大家有所帮助 方法一 冒泡排序法 升序排序法 方法二 选择排序法 方法三 插入排序法 方法四 希尔排序法 Shell Sort 方法五 归并排序法 方法六 快速排序法 交换排序
  • 一文搞懂Python时间序列预测(步骤,模板,python代码)

    预测包括 数值拟合 线性回归 多元回归 时间序列 神经网络等等 对于单变量的时间序列预测 模型有AR MA ARMA ARIMA 综合来说用ARIMA即可表示全部 数据和代码链接 数据和Jupyter文件 以预测美国未来10年GDP的变换情