应用系统负载分析与磁盘容量预测
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'
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)
用一句话来概括ARIMA模型,其实就是跟神经网络一样,凑参数、建模型、然后预测。
什么是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模型,其实就是跟神经网络一样,凑参数、建模型、然后预测。
相关文章推荐
- 9 应用系统负载分析与磁盘容量预测
- 嵌入式系统关键技术分析与开发应用
- 数据仓库如何在电信网络资源分析系统中应用
- 自动抄表系统的市场应用与技术分析
- 晒一下我培训的课程——应用系统性能测试规划、实施与分析
- 在嵌入式Linux系统中应用的GTK+和X分析
- 我国GPS车辆系统应用前景分析
- Full PACS系统功能模块设计及应用案例分析
- 企业应用系统平台软件分析---3. 企业应用平台软件运行时的配合
- 企业应用系统平台软件分析---2. 企业应用平台软件结构层次
- 【转】嵌入式系统关键技术分析与开发应用
- 应用系统功能分析设计方法
- 权限系统应用概要分析
- CodeTEST嵌入式软件在线测试与分析工具在嵌入式系统开发中的应用
- 数据仓库如何在电信网络资源分析系统中应用
- 铁路售票系统应用软件需求分析报告
- 权限系统应用概要分析
- UML的硬伤?UML在系统分析、设计方面的应用理解
- Windows 2003 系统应用故障的分析
- Shell脚本 提取磁盘IO,系统负载Load