Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python时间序列分析--ARIMA模型实战案例

Python时间序列分析--ARIMA模型实战案例

作者头像
北山啦
发布于 2022-11-27 03:10:47
发布于 2022-11-27 03:10:47
1.9K00
代码可运行
举报
文章被收录于专栏:北山啦的博客北山啦的博客
运行总次数:0
代码可运行

本文将介绍使用Python来完成时间序列分析ARIMA模型的完整步骤与流程,绘制时序图,平稳性检验,单位根检验,白噪声检验,模型定阶,模型有啊,参数估计,模型检验等完整步骤。Python建立时间序列分析–ARIMA模型实战案例


文章目录

时间序列分析概念

时间序列分析 是统计学中的一个非常重要的分支,是以概率论与数理统计为基础、计算机应用为技术支撑,迅速发展起来的一种应用性很强的科学方法。时间序列是变量按时间间隔的顺序而下形成的随机变量序列,大量自然界、社会经济等领域的统计指标都依年、季、月或日统计其指标值,随着时间的推移,形成了统计指标的时间序列,例如,股价指数、物价指数、GDP和产品销售量等等都属于时间序列。 原文链接:https://blog.csdn.net/qq_45176548/article/details/111504846


建立模型基本步骤


ARIMA模型建模实战

导入模块

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import sys
import os
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
import numpy as np
from arch.unitroot import ADF
import matplotlib.pylab as plt
%matplotlib inline
from matplotlib.pylab import style
style.use('ggplot')
import statsmodels.api as sm
import statsmodels.formula.api as smf
import statsmodels.tsa.api as smt
from statsmodels.tsa.stattools import adfuller 
from statsmodels.stats.diagnostic import acorr_ljungbox 
from statsmodels.graphics.api import qqplot
pd.set_option('display.float_format', lambda x: '%.5f' % x) 
np.set_printoptions(precision=5, suppress=True) 
"""中文显示问题"""
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']

加载数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data = pd.read_excel("data.xlsx",index_col="年份",parse_dates=True)
data.head()

xt

年份

1952-01-01

100.00000

1953-01-01

101.60000

1954-01-01

103.30000

1955-01-01

111.50000

1956-01-01

116.50000

平稳性检验

时序图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data["diff1"] = data["xt"].diff(1).dropna()
data["diff2"] = data["diff1"].diff(1).dropna()
data1 = data.loc[:,["xt","diff1","diff2"]]
data1.plot(subplots=True, figsize=(18, 12),title="差分图")

时序图检验 - - 全靠肉眼的判断和判断人的经验,不同的人看到同样的图形,很可能会给出不同的判断。因此我们需要一个更有说服力、更加客观的统计方法来帮助我们检验时间序列的平稳性,这种方法,就是单位根检验。 原文链接:https://blog.csdn.net/qq_45176548/article/details/111504846

单位根检验

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print("单位根检验:\n")
print(ADF(data.diff1.dropna()))  
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
单位根检验:

   Augmented Dickey-Fuller Results   
=====================================
Test Statistic                 -3.156
P-value                         0.023
Lags                                0
-------------------------------------

Trend: Constant
Critical Values: -3.63 (1%), -2.95 (5%), -2.61 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.

单位根检验:对其一阶差分进行单位根检验,得到:1%、%5、%10不同程度拒绝原假设的统计值和ADF Test result的比较,本数据中,P-value 为 0.023,接近0,ADF Test result同时小于5%、10%即说明很好地拒绝该假设,本数据中,ADF结果为-3.156,拒绝原假设,即一阶差分后数据是平稳的。

白噪声检验

判断序列是否为非白噪声序列

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from statsmodels.stats.diagnostic import acorr_ljungbox
acorr_ljungbox(data.diff1.dropna(), lags = [i for i in range(1,12)],boxpierce=True)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(array([11.30402, 13.03896, 13.37637, 14.24184, 14.6937 , 15.33042,
        16.36099, 16.76433, 18.15565, 18.16275, 18.21663]),
 array([0.00077, 0.00147, 0.00389, 0.00656, 0.01175, 0.01784, 0.02202,
        0.03266, 0.03341, 0.05228, 0.07669]),
 array([10.4116 , 11.96391, 12.25693, 12.98574, 13.35437, 13.85704,
        14.64353, 14.94072, 15.92929, 15.93415, 15.9696 ]),
 array([0.00125, 0.00252, 0.00655, 0.01135, 0.02027, 0.03127, 0.04085,
        0.06031, 0.06837, 0.10153, 0.14226]))

通过P<α,拒绝原假设,故差分后的序列是平稳的非白噪声序列,可以进行下一步建模

