完整代码和分析
实验介绍
实验背景
大型企业都会有自己的办公自动化系统,应用系统在日常运行时,会对底层软、硬件造成负荷,显著影响应用系统性能。底层任何一种资源负载过大,都可能会引起应用系统性能下降甚至瘫痪。因此需要关注服务器、数据库、中间件和存储设备的运行状态,及时了解当前应用系统的负载情况,以便提前预防,确保系统安全稳定运行。
实验目的
-
针对历史磁盘数据,采用时间序列分析方法,预测应用系统服务器磁盘已使用空间大小。
-
根据用户需求设置不同的预警等级,将预测值与容量值进行比较,对其结果进行预警判断,为系统管理员提供定制化的预警提示。
分析方法与过程
由于存储空间随时间变化存在很强的关联性,且历史数据对未来的发展存在一定的影响。故本实验采用时间序列分析法对磁盘已使用空间进行预测分析。
模型介绍
本次实验我们将使用时间序列分析法来数据进行构造。
首先来认识一下ARIMA模型。ARIMA,差分自回归滑动平均模型,又称求合自回归滑动平均模型。是时间序列预测分析方法之一。
ARIMA(p,d,q)中,AR是“自回归”,p为自回归项数;MA是“滑动平均”,q为滑动平均项数,d是使之成为平稳序列所做的差分次数(阶数)。
ARIMA模型运用的流程:
- 根据时间序列的散点图、自相关函数和偏自相关函数图识别其平稳性。
- 对非平稳的时间序列数据进行平稳化处理。直到处理后的自相关函数和偏自相关函数的数值非显著非零。
- 根据所识别出来的特征建立相应的时间序列模型。平稳化处理后,若偏自相关函数是截尾的,而自相关函数是拖尾的,则建立AR模型;若偏自相关函数是拖尾的,而自相关函数是截尾的,则建立MA模型;若偏自相关函数和自相关函数均是拖尾的,则序列适合ARMA模型。
- 利用已通过检验的模型进行预测。
那么,如何识别时间序列的平稳性?
平稳性检验
识别序列是否平稳,一般有三种方法:看图法、自相关系数和偏相关系数、单位根检验(ADF)。
我们先来简单介绍一下看图法:
看图法
这里的“图”指的是时序图,即某指随时间变化的时序图。平稳序列的图a是围绕一个常数上下波动。而不平稳的图b,则是用明显的增长或减少的趋势。
自相关系数和偏相关系数
这里会涉及到两个定义——截尾和拖尾。
平稳序列的自相关图和偏相关图要么都是拖尾要么都是截尾。截尾就是在某阶之后,系数都为 0 ,怎么理解呢,看上面偏相关的图,当阶数为 1 的时候,系数值还是很大, 0.914. 二阶长的时候突然就变成了 0.050. 后面的值都很小,认为是趋于 0 ,这种状况就是截尾。再就是拖尾,拖尾就是有一个衰减的趋势,但是不都为 0 。自相关图既不是拖尾也不是截尾。以上的图的自相关是一个三角对称的形式,这种趋势是单调趋势的典型图形。
c. 单位根检验(ADF)
若单位根检验p值小于0.05则认为是平稳的。
对于不平稳的序列又该如何处理呢?
2. 差分处理
差分即取相邻项值差替代当前值,以此来消除一些波动,使数据趋于平稳。
数据抽取
为了抽取出磁盘数据,以属性的标识号(TARGET_ID)与采集指标的时间(COLLECTTIME)为条件,对性能数据进行抽取。本实验抽取2014-10-1至2014-11-16财务管理系统中某一台数据库服务器的磁盘的相关数据。
数据探索分析
本实验采用时序分析法来进行建模。为了建模的需要,需要探索数据的平稳性。
通过时序图可以初步发现数据的平稳性。针对服务器磁盘的使用大小,以天为单位,进行周期性分析。
新建文件,添加如下代码:
import pandas as pd
dataPath = './data/discdata.xls'
data = pd.read_excel(dataPath,encoding='utf-8')
#绘制C、D盘的使用情况时序图
import matplotlib.pyplot as plt
import matplotlib
#配置matplotlib参数
#坐标轴字体
matplotlib.rc('font', **{
'family': 'serif', 'serif': ['SimHei']})
#plt.rcParams['front.sans-serif'] = ['SimHei']
#坐标轴负号
#plt.rcParams['axes.unicode-minus'] = False
pd.to_datetime(data['COLLECTTIME'])
data1 = data[(data['ENTITY'] == 'C:\\') & (data['TARGET_ID'] == 184)]
#设置dataframe索引,修改dataframe,不创建新对象
data1.set_index('COLLECTTIME',inplace = True)
data2 = data[(data['ENTITY'] == 'D:\\') & (data['TARGET_ID'] == 184)]
data2.set_index('COLLECTTIME',inplace = True)
print(data.head())
print(data1.head())
print(data2.head())
运行后,可以看到我们将在这些数据上进行可视化操作: