您的位置:首页 > 其它

应用系统负载分析与磁盘容量预测

2017-06-10 13:13 190 查看
需要用到的相关基础知识:

什么是ARIMA模型?

  ARIMA模型全称为自回归移动平均模型(Autoregressive Integrated Moving Average Model,简记ARIMA),是由博克思(Box)和詹金斯(Jenkins)于70年代初提出的一著名时间序列预测方法,所以又称为box-jenkins模型、博克思-詹金斯法。其中ARIMA(p,d,q)称为差分自回归移动平均模型,AR是自回归, p为自回归项; MA为移动平均,q为移动平均项数,d为时间序列成为平稳时所做的差分次数。

ARIMA模型的基本思想

  ARIMA模型的基本思想是:将预测对象随时间推移而形成的数据序列视为一个随机序列,用一定的数学模型来近似描述这个序列。这个模型一旦被识别后就可以从时间序列的过去值及现在值来预测未来值。现代统计方法、计量经济模型在某种程度上已经能够帮助企业对未来进行预测。

非平稳时间序列可以通过差分变成平稳时间序列。

非平稳信号和平稳信号都属于随机信号

最严格的的平稳定义,就是“分布”不随时间的变化而变化。

宽松一点的,就是“一阶矩和二阶矩”不随时间的变化而变化。

二阶(非中心)矩就是对变量的平方求期望,二阶中心矩就是对随机变量与均值(期望)的差的平方求期望。为什么要用平方,因为如果序列中有负数就会产生较大波动,而平方运算就好像对序列添加了绝对值,这样更能体现偏离均值的范围

ACF:自相关系数

PACF:偏自相关系数

这里的p、q和d的调整也不是直接确定的,类似于神经网络有个最优参数

一般自相关图若为q阶截尾则滑动系数为q.若偏自相关图为p阶截尾则自回归系数为p.当然这样判断存在一定主观性,还需结合AIC  BIC值来判断

根据ADF判断平稳性时,如果有单位根,则序列不平稳。

d代表的含义是经过几次差分后,你的数列能变得平稳。

#-*- coding: utf-8 -*-
#属性变换
import pandas as pd

#参数初始化
discfile = '../data/discdata.xls' #磁盘原始数据
transformeddata = '../tmp/discdata_processed.xls' #变换后的数据

data = pd.read_excel(discfile)
data = data[data['TARGET_ID'] == 184].copy() #只保留TARGET_ID为184的数据,其他的删掉

data_group = data.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]#C盘已经使用了多少容量
result['CWXT_DB:184:D:\\'] = x['VALUE'].iloc[1]#D盘已经使用了多少容量
return result

data_processed = data_group.apply(attr_trans) #逐组处理,这个意思是把data_group作为函数入口参数应用到attr_trans中。
data_processed.to_excel(transformeddata, index = False)

#-*- coding: utf-8 -*-
#平稳性检验
import pandas as pd

#参数初始化
discfile = '../data/discdata_processed.xls'
predictnum =5 #不使用最后5个数据

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]))
#-*- 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)

#-*- coding: utf-8 -*-
#确定最佳p、d、q值
import pandas as pd

#参数初始化
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(None)
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))


#-*- coding: utf-8 -*-
#模型检验
import pandas as pd

#参数初始化
discfile = '../data/discdata_processed.xls'
lagnum = 12 #残差延迟个数

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 #建立ARIMA(0,1,1)模型

arima = ARIMA(xdata, (0, 1, 1)).fit() #建立并训练模型
arima.forecast(5)
xdata_pred = arima.predict(typ = 'levels') #预测
print("################################")
print("xdata_pred=",xdata_pred)

print("################################")
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)符合白噪声检验')
print("-----------------------------------------------------")
arima.summary2()
arima.forecast(5)
#-*- coding: utf-8 -*-
#计算预测误差
import pandas as pd

#参数初始化
file = '../data/predictdata.xls'
data = pd.read_excel(file)

#计算误差
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_))


用一句话来概括ARIMA模型,其实就是跟神经网络一样,凑参数、建模型、然后预测。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: