您现在的位置是:网站首页> 编程资料编程资料
python数据分析之时间序列分析详情_python_
2023-05-25
356人已围观
简介 python数据分析之时间序列分析详情_python_
前言
时间序列分析是基于随机过程理论和数理统计学方法:
- 每日的平均气温
- 每天的销售额
- 每月的降水量
时间序列分析主要通过statsmodel库的tsa模块完成:
- 根据时间序列的散点图,自相关函数和偏自相关函数图识别序列是否平稳的非随机序列,如果是非随机序列,观察其平稳性
- 对非平稳的时间序列数据采用差分进行平滑处理
- 根据识别出来的特征建立相应的时间序列模型
- 参数估计,检验是否具有统计意义
- 假设检验,判断模型的残差序列是否为白噪声序列
- 利用已通过检验的模型进行预测
时间序列的相关检验
白噪声检验
如果为白噪声数据(即独立分布的随机数据),说明其没有任何有用的信息
## 输出高清图像 %config InlineBackend.figure_format = 'retina' %matplotlib inline ## 图像显示中文的问题 import matplotlib matplotlib.rcParams['axes.unicode_minus']=False import seaborn as sns sns.set(font= "Kaiti",style="ticks",font_scale=1.4)
## 导入会使用到的相关库 import numpy as np import pandas as pd import matplotlib.pyplot as plt from statsmodels.tsa.stattools import * import statsmodels.api as sm import statsmodels.formula.api as smf from statsmodels.tsa.api import SimpleExpSmoothing,Holt,ExponentialSmoothing,AR,ARIMA,ARMA from statsmodels.graphics.tsaplots import plot_acf, plot_pacf import pmdarima as pm from sklearn.metrics import mean_absolute_error import pyflux as pf from fbprophet import Prophet ## 忽略提醒 import warnings warnings.filterwarnings("ignore")## 读取时间序列数据,该数据包含:X1为飞机乘客数据,X2为一组随机数据 df = pd.read_csv("data/chap6/timeserise.csv") ## 查看数据的变化趋势 df.plot(kind = "line",figsize = (10,6)) plt.grid() plt.title("时序数据") plt.show()
## 白噪声检验Ljung-Box检验 ## 该检验用来检查序列是否为随机序列,如果是随机序列,那它们的值之间没有任何关系 ## 使用LB检验来检验序列是否为白噪声,原假设为在延迟期数内序列之间相互独立。 lags = [4,8,16,32] LB = sm.stats.diagnostic.acorr_ljungbox(df["X1"],lags = lags,return_df = True) print("序列X1的检验结果:\n",LB) LB = sm.stats.diagnostic.acorr_ljungbox(df["X2"],lags = lags,return_df = True) print("序列X2的检验结果:\n",LB) ## 如果P值小于0.05,说明序列之间不独立,不是白噪声 ''' 序列X1的检验结果: lb_stat lb_pvalue 4 427.738684 2.817731e-91 8 709.484498 6.496271e-148 16 1289.037076 1.137910e-264 32 1792.523003 0.000000e+00 序列X2的检验结果: lb_stat lb_pvalue 4 1.822771 0.768314 8 8.452830 0.390531 16 15.508599 0.487750 32 28.717743 0.633459 '''在延迟阶数为[4,6,16,32]的情况下,序列X1的LB检验P值均小于0.05,即该数据不是随机的。有规律可循,有分析价值,而序列X2的LB检验P值均大于0.05,该数据为白噪声,没有分析价值
平稳性检验
时间序列是否平稳,对选择预测的数学模型非常关键
如果数据是平稳的,可以使用自回归平均移动模型(ARMA)
如果数据是不平稳的,可以使用差分移动自回归平均移动模型(ARIMA)
## 序列的单位根检验,即检验序列的平稳性 dftest = adfuller(df["X2"],autolag='BIC') dfoutput = pd.Series(dftest[0:4], index=['adf','p-value','usedlag','Number of Observations Used']) print("X2单位根检验结果:\n",dfoutput) dftest = adfuller(df["X1"],autolag='BIC') dfoutput = pd.Series(dftest[0:4], index=['adf','p-value','usedlag','Number of Observations Used']) print("X1单位根检验结果:\n",dfoutput) ## 对X1进行一阶差分后的序列进行检验 X1diff = df["X1"].diff().dropna() dftest = adfuller(X1diff,autolag='BIC') dfoutput = pd.Series(dftest[0:4], index=['adf','p-value','usedlag','Number of Observations Used']) print("X1一阶差分单位根检验结果:\n",dfoutput) ## 一阶差分后 P值大于0.05, 小于0.1,可以认为其是平稳的 ''' X2单位根检验结果: adf -1.124298e+01 p-value 1.788000e-20 usedlag 0.000000e+00 Number of Observations Used 1.430000e+02 dtype: float64 X1单位根检验结果: adf 0.815369 p-value 0.991880 usedlag 13.000000 Number of Observations Used 130.000000 dtype: float64 X1一阶差分单位根检验结果: adf -2.829267 p-value 0.054213 usedlag 12.000000 Number of Observations Used 130.000000 dtype: float64 '''序列X2的检验P值小于0.05,说明X2是一个平稳时间序列(该序列是白噪声,白噪声序列是平稳序列)
序列X1的检验P值远大于0.05,说明不平稳,而其一阶差分后的结果,P值大于0.05,但小于0.1,可以认为平稳
针对数据的平稳性检验,还可以使用KPSS检验,其原假设该序列是平稳的,该检验可以用kpss()函数完成
## KPSS检验的原假设为:序列x是平稳的。 ## 对序列X2使用KPSS检验平稳性 dfkpss = kpss(df["X2"]) dfoutput = pd.Series(dfkpss[0:3], index=["kpss_stat"," p-value"," usedlag"]) print("X2 KPSS检验结果:\n",dfoutput) ## 接受序列平稳的原假设 ## 对序列X1使用KPSS检验平稳性 dfkpss = kpss(df["X1"]) dfoutput = pd.Series(dfkpss[0:3], index=["kpss_stat"," p-value"," usedlag"]) print("X1 KPSS检验结果:\n",dfoutput) ## 拒绝序列平稳的原假设 ## 对序列X1使用KPSS检验平稳性 dfkpss = kpss(X1diff) dfoutput = pd.Series(dfkpss[0:3], index=["kpss_stat"," p-value"," usedlag"]) print("X1一阶差分KPSS检验结果:\n",dfoutput) ## 接受序列平稳的原假设 ''' X2 KPSS检验结果: kpss_stat 0.087559 p-value 0.100000 usedlag 14.000000 dtype: float64 X1 KPSS检验结果: kpss_stat 1.052175 p-value 0.010000 usedlag 14.000000 dtype: float64 X1一阶差分KPSS检验结果: kpss_stat 0.05301 p-value 0.10000 usedlag 14.00000 dtype: float64 '''ARIMA(p,d,q)模型
## 检验ARIMA模型的参数d X1d = pm.arima.ndiffs(df["X1"], alpha=0.05, test="kpss", max_d=3) print("使用KPSS方法对序列X1的参数d取值进行预测,d = ",X1d) X1diffd = pm.arima.ndiffs(X1diff, alpha=0.05, test="kpss", max_d=3) print("使用KPSS方法对序列X1一阶差分后的参数d取值进行预测,d = ",X1diffd) X2d = pm.arima.ndiffs(df["X2"], alpha=0.05, test="kpss", max_d=3) print("使用KPSS方法对序列X2的参数d取值进行预测,d = ",X2d) ''' 使用KPSS方法对序列X1的参数d取值进行预测,d = 1 使用KPSS方法对序列X1一阶差分后的参数d取值进行预测,d = 0 使用KPSS方法对序列X1的参数d取值进行预测,d = 0 '''针对SARIMA模型,还有一个季节性平稳性参数D
## 检验SARIMA模型的参数季节阶数D X1d = pm.arima.nsdiffs(df["X1"], 12, max_D=2) print("对序列X1的季节阶数D取值进行预测,D = ",X1d) X1diffd = pm.arima.nsdiffs(X1diff, 12, max_D=2) print("序列X1一阶差分后的季节阶数D取值进行预测,D = ",X1diffd) ''' 对序列X1的季节阶数D取值进行预测,D = 1 序列X1一阶差分后的季节阶数D取值进行预测,D = 1 '''自相关和偏相关分析
## 对随机序列X2进行自相关和偏相关分析可视化 fig = plt.figure(figsize=(16,5)) plt.subplot(1,3,1) plt.plot(df["X2"],"r-") plt.grid() plt.title("X2序列波动") ax = fig.add_subplot(1,3,2) plot_acf(df["X2"], lags=60,ax = ax) plt.grid() ax = fig.add_subplot(1,3,3) plot_pacf(df["X2"], lags=60,ax = ax) plt.grid() plt.tight_layout() plt.show()
在图像中滞后0表示自己和自己的相关性,恒等于1。不用于确定p和q。
## 对非随机序列X1进行自相关和偏相关分析可视化 fig = plt.figure(figsize=(16,5)) plt.subplot(1,3,1) plt.plot(df["X1"],"r-") plt.grid() plt.title("X1序列波动") ax = fig.add_subplot(1,3,2) plot_acf(df["X1"], lags=60,ax = ax) plt.grid() ax = fig.add_subplot(1,3,3) plot_pacf(df["X1"], lags=60,ax = ax) plt.ylim([-1,1]) plt.grid() plt.tight_layout() plt.show()
## 对非随机序列X1一阶差分后的序列进行自相关和偏相关分析可视化 fig = plt.figure(figsize=(16,5)) plt.subplot(1,3,1) plt.plot(X1diff,"r-") plt.grid() plt.title("X1序列一阶差分后波动") ax = fig.add_subplot(1,3,2) plot_acf(X1diff, lags=60,ax = ax) plt.grid() ax = fig.add_subplot(1,3,3) plot_pacf(X1diff, lags=60,ax = ax) plt.grid() plt.tight_layout() plt.show()
ARMA(p,q)中,自相关系数的滞后,对应着参数q;偏相关系数的滞后对应着参数p。
## 时间序列的分解 ## 通过观察序列X1,可以发现其既有上升的趋势,也有周期性的趋势,所以可以将该序列进行分解 ## 使用乘法模型分解结果(通常适用于有增长趋势的序列) X1decomp = pm.arima.decompose(df["X1"].values,"multiplicative", m=12) ## 可视化出分解的结果 ax = pm.utils.decomposed_plot(X1decomp,figure_kwargs = {"figsize": (10, 6)}, show=False) ax[0].set_title("乘法模型分解结果") plt.show()
## 使用加法模型分解结果(通常适用于平稳趋势的序列) X1decomp = pm.arima.decompose(X1diff.values,"additive", m=12) ## 可视化出分解的结果 ax = pm.utils.decomposed_plot(X1decomp,figure_kwargs = {"figsize": (10, 6)}, show=False) ax[0].set_title("加法模型分解结果") plt.show()
移动平均算法
## 数据准备 ## 对序列X1进行切分,后面的24个数据用于测试集 train = pd.DataFrame(df["X1"][0:120]) test = pd.DataFrame(df["X1"][120:]) ## 可视化切分后的数据 train["X1"].plot(figsize=(14,7), title= "乘客数量数据",label = "X1 train") test["X1"].plot(label = "X1 test") plt.legend() plt.grid() plt.show()

print(train.shape) print(test.shape) df["X1"].shape ''' (120, 1) (24, 1) (144,) '''
简单移动平均法
## 简单移动平均进行预测 y_hat_avg = test.copy(deep = False) y_hat_avg["moving_avg_forecast"] = train["X1"].rolling(24).mean().iloc[-1] ## 可视化出预测结果 plt.figure(figsize=(14,7)) train["X1"].plot(figsize=(14,7),label = "X1 train") test["X1"].plot(label = "X1 test"
相关内容
- Python Numpy中数组的集合操作详解_python_
- python中关于对super()函数疑问解惑_python_
- 修复python-memcached在python3.8环境中报SyntaxWarning的问题(完美解决)_python_
- Python3中常见配置文件写法汇总_python_
- Python中requests库的基本概念与具体使用方法_python_
- 一文掌握python中的时间包_python_
- uwsgi启动django项目的实现步骤_python_
- Python+Pygame实战之英文版猜字游戏的实现_python_
- 使用pip下载时提示"You are using pip version 8.1.1, however version 22.1 is available."错误解决_python_
- Python中os模块的12种用法总结_python_
点击排行
本栏推荐
