Young87

当前位置:首页 >个人收藏

时间序列模型(ARIMA和ARMA)完整步骤详述

老师作业要求,实现ARMA和ARIMA模型的基本全过程和最后结果。

目录

所用的所有数据包

1,数据准备与预处理

(1)数据准备

(2)数据预处理

2,数据重采样

3,平稳性和非白噪声

(1)差分法实现

(2)平滑法处理

(3)ADF检验

(4)非白噪声检验

4,时间序列定阶

(1)ACF和PACF定阶

5,构建模型和预测

(1)ARMA模型构建

(2)模型好坏检验

(3)ARIMA模型构建

总结


所用的所有数据包

import pandas as pd
import numpy as np
import seaborn as sns #热力图
import itertools 
import datetime
import matplotlib.pyplot as plt
import statsmodels.api as sm 
from statsmodels.tsa.stattools import adfuller #ADF检验
from statsmodels.stats.diagnostic import acorr_ljungbox #白噪声检验
from statsmodels.graphics.tsaplots import plot_acf,plot_pacf #画图定阶
from statsmodels.tsa.arima_model import ARIMA #模型
from statsmodels.tsa.arima_model import ARMA #模型
from statsmodels.stats.stattools import durbin_watson #DW检验
from statsmodels.graphics.api import qqplot #qq图

1,数据准备与预处理

(1)数据准备

自己做了点数据,做数据的代码如下:

def genertate_data():
    index = pd.date_range(start='2018-1-1',end = '2018-9-1',freq='10T')
    index = list(index)
    data_list = []
    for i in range(len(index)):
        data_list.append(np.random.randn()) 
    dataframe = pd.DataFrame({'time':index,'values':data_list})
    dataframe.to_csv('C:\\Users\\happy\\Desktop\\old_data.csv',index=0)
    print('the data is existting')

然后将它保存在了old_data.csv中,然后故意去将文件夹中的某些值,改成了-10000,弄成了异常值,(因为老师说尽可能显得步骤完整,最后分数才会高-,-所以我自己手动添加异常)

(2)数据预处理

这块的主要工作就是利用pandas里面的函数,去查看一下刚特殊操作后的数据。

def data_handle():
    data = pd.read_csv('C:\\Users\\happy\\Desktop\\old_data.csv')
    #print(data.describe()) #查看统计信息,发现最小值有-10000的异常数据
    #print((data.isnull()).sum()) #查看是否存在缺失值
    #print((data.duplicated()).sum()) #重复值
    def change_zero(x):
        if x == -10000:
            return 0
        else :
            return x
    data['values'] = data['values'].apply(lambda x: change_zero(x))

    #利用均值填充缺失值
    mean = data['values'].mean()
    def change_mean(x):
        if x == 0:
            return mean
        else:
            return x
    data['values'] = data['values'].apply(lambda x: change_mean(x))
    #保存处理过的数据
    data.to_csv('C:\\Users\\happy\\Desktop\\new_data.csv',index=0)
    print('new data is existing')

2,数据重采样

为了得高分(-,-),做了很多个数据,然后一共有34992个数据,然后进行了一下重采样,数据以天进行重采样。

def Resampling(): #重采样
    df = pd.read_csv('C:\\Users\\happy\\Desktop\\new_data.csv')
     #将默认索引方式转换成时间索引
    df['time'] = pd.to_datetime(df['time'])
    df.set_index("time", inplace=True)
   
    data = df['2018-1-1':'2018-8-1'] #取18-1-1到8-1做预测
    test = df['2018-8-1':'2018-9-1']
    data_train = data.resample('D').mean()  #以一天为时间间隔取均值,重采样
    data_test = test.resample('D').mean()

    return data_train,data_test

3,平稳性和非白噪声

由于ARMA和ARIMA需要时间序列满足平稳性和非白噪声的要求,所以要用查分法和平滑法(滚动平均和滚动标准差)来实现序列的平稳性操作。一般情况下,对时间序列进行一阶差分法就可以实现序列的平稳性,有时需要二阶查分。

(1)差分法实现


def stationarity(timeseries): #平稳性处理
    #差分法(不平稳处理),保存成新的列,1阶差分,dropna() 删除缺失值
    diff1 = timeseries.diff(1).dropna() 
    diff2 = diff1.diff(1) #在一阶查分基础上做二阶查分
    
    diff1.plot(color = 'red',title='diff 1',figsize=(10,4))
    diff2.plot(color = 'black',title='diff 2',figsize=(10,4))

可以看一下图

一阶差分基本就满足了平稳性需要。

(2)平滑法处理

    #滚动平均(平滑法不平稳处理)
    rolmean = timeseries.rolling(window=4,center = False).mean()
    #滚动标准差
    rolstd = timeseries.rolling(window=4,center = False).std()
    

    rolmean.plot(color = 'yellow',title='Rolling Mean',figsize=(10,4))
    rolstd.plot(color = 'blue',title='Rolling Std',figsize=(10,4))

处理结果如图所示。

可以看出,平滑法不太适合我造出来的数据,一般情况下,这种方法更适合带有周期性稳步上升的数据类型。

(3)ADF检验

除了上述两种对于时间序列的处理方法之外,还有一种以数据的方式呈现的平稳性检验方法:ADF检验。

    #ADF检验 
    x = np.array(diff1['values'])
    adftest = adfuller(x, autolag='AIC')
    print (adftest) 

结果如下:

如何确定该序列能否平稳呢?主要看:

(1)1%、%5、%10不同程度拒绝原假设的统计值和ADF Test result的比较,ADF Test result同时小于1%、5%、10%即说明非常好地拒绝该假设,本数据中,adf结果为-6.9, 小于三个level的统计值。

(2)P-value是否非常接近0.本数据中,P-value 为 7.9e-10,接近0。

ADF结果如何查看参考了这篇博客:

除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog

上一篇: 高性能Java代码的最佳实践

下一篇: APC注入

精华推荐