根据企业历史磁盘数据,采用时间序列的方法预测未来使用情况,据此判断预警级别。
目录
对以下形式的数据建立ARIMA模型
一、数据预处理
提取相关的数据,进行变换,得到建模所需的数量类型及格式。
1.11 代码:
# -*- coding: utf-8 -*-
import pandas as pd
# 1)参数初始化
discfile='.../data/discdata.xls' # 磁盘原始数据
transformeddata='.../data/discdata_processed.xls' #变换后数据
data = pd.read_excel(discfile) # 读取数据
# 2)选择对象数据
discdata_select = data[data['TARGET_ID'] == 184].copy() # 只保留TARGET_ID为184的数据
# 3)属性变换
data_group = discdata_select.groupby('COLLECTTIME') # 以时间分组
def attr_trans(x): # 定义属性变换函数
result = pd.Series(index = ['SYS_NAME', 'CWXT_DB:184:C:\\', 'CWXT_DB:184:D:\\', 'COLLECTTIME'])
result['SYS_NAME'] = x['SYS_NAME'].iloc[0]
result['COLLECTTIME'] = x['COLLECTTIME'].iloc[0]
result['CWXT_DB:184:C:\\'] = x['VALUE'].iloc[0]
result['CWXT_DB:184:D:\\'] = x['VALUE'].iloc[1]
return result
data_processed = data_group.apply(attr_trans) # 逐组处理
data_processed.to_excel(transformeddata, index = False)
1.12 结果:
data.head()
Out[16]:
SYS_NAME NAME TARGET_ID DESCRIPTION ENTITY VALUE COLLECTTIME
0 财务管理系统 CWXT_DB 184 磁盘已使用大小 C:\ 3.427079e+07 2014-10-01
1 财务管理系统 CWXT_DB 184 磁盘已使用大小 D:\ 8.026259e+07 2014-10-01
2 财务管理系统 CWXT_DB 183 磁盘容量 C:\ 5.232332e+07 2014-10-01
3 财务管理系统 CWXT_DB 183 磁盘容量 D:\ 1.572833e+08 2014-10-01
4 财务管理系统 CWXT_DB 184 磁盘已使用大小 C:\ 3.432890e+07 2014-10-02
discdata_select.head()
Out[18]:
SYS_NAME NAME TARGET_ID DESCRIPTION ENTITY VALUE COLLECTTIME
0 财务管理系统 CWXT_DB 184 磁盘已使用大小 C:\ 34270787.33 2014-10-01
1 财务管理系统 CWXT_DB 184 磁盘已使用大小 D:\ 80262592.65 2014-10-01
4 财务管理系统 CWXT_DB 184 磁盘已使用大小 C:\ 34328899.02 2014-10-02
5 财务管理系统 CWXT_DB 184 磁盘已使用大小 D:\ 83200151.65 2014-10-02
8 财务管理系统 CWXT_DB 184 磁盘已使用大小 C:\ 34327553.50 2014-10-03
data_processed.head()
Out[19]:
SYS_NAME CWXT_DB:184:C:\ CWXT_DB:184:D:\ COLLECTTIME
COLLECTTIME
2014-10-01 财务管理系统 34270787.33 80262592.65 2014-10-01
2014-10-02 财务管理系统 34328899.02 83200151.65 2014-10-02
2014-10-03 财务管理系统 34327553.50 83208320.00 2014-10-03
2014-10-04 财务管理系统 34288672.21 83099271.65 2014-10-04
2014-10-05 财务管理系统 34190978.41 82765171.65 2014-10-05
二、模型建立
2.1 平稳性检验
平稳性检验的方法一般有:1)时序图检验;2)自相关图检验;3)单位根检验
这里使用ADF单位根检验法:
H0:有单位根;H1:无单位根
P<0.05,表示接受H1。
2.11 代码:
# -*- coding: utf-8 -*-
# 平稳性检验
import pandas as pd
# 参数初始化
discfile='.../data/discdata_processed.xls'
data = pd.read_excel(discfile)
data = data.iloc[ : len(data)-5] # 不检测最后5个数据
# 平稳性检测
from statsmodels.tsa.stattools import adfuller as ADF
diff = 0
adf = ADF(data['CWXT_DB:184:D:\\'])
while adf[1] > 0.05:
diff = diff + 1
adf = ADF(data['CWXT_DB:184:D:\\'].diff(diff).dropna())
print(u'原始序列经过%s阶差分后归于平稳,p值为%s' %(diff, adf[1]))
2.12 结果:
原始序列经过1阶差分后归于平稳,p值为4.792591263393756e-07
2.2 白噪声检验
白噪声检验也称为纯随机检验,当数据非白噪声时,才有必要进行下一步建模。常用的检验统计量有:1)Q统计量;2)LB统计量
这里使用LB统计量,
H0:白噪声;H1:非白噪声
P<0.05时,接受H1。
2.21 代码:
#-*- coding: utf-8 -*-
# 白噪声检验
import pandas as pd
# 参数初始化
discfile = '.../data/discdata_processed.xls'
data = pd.read_excel(discfile)
data = data.iloc[: len(data)-5] #不使用最后5个数据
# 白噪声检测
from statsmodels.stats.diagnostic import acorr_ljungbox
[[lb], [p]] = acorr_ljungbox(data['CWXT_DB:184:D:\\'], lags = 1)
if p < 0.05:
print(u'原始序列为非白噪声序列,对应的p值为:%s' %p)
else:
print(u'原始该序列为白噪声序列,对应的p值为:%s' %p)
[[lb], [p]] = acorr_ljungbox(data['CWXT_DB:184:D:\\'].diff().dropna(), lags = 1)
if p < 0.05:
print(u'一阶差分序列为非白噪声序列,对应的p值为:%s' %p)
else:
print(u'一阶差分该序列为白噪声序列,对应的p值为:%s' %p)
2.22 结果:
原始序列为非白噪声序列,对应的p值为:9.95850372977218e-06
一阶差分该序列为白噪声序列,对应的p值为:0.1143302597764247
2.3 模型的识别
AIC、BIC、HQIC越小越好,这里根据BIC来定阶。
2.31 代码:
# -*- coding: utf-8 -*-
# 确定最佳p、d、q值
import pandas as pd
import numpy as np
# 参数初始化
discfile = '.../data/discdata_processed.xls'
data = pd.read_excel(discfile, index_col = 'COLLECTTIME')
data = data.iloc[: len(data)-5] #不使用最后5个数据
xdata = data['CWXT_DB:184:D:\\']
from statsmodels.tsa.arima_model import ARIMA
# 定阶
pmax = int(len(xdata)/10) # 一般阶数不超过length/10
qmax = int(len(xdata)/10) # 一般阶数不超过length/10
bic_matrix = [] # bic矩阵
for p in range(pmax+1):
tmp = []
for q in range(qmax+1):
try: # 存在部分报错,所以用try来跳过报错。
tmp.append(ARIMA(xdata, (p,1,q)).fit().bic)
except:
tmp.append(np.nan)
bic_matrix.append(tmp)
bic_matrix = pd.DataFrame(bic_matrix) # 从中可以找出最小值
p,q = bic_matrix.stack().idxmin() # 先用stack展平,然后用idxmin找出最小值位置。(注意:此处需要保证数据全部为数值型,不然会报错)
print(u'BIC最小的p值和q值为:%s、%s' %(p,q))
2.32 结果:
BIC最小的p值和q值为:1、1
2.4 模型的检验
这里检验残差是否为白噪声。如果不是白噪声,说明残差中还存在有用的信息,需要修改模型进一步提取。
2.41 代码:
# -*- coding: utf-8 -*-
# 模型检验
import pandas as pd
# 参数初始化
discfile = '.../data/discdata_processed.xls'
lagnum = 12 # 残差延迟个数
data = pd.read_excel(discfile, index_col = 'COLLECTTIME')
data_train = data.iloc[: len(data)-5] # 不使用最后5个数据
xdata = data_train['CWXT_DB:184:D:\\']
from statsmodels.tsa.arima_model import ARIMA # 建立ARIMA(0,1,1)模型
arima = ARIMA(xdata, (0, 1, 1)).fit() # 建立并训练模型
xdata_pred = arima.predict(typ = 'levels') # 预测
pred_error = (xdata_pred - xdata).dropna() # 计算残差
from statsmodels.stats.diagnostic import acorr_ljungbox # 白噪声检验
lb, p= acorr_ljungbox(pred_error, lags = lagnum)
h = (p < 0.05).sum() # p值小于0.05,认为是非白噪声。
if h > 0:
print(u'模型ARIMA(0,1,1)不符合白噪声检验')
else:
print(u'模型ARIMA(0,1,1)符合白噪声检验')
2.42 结果:
模型ARIMA(0,1,1)符合白噪声检验
2.5 模型的评价
这里用:1)平均决定误差、2)均方根误差、3)平均绝对百分比为误差 来反映算法的预测精度。
2.51 代码:
# -*- coding: utf-8 -*-
import pandas as pd
from statsmodels.tsa.arima_model import ARIMA
# 1)预测最后5个数据的情况
# 参数初始化
discfile = '.../data/discdata_processed.xls'
data = pd.read_excel(discfile, index_col = 'COLLECTTIME')
data_train = data.iloc[: len(data)-5] # 不使用最后5个数据
xdata = data_train['CWXT_DB:184:D:\\']
arima = ARIMA(xdata, (0, 1, 1)).fit() # 建立并训练ARIMA(0,1,1)模型
# 预测后5个数据
temp = pd.DataFrame(arima.forecast(5))
target = data[len(data)-5 :].iloc[:,-1]
predict = pd.DataFrame(temp[0:1].T.values, index=target.index)
data_com = pd.concat([target,predict],axis=1)
data_com.columns = [u'实际值',u'预测值']
resultfile = '.../data/data_com.xls'
data_com.to_excel(resultfile)
# 2)计算预测误差
# 参数初始化
file = '.../data/data_com.xls'
data = pd.read_excel(file, index_col=0)
# 计算误差
abs_ = (data[u'预测值'] - data[u'实际值']).abs()
mae_ = abs_.mean() # mae
rmse_ = ((abs_**2).mean())**0.5 # rmse
mape_ = (abs_/data[u'实际值']).mean() # mape
print(u'平均绝对误差为:%0.4f,\n均方根误差为:%0.4f,\n平均绝对百分误差为:%0.6f。' %(mae_, rmse_, mape_))
2.52 结果:
data_com
Out[28]:
实际值 预测值
COLLECTTIME
2014-11-12 87249335.55 8.80343e+07
2014-11-13 86986142.20 8.8217e+07
2014-11-14 86678240.00 8.83997e+07
2014-11-15 89766600.00 8.85824e+07
2014-11-16 89377527.25 8.87651e+07
平均绝对误差为:1106777.8545,
均方根误差为:1172347.7603,
平均绝对百分误差为:0.012610。
三、模型应用
将磁盘的使用量与总容量进行比较,根据使用率制定预警级别。
每日定时提取服务器的数据,预处理后运用该模型预测未来5天的磁盘已使用空间的大小,将预测值与磁盘的总容量进行比较,根据使用率的情况判断预警级别。