《数据分析与挖掘 第十一章 应用系统负载分析与磁盘管理》

应用系统负载分析与磁盘管理

事件分析
应用系统出现故障不是突然瘫痪造成的,而是一个渐变的过程,系统长时间运行,数据持续写入,存储空间逐渐变少,最终磁盘会被写满系统瘫痪,存储空间随时间变化存在关联性,且历史数据对未来的发展存在一定的影响
采用时间序列分析法作分析
数据抽取
我们可以看到原始数据是这样子的:
在这里插入图片描述
首先可以发现有的数据是磁盘容量,有的是磁盘占用大小,这里要研究磁盘占用的趋势问题,所以对磁盘容量没有什么研究的,那么我们只看磁盘占用大小的变化数据,所以只抽取属性TARGET_ID为184的数据:

import pandas as pd

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

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

在这里插入图片描述
数据预处理
对时间分组,确定每天c盘,d盘的使用量:

data_group = data.groupby('COLLECTTIME') #以时间分组
##print(list(data_group))

在这里插入图片描述
这样以每一天分组

构造属性
每台服务器上的NAME,TARGET_ID,ENTITY都是一样的,所以可以将这三个属性值合并构造新的属性:把TARGET_ID直接去掉,因为都是一样的,按照C盘还是D盘分两个属性,分别存放C盘D盘的使用空间,所义筛选之后用用信息就是COLLECTTIME,C盘,D盘,和NAME:

def attr_trans(x): #定义属性变换函数
  #定义四个属性名
  result = pd.Series(index = ['SYS_NAME', 'CWXT_DB:184:C:\\', 'CWXT_DB:184:D:\\','COLLECTTIME'])
##  print(result)
  result['SYS_NAME'] = x['SYS_NAME'].iloc[0]
##  print(result['SYS_NAME'])
  result['COLLECTTIME'] = x['COLLECTTIME'].iloc[0]
##  print(result['COLLECTTIME'])
  result['CWXT_DB:184:C:\\'] = x['VALUE'].iloc[0]
##  print(result['CWXT_DB:184:C:\\'])
  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)

这里为什么要用apply,不直接调用函数attr_trans(data_group)
AttributeError: Cannot access callable attribute ‘iloc’ of ‘SeriesGroupBy’ objects, try using the ‘apply’ method

>>> type(data_group)
<class 'pandas.core.groupby.generic.DataFrameGroupBy'>

我们可以看到data_group是一个dataFrameGroupBy类型的,这种类型的是一个已经分了组的,不能用iloc方法,data_group[’…’].iloc[0]是调用不了的,只能用apply
在这里插入图片描述

在这里插入图片描述
模型构建

  1. 对于处理后的数据进行分组,一个测试集,一个训练集,这里我们把最后5条记录作为测试集

  2. 平稳性检测

为什么要进行平稳性检测呢?
在引入ARMA模型之前,一般课本都会对时间序列的平稳性作一个描述,为什么呢
why stationary?
每一个统计学问题研究,都要做一些假设,如一元线性回归时:y = ax1 + bx2 + c
我们假设:xi不相关且非随机,εi独立同分布服从正态分布
对于时间序列,我们进行的假设就是平稳性假设,平稳的基本思想就是:时间序列的变化与时间无关,不随受时间的影响,这里就是说原始序列没有随机趋势或者确定趋势,就是说没有周期性,这个时间序列的行为与时间无关

那么如果不平稳就做差分处理,直到差分之后是平稳的。
这里用ADF检测方法:

#平稳性检验
import pandas as pd

#参数初始化
discfile = '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:\\'])
#print(adf)
while adf[1] > 0.05: #adf[1]是p值,p小于0.05被认为是平稳的
  diff = diff + 1
  adf = ADF(data['CWXT_DB:184:D:\\'].diff(diff).dropna())
  #print(adf)
print(u'原始序列经过%s阶差分后归于平稳,p值为%s' %(diff, adf[1]))

diff = 1,只用进行一阶差分,while语句循环了一次,adf[1]就小于0.05了

本里啊原序列p为0.08384889634121945,说明还是有一点不平稳的
经过1阶差分后归于平稳,p值为4.792591263393756e-07,基本就是等于零了

  1. 白噪声检测

为了验证序列中有用信息是否已经完全被提取完了,如果序列为白噪声序列,表示序列信息已经完全被提取,剩下的全是随机扰动,无法预测和使用:

#白噪声检验
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)

原始序列为非白噪声序列,对应的p值为:9.95850372977218e-06
一阶差分该序列为白噪声序列,对应的p值为:0.1143302597764247

  1. 模式识别

首先,从时间的角度可以把一个序列基本分为3类:

纯随机序列(白噪声序列),这时候可以停止分析,因为就像预测下一次硬币哪一面朝上一样毫无规律。

平稳非白噪声序列,它们的均值和方差是常数,对于这类序列,有成熟的模型来拟合这个序列在未来的发展状况,如AR,MA,ARMA等(具体模型算法及实现在后面)

非平稳序列,一般做法是把他们转化为平稳的序列,在按照平稳序列的算法进行拟合。如果经过差分后平稳,则应使用ARIMA模型进行拟合。

这里序列是经过差分得到的稳定序列,用ARIMA模型进行拟合

采用极大似然比的方法进行模型的参数估计,估计各个参数的值,然后针对各个不同的模型,采用BIC信息对准对模型定阶,确定p,q,选择最优模型

#确定最佳p、d、q值,d为差分数 = 1
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) #把序列变成DataFrame
print(bic_matrix)
p,q = bic_matrix.stack().idxmin() #先用stack展平,然后用idxmin找出最小值位置。
print(u'BIC最小的p值和q值为:%s、%s' %(p,q))

得出bic_matrix:
在这里插入图片描述
将bic_matrix展平之后:
在这里插入图片描述
最小的地方p,q为1,1,bic_matrix最小值是1271.89

  1. 模型检验
    故用ARIMA(1,1,1)模型,确定了模型之后,要对模型残差(pred_error)进行检测,看它是不是白噪声,如果不是,说明还有有用信息,需要修改模型,或者进一步提取:
#模型检验
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, (1, 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)
print(p)
h = (p < 0.05).sum() #p值小于0.05,认为是非白噪声。
if h > 0:
  print(u'模型ARIMA(1,1,1)不符合白噪声检验')
else:
  print(u'模型ARIMA(1,1,1)符合白噪声检验')

[0.12693408 0.28086421 0.10578862 0.15967809 0.2170039 0.31311129
0.29593918 0.22817567 0.18261383 0.1274781 0.06287558 0.09080388]
模型ARIMA(1,1,1)符合白噪声检验
说明只剩白噪声了,有用信息都被提取完了

  1. 模型预测
    这里,假设已经通过模型的除了预测值,得出了预测值与真实值:
    在这里插入图片描述
    模型评估
    采用三个指标评价该模型:
    平均绝对误差,均方根误差,平均绝对百分误差
#计算预测误差
import pandas as pd

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

#计算误差
abs_ = (data[u'预测值'] - data[u'实际值']).abs()
print(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_))

0 0.784967
1 1.230866
2 1.721474
3 1.184180
4 0.612402
dtype: float64
平均绝对误差为:1.1068,
均方根误差为:1.1723,
平均绝对百分误差为:0.012610。

时间序列的ARIMA,AR,MA,ARMA模型
参考

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值