我于2019年发布此篇文章至今收获了许多人的指点,当时的代码的确晦涩难懂,近期有空,将代码重新整理了一遍,重新发送至此。希望能够帮助大家更好地理解。
建模步骤:
目录
数据包和版本申明
申明:本实验环境为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需要时间序列满足平稳性和非白噪声的要求,所以要用差分法和平滑法(滚动平均和滚动标准差