时间序列模型(ARIMA和ARMA)完整步骤详述
日期: 2019-05-28 分类: 个人收藏 345次阅读
老师作业要求,实现ARMA和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结果如何查看参考了这篇博客:
上一篇: 高性能Java代码的最佳实践
下一篇: APC注入
精华推荐