模型定阶

现在我们已经得到一个平稳的时间序列,接来下就是选择合适的ARIMA模型,即ARIMA模型中合适的p,q。 第一步我们要先检查平稳时间序列的自相关图和偏自相关图。通过sm.graphics.tsa.plot_acf和sm.graphics.tsa.plot_pacf得到图形

从一阶差分序列的自相关图和偏自相关图可以发现:

  1. 自相关图拖尾或一阶截尾
  2. 偏自相关图一阶截尾,
  • 所以我们可以建立ARIMA(1,1,0)、ARIMA(1,1,1)、ARIMA(0,1,1)模型。

模型优化

  • 其中L是在该模型下的最大似然,n是数据数量,k是模型的变量个数。 python代码如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
arma_mod20 = sm.tsa.ARIMA(data["xt"],(1,1,0)).fit()
arma_mod30 = sm.tsa.ARIMA(data["xt"],(0,1,1)).fit()
arma_mod40 = sm.tsa.ARIMA(data["xt"],(1,1,1)).fit()
values = [[arma_mod20.aic,arma_mod20.bic,arma_mod20.hqic],[arma_mod30.aic,arma_mod30.bic,arma_mod30.hqic],[arma_mod40.aic,arma_mod40.bic,arma_mod40.hqic]]
df = pd.DataFrame(values,index=["AR(1,1,0)","MA(0,1,1)","ARMA(1,1,1)"],columns=["AIC","BIC","hqic"])
df

AIC

BIC

hqic

AR(1,1,0)

253.09159

257.84215

254.74966

MA(0,1,1)

251.97340

256.72396

253.63147

ARMA(1,1,1)

254.09159

258.84535

259.74966

  • 构造这些统计量所遵循的统计思想是一致的,就是在考虑拟合残差的同时,依自变量个数施加“惩罚”。但要注意的是,这些准则不能说明某一个模型的精确度,也即是说,对于三个模型A,B,C,我们能够判断出B模型是最好的,但不能保证B模型能够很好地刻画数据

参数估计

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from statsmodels.tsa.arima_model import ARIMA
model = ARIMA(data["xt"], order=(0,1,1))
result = model.fit()
print(result.summary())
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                             ARIMA Model Results                              
==============================================================================
Dep. Variable:                   D.xt   No. Observations:                   36
Model:                 ARIMA(0, 1, 1)   Log Likelihood                -122.987
Method:                       css-mle   S.D. of innovations              7.309
Date:                Tue, 22 Dec 2020   AIC                            251.973
Time:                        09:11:55   BIC                            256.724
Sample:                    01-01-1953   HQIC                           253.631
                         - 01-01-1988                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
const          4.9956      2.014      2.481      0.013       1.048       8.943
ma.L1.D.xt     0.6710      0.165      4.071      0.000       0.348       0.994
                                    Roots                                    
=============================================================================
                  Real          Imaginary           Modulus         Frequency
-----------------------------------------------------------------------------
MA.1           -1.4902           +0.0000j            1.4902            0.5000
-----------------------------------------------------------------------------

模型检验

参数的显著性检验

P<α,拒绝原假设,认为该参数显著非零MA(2)模型拟合该序列,残差序列已实现白噪声

模型的显著性检验

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
resid = result.resid#残差
fig = plt.figure(figsize=(12,8))
ax = fig.add_subplot(111)
fig = qqplot(resid, line='q', ax=ax, fit=True)

qq图显示,我们看到红色的KDE线与N(0,1)平行,这是残留物正太分布的良好指标,说明残差序列是白噪声序列,模型的信息的提取充分,当让大家也可以使用前面介绍的检验白噪声的方法LB统计量来检验

ARIMA(0,1,1)模型拟合该序列,残差序列已实现白噪声,且参数均显著非零。说明AR(0,11)模型是该序列的有效拟合模型

模型预测

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pred = result.predict('1988', '1990',dynamic=True, typ='levels')
print (pred)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1988-01-01   278.35527
1989-01-01   283.35088
1990-01-01   288.34649
Freq: AS-JAN, dtype: float64
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plt.figure(figsize=(12, 8))
plt.xticks(rotation=45)
plt.plot(pred)
plt.plot(data.xt)
plt.show()

