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

我于2019年发布此篇文章至今收获了许多人的指点,当时的代码的确晦涩难懂,近期有空,将代码重新整理了一遍,重新发送至此。希望能够帮助大家更好地理解。

建模步骤:

目录

数据包和版本申明

步骤一:数据准备与数据预处理

步骤二:数据重采样

步骤三:平滑处理

步骤四:平稳性检验

 步骤五: 时间序列定阶

(2)信息准则定阶

步骤六:模型构建

步骤七:模型评价

总结


数据包和版本申明

申明:本实验环境为python 3.7.4  statsmodels版文为:0.10.1

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 sklearn.metrics import mean_squared_error
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 #ARIMA模型
from statsmodels.tsa.arima_model import ARMA #ARMA模型
from statsmodels.stats.stattools import durbin_watson #DW检验
from statsmodels.graphics.api import qqplot #qq图

步骤一:数据准备与数据预处理

    自动生成2018年1月1日至2018年9月1日数据,数据服从标准正态分布,存入old_data.csv中。

#### Part:generate raw data and save in the old_data.csv 
#### 创建一个时间列表,从20180101到20180901数据,存入 old_data.csv 
def genertate_data():
    index = pd.date_range(start='2018-1-1',end = '2018-9-1',freq='10T') # 10分钟采样一次
    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('G:\\WX\\2\\old_data.csv',index=0)
    print('the data is existting')

故意去将文件夹中的某些值,改成了-10000,弄成了异常值,(因为老师说尽可能显得步骤完整,最后分数才会高-,-所以我自己手动添加异常)。这块的主要工作就是利用pandas里面的函数,去查看一下刚特殊操作后的数据。

#### Step 1 数据预处理
#### delete or revise some values in data and make data preprocessing
#### 删掉或者修改创建的数据后,进行简单数据预处理 
def data_preprocessing():
    data = pd.read_csv('G:\\WX\\2\\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('G:\\WX\\2\\new_data.csv',index=0)
    print('new data is existing')

步骤二:数据重采样

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

#### Step 2 重采样
#### Resample Data and Sampling frequency is days
#### 重采样,将采样频率换成以天为单位
def Resampling(): #重采样
    df = pd.read_csv('G:\\WX\\2\\new_data.csv')
     #将默认索引方式转换成时间索引
    df['time'] = pd.to_datetime(df['time'])
    df.set_index("time", inplace=True)
   
    train_data = df['2018-1-1':'2018-8-1'] ## 取到20180101 至 20180801 做训练 
    test = df['2018-8-1':'2018-9-1']       ## 取到20180801 至 20180901 做预测 
    train_data = train_data.resample('D').mean()  ## 以天为时间间隔取均值,重采样
    test_data = test.resample('D').mean()
 
    return train_data,test_data

步骤三:平滑处理

由于ARMA和ARIMA需要时间序列满足平稳性和非白噪声的要求,所以要用差分法和平滑法(滚动平均和滚动标准差

评论 99
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Foneone

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值