Chapter 11 应用系统负载分析及磁盘容量预测

根据企业历史磁盘数据,采用时间序列的方法预测未来使用情况,据此判断预警级别。

目录

一、数据预处理

1.11 代码:

1.12 结果:

二、模型建立

2.1 平稳性检验

2.11 代码: 

2.12 结果:

2.2 白噪声检验

2.21 代码:

2.22 结果:

2.3 模型的识别

2.31 代码:

2.32 结果:

2.4 模型的检验

2.41 代码:

2.42 结果:

2.5 模型的评价

2.51 代码: 

2.52 结果:

三、模型应用


对以下形式的数据建立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天的磁盘已使用空间的大小,将预测值与磁盘的总容量进行比较,根据使用率的情况判断预警级别。

 

 

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值