到这里就结束了,如果对你有帮助你,欢迎点赞关注,你的点赞对我很重要

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
时间序列模型(ARIMA和ARMA)完整步骤详述「建议收藏」
我于2019年发布此篇文章至今收获了许多人的指点,当时的代码的确晦涩难懂,近期有空,将代码重新整理了一遍,重新发送至此。希望能够帮助大家更好地理解。
全栈程序员站长
2022/08/25
7.7K0
时间序列模型(ARIMA和ARMA)完整步骤详述「建议收藏」
时间序列ARMA和ARIMA
首发于CSDN:https://blog.csdn.net/qq_33333002/article/details/106171234
朱小五
2020/06/01
1.5K1
【时序预测】一文梳理时间序列预测——ARMA模型
在统计研究中,常用按时间顺序排列的一组随机变量X1​,X2​,⋯,Xt​,⋯来表示一个随机事件的时间序列,简记为{Xt,t∈T}。在时间的角度上来说,数据类型可分为两类:横截面数据和时间序列[1]。横截面数据是值在某一时间点搜集来自不同对象的数据,时间序列是一组按照时间排序的数据;横截面数据与时间序列的组合在计量经济学上构成了面板数据集。
roganhuang
2020/07/22
19.1K0
【时序预测】一文梳理时间序列预测——ARMA模型
一阶差分序列garch建模_时间序列分析
趋势变动:在长时期内按某种规则稳定地呈现出来的持续向上或向下或保持在某一水平。季节变动:在一个年度内重复出现的周期性波动。它是诸如气候条件、生产条件、节假日或人们的风俗习惯等各种因素影响的结果。循环波动:是时间序列呈现出得非固定长度的周期性变动。循环波动的周期可能会持续一段时间,但与趋势不同,它不是朝着单一方向的持续变动,而是涨落相同的交替波动。不规则波动(随机变动):是许多不可控的偶然因素共同作用的结果,致使时间序列产生一种波浪形或震荡式的变动。
用户7886150
2021/01/30
1.9K0
时间序列ARIMA模型详解:python实现店铺一周销售量预测
顾名思义,时间序列是时间间隔不变的情况下收集的时间点集合。这些集合被分析用来了解长期发展趋势,为了预测未来或者表现分析的其他形式。但是是什么令时间序列与常见的回归问题的不同? 有两个原因: 1、时间序列是跟时间有关的。所以基于线性回归模型的假设:观察结果是独立的在这种情况下是不成立的。 2、随着上升或者下降的趋势,更多的时间序列出现季节性趋势的形式,如:特定时间框架的具体变化。即:如果你看到羊毛夹克的销售上升,你就一定会在冬季做更多销售。 常用的时间序列模型有AR模型、MA模型、ARMA模型和ARI
机器学习AI算法工程
2018/03/14
8.9K0
时间序列ARIMA模型详解:python实现店铺一周销售量预测
【机器学习 | 数据挖掘】时间序列算法
智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘,以提取有价值的信息和洞察。它结合了大数据技术、人工智能(AI)、机器学习(ML)和数据挖掘等多种方法,旨在通过自动化的方式分析复杂数据集,发现潜在的价值和关联性,实现数据的自动化处理和分析,从而支持决策和优化业务流程。与传统的人工分析相比,智能大数据分析具有自动化、深度挖掘、实时性和可视化等特点。智能大数据分析广泛应用于各个领域,包括金融服务、医疗健康、零售、市场营销等,帮助企业做出更为精准的决策,提升竞争力。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/Intelligent_bigdata_analysis。
Francek Chen
2025/01/22
1660
【机器学习 | 数据挖掘】时间序列算法
时间序列预测模型-ARIMA原理及Python实现!
再介绍本篇的内容之前,我们先来看一下本文用到的数据。本文用到的中国银行股票数据下载:http://pan.baidu.com/s/1gfxRFbH。
石晓文
2018/12/06
14.8K1
python时间序列分析代码_时间序列分析VAR实验报告
题记:毕业一年多天天coding,好久没写paper了。在这动荡的日子里,也希望写点东西让自己静一静。恰好前段时间用python做了一点时间序列方面的东西,有一丁点心得体会想和大家分享下。在此也要特别感谢顾志耐和散沙,让我喜欢上了python。
全栈程序员站长
2022/09/19
1.1K0
python时间序列分析代码_时间序列分析VAR实验报告
AR(I)MA时间序列建模过程——步骤和python代码
1.异常值和缺失值的处理 这绝对是数据分析时让所有人都头疼的问题。异常和缺失值会破坏数据的分布,并且干扰分析的结果,怎么处理它们是一门大学问,而我根本还没入门。 (1)异常值 3 ways to remove outliers from your data https://ocefpaf.github.io/python4oceanographers/blog/2015/03/16/outlier_detection/ 提供了关于如何对时间序列数据进行异常值检测的方法,作者认为移动中位数的方法最好,代码
机器学习AI算法工程
2018/03/14
4.1K0
AR(I)MA时间序列建模过程——步骤和python代码
2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
上一篇已经对赛题进行详细分析了,而且大方向和基本的模型已经确定完毕,数据集都已经找到了,现在最重要的就是要分析风暴数据集以及建立时序预测模型,使用气候模型预测的数据,评估气候变化对未来极端天气事件频率和强度的影响。来看极端天气频率是否会上升,以及如何利用历史气象数据来支撑我们的模型效果。
fanstuck
2024/02/04
7290
2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
Python中的ARIMA模型、SARIMA模型和SARIMAX模型对时间序列预测
使用ARIMA模型,您可以使用序列过去的值预测时间序列。在本文中,我们从头开始构建了一个最佳ARIMA模型,并将其扩展到Seasonal ARIMA(SARIMA)和SARIMAX模型。
拓端
2020/08/07
9.2K0
Python中的ARIMA模型、SARIMA模型和SARIMAX模型对时间序列预测|附代码数据
根据频率,时间序列可以是每年(例如:年度预算),每季度(例如:支出),每周(例如:销售数量),每天(例如天气),每小时(例如:股票价格),分钟(例如:来电提示中的呼入电话),甚至是几秒钟(例如:网络流量)。
拓端
2023/07/17
1K0
打开我的收藏夹 -- Python时间序列分析篇
这两天,又接收到了不少新的讯息。我是越来越佩服“梦想橡皮檫”,檫哥了(打开周榜/总榜很好找,前排),他居然能用几年的时间来打磨一个系列。别说收39块,就是原价99我也买了,不为啥,就凭人家打磨了三年的毅力,我服!!!
看、未来
2021/09/18
8080
Python中的ARIMA模型、SARIMA模型和SARIMAX模型对时间序列预测|附代码数据
根据频率,时间序列可以是每年(例如:年度预算),每季度(例如:支出),每周(例如:销售数量),每天(例如天气),每小时(例如:股票价格),分钟(例如:来电提示中的呼入电话),甚至是几秒钟(例如:网络流量)。
拓端
2023/02/20
2K0
Python中的ARIMA模型、SARIMA模型和SARIMAX模型对时间序列预测|附代码数据
使用ARIMA模型,您可以使用序列过去的值预测时间序列(点击文末“阅读原文”获取完整代码数据)。
拓端
2022/11/07
2K0
一文囊括时间序列方法(源码)
时间序列是指将某种现象某一个统计指标在不同时间上的各个数值,按时间先后顺序排列而形成的序列。典型的时间序列问题,例如股价预测、制造业中的电力预测、传统消费品行业的销售预测、客户日活跃量预测等等。(本文以客户日活跃量预测为例。)
算法进阶
2022/06/01
8470
一文囊括时间序列方法(源码)
python实现对招聘信息中数据类岗位的分析与预测
上次读到关于拉勾网职位分析的文章,该文章主要是对其各个地区的岗位分布及薪资构成做了基本的描述性分析,所以我不免产生了对其继续分析的冲动。本文接下来单从技术岗位出发,着重分析各个类型的技术岗位的需求情况
机器学习AI算法工程
2018/03/14
3K1
python实现对招聘信息中数据类岗位的分析与预测
干货 | 携程如何基于ARIMA时序分析做业务量的预测
时间序列分析是统计学科的一个重要分支。它主要是通过研究随着时间的推移事物发展变化过程中的规律,来进行事物未来发展情况的预测。在我们的日常生活中,股票的价格走势,奶茶店每天的销售额,一年的降雨量分布,河水四季的涨落情况等都属于时间序列。时间序列的分析深入诸多行业。
携程技术
2020/10/09
1.2K0
干货 | 携程如何基于ARIMA时序分析做业务量的预测
【数据挖掘 & 机器学习 | 时间序列】时间序列必学模型: ARIMA超详细讲解
【数据挖掘 & 机器学习 | 时间序列】时间序列必学模型: ARIMA超详细讲解 作者: 计算机魔术师 版本: 1.0 ( 2023.8.27 )
计算机魔术师
2023/11/20
2.6K0
【数据挖掘 & 机器学习 | 时间序列】时间序列必学模型: ARIMA超详细讲解
机器学习(十一)时间序列模型
AR模型(自回归模型),是统计上一种处理时间序列的方法,用同一变数例如x的之前各期,亦即x1至xt-1来预测本期xt的表现,并假设它们为一线性关系。因为这是从回归分析中的线性回归发展而来,只是不用x预测y,而是用x预测 x(自己);所以叫做自回归。
致Great
2018/10/08
3.8K0
机器学习(十一)时间序列模型
推荐阅读
相关推荐
时间序列模型(ARIMA和ARMA)完整步骤详述「建议收藏」
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验