文章目录

  • 1.背景与目标分析
  • 2.2 数据探索
    • 2.1 查看数据信息
    • 2.2 数据平稳性分析
  • 3 数据预处理
    • 3.1 数据清洗
    • 3.2 数据变换——属性构造
  • 4 模型构建
    • 4.1 确定模型—— ARMA or ARIMA?
    • 4.2 平稳性检测
    • 4.2 白噪声检验
    • 4.3 模型识别(最优模型)
    • 4.4 模型检验
    • 4.5 模型预测
    • 4.5 模型评价
  • 5 预测可视化

《Python数据分析与挖掘实战》的实战部分的第11章的数据——《应用系统负载分析与磁盘容量预测》。

补充原文中的细节代码,并给出文中涉及到的内容的完整代码;

在作者所给代码的基础上增加的内容包括:

1)数据探索时画C盘/D盘已使用空间的时序图,并根据自相关和偏相关图判定平稳性,确定了所用模型是采用ARMA或者ARIMA,而不是AR或者MA;

2)模型构建构建基于ARIMA或者ARMA的模型,采用AIC/BIC/HQ信息准则对模型进行定阶,确定p,q参数,从而选择最优模型;

1.背景与目标分析

目标:根据历史磁盘数据,采用时间序列分析法,来预测应用系统服务器磁盘已经使用空间的大小;

需求:为管理员提供定制化的预警提示。

实质:时间序列—回归

2.2 数据探索

2.1 查看数据信息

inputfile1 = 'discdata.xls'
data = pd.read_excel(inputfile1)
data.head()

data.info()

2.2 数据平稳性分析

d = data[(data['ENTITY']=='C:\\') & (data['TARGET_ID']==184 )]


import matplotlib as mpl
import matplotlib.pyplot as plt
plt.rc('figure',figsize=(9,7))
import datetime
import matplotlib.dates as mdates
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']= Falsefig  = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.set_title(u"C盘已使用空间的时序图")
# ax.set_xlabel(u'日期')
ax.set(xlabel=u'日期',ylabel=u'磁盘使用大小')
# 图上时间间隔显示为10天
ax.xaxis.set_major_locator(mdates.DayLocator(bymonthday=range(1,32), interval=10))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m-%d"))
plt.subplots_adjust(bottom=0.13,top=0.95)
ax.plot(d['COLLECTTIME'],d['VALUE'],'ro-',)fig.autofmt_xdate() #自动根据标签长度进行旋转
'''
for label in ax.xaxis.get_ticklabels():   #此语句完成功能同上label.set_rotation(45)
'''
plt.savefig('c.jpg')
plt.show()


同理,D盘时序图:

可以看出,磁盘数据使用情况都不具备有周期性,他们表现出缓慢性的增长,呈现趋势性。数据非平稳!

3 数据预处理

3.1 数据清洗

一般情况下默认磁盘容量是定值,所以需要剔除磁盘容量重复的数据

data.drop_duplicates(data.columns[:-1],inplace=True)
data.to_excel('dataCleaned.xlsx')

3.2 数据变换——属性构造

df_g = df.groupby('COLLECTTIME').size()
indexpre = df_g.index
data_processed = DataFrame([],index = indexpre, columns=['SYS_NAME','CWXT_DB:184:C:\\','CWXT_DB:184:D:\\'])
data_processed['SYS_NAME'] =  u'财务管理系统'
data_processed['CWXT_DB:184:C:\\'] = df['VALUE'][df['ENTITY']=='C:\\'].values
data_processed['CWXT_DB:184:D:\\'] = df['VALUE'][df['ENTITY']=='D:\\'].values
data_processed.head()

4 模型构建

4.1 确定模型—— ARMA or ARIMA?

ARMA和ARIMA的区别?

不管是ARMA还是ARIMA模型,都是对平稳数据建模。前者是直接针对平稳数据建模,无需进行差分变换;后者则需要先对数据进行差分,差分平稳后再建模。

由于ARIMA/ARMA 模型对时间序列的要求是平稳型,因此需要进行平稳性检验。

通过自相关和偏相关图判定平稳性,并确定所用模型

  • 如果自相关是拖尾,偏相关截尾,则用 AR 算法
  • 如果自相关截尾,偏相关拖尾,则用 MA 算法
  • 如果自相关和偏相关都是拖尾,则用 ARMA 算法, ARIMA 是 ARMA 算法的扩展版,用法类似
# 查看是否序列平稳 自相关图法/时间序列的散点图
from scipy import  stats
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.graphics.api import qqplot
dta = df['CWXT_DB:184:C:\\']# 原数据的的自相关图与偏自相关图
fig = plt.figure(figsize=(12,12))
ax1=fig.add_subplot(411)# 自相关图
fig = sm.graphics.tsa.plot_acf(dta,lags=40,ax=ax1)
ax1.set_title(u'原始数据的自相关图')ax2 = fig.add_subplot(412)# 篇自相关图
fig = sm.graphics.tsa.plot_pacf(dta,lags=40,ax=ax2)
ax2.set_title(u'原始数据的偏相关图')# 一阶差分后的自相关图与偏自相关图
dta= dta.diff(1).dropna() # 注意一定要将查分后的空值去掉再取自相关系数
ax3=fig.add_subplot(413)# 自相关图
fig = sm.graphics.tsa.plot_acf(dta,lags=40,ax=ax3)
ax3.set_title(u'一阶差分后的自相关图')ax4 = fig.add_subplot(414)# 篇自相关图
fig = sm.graphics.tsa.plot_pacf(dta,lags=40,ax=ax4)
ax4.set_title(u'一阶差分后的偏相关图')
plt.savefig('acf_pacf.jpg')
plt.show()


通过自相关图可以发现,该图自相关和偏相关都是拖尾,因此,确定是ARMA算法、ARIMA均可

4.2 平稳性检测

几种平稳性检验方式(以C盘为例)

  • 方法1:时间序列图法

    具体见数据探索部分。通过图形可以看出该序列值不平稳(若平稳,会围绕某值上下晃动)

  • 方法2:单位根检验(ADF)

# 方法:采用单位根检验(ADF)的方法或者时序图的方法(见数据探索模块)
from statsmodels.tsa.stattools import adfuller as ADF
判断D盘数据的平稳性,以及确定几次差分后平稳
x = ADF(df['CWXT_DB:184:C:\\'])
print x
  • 方法3:游程检验
from statsmodels.sandbox.stats.runs import runstest_1samp as RSS
x = RSS(df['CWXT_DB:184:C:\\'])
print x
  • 方法4: 自相关系数法
from statsmodels.tsa.stattools import acf as ACF
x = ACF(df['CWXT_DB:184:C:\\'])
print x
  • 方法5:通过自相关和偏相关图判定

    通过自相关图法/时间序列的散点图,观察平稳性,前面内容已经介绍。

方法2 单位根检验(ADF)

inputfile = 'attrsConstruction.xlsx'
#由于ARIMA 模型对时间序列的要求是平稳型,需要进行平稳性检验
data = pd.read_excel(inputfile)
df = data.iloc[:len(data)-5]# 不使用最后五个数据(作为预测参考)
df
diff = 0

#1)平稳性检测 :判断是否平稳,若不平稳,对其进行差分处理直至平稳
# 方法:采用单位根检验(ADF)的方法或者时序图的方法(见数据探索模块)
# 注意:其他平稳性检验方法见steadyCheck.py文件
from statsmodels.tsa.stattools import adfuller as ADF
diff = 0
# 判断D盘数据的平稳性,以及确定几次差分后平稳
adf = ADF(df['CWXT_DB:184:C:\\'])
print(adf) while adf[1] >= 0.05 : # adf[1]是p值,p值小于0.05认为是平稳的print(adf[1])diff = diff + 1print(diff)adf = ADF(df['CWXT_DB:184:C:\\'].diff(diff).dropna())#注意,差分后使用ADF检验时,必须去掉空值print(u'原始序列经过%s阶差分后归于平稳,p值为%s' % (diff, adf[1]))
df['CWXT_DB:184:C:\\_adf'] = df['CWXT_DB:184:C:\\'].diff(1)

4.2 白噪声检验

  • 目的:验证序列中有用信息是否已经被提取完毕,需要进行白噪声检验。若序列是白噪声序列,说明序列中有用信息已经被提取完,只剩随机扰动
  • 方法:采用LB统计量的方法进行白噪声检验
  • 若没有通过白噪声检验,则需要进行模型识别,识别其模型属于AR、MA还是ARMA。
inputfile2 = 'attrsConstruction.xlsx'
data1 = pd.read_excel(inputfile2)
data1 = data1.iloc[:len(data1)-5]# 不使用最后五个数据(作为预测参考)# 白噪声检测
from statsmodels.stats.diagnostic import acorr_ljungbox[[lb], [p]] = acorr_ljungbox(data1['CWXT_DB:184:C:\\'], lags = 1) ## lags是残差延迟个数
if p < 0.05:print (u'原始序列为非白噪声序列,对应的p值为:%s' % p)
else:print (u'原始序列为白噪声序列,对应的p值为:%s' % p)[[lb], [p]] = acorr_ljungbox(data1['CWXT_DB:184:C:\\'].diff(1).dropna(), lags = 1)
if p < 0.05:print (u'一阶差分序列为非白噪声序列,对应的p值为:%s' % p)
else:print (u'一阶差分序列为白噪声序列,对应的p值为:%s' % p)

4.3 模型识别(最优模型)

  • 方法:采用极大似然比方法进行模型的参数估计,估计各个参数的值。
  • 然后针对各个不同模型,采用信息准则方法(有三种:BIC/AIC/HQ)对模型进行定阶,确定p,q参数,从而选择最优模型。
  • 注意,进行此步时,index需要为时间序列类型
  • 确定最佳p、d、q的值
inputfile3 = 'attrsConstruction.xlsx'
data2 = pd.read_excel(inputfile3,index_col='COLLECTTIME')
xtest_value=data2['CWXT_DB:184:C:\\'][-5:]#测试集
data2 = data2.iloc[:len(data2)-5]# 不使用最后五个数据(作为预测参考)
xdata2 = data2['CWXT_DB:184:C:\\']
# ARIMA(p,d,q)中,AR是自回归,p为自回归项数;MA为滑动平均,q为滑动平均项数,d为使之成为平稳序列所做的差分次数(阶数),由前一步骤知d=1
# from statsmodels.tsa.arima_model import ARIMA#建立ARIMA(p,d,q)模型
from statsmodels.tsa.arima_model import ARMA #建立ARMA(p,q)模型# 定阶
# 目前选择模型常用如下准则!!!!!
# 增加自由参数的数目提高了拟合的优良性,
# AIC/BIC/HQ鼓励数据拟合的优良性但是尽量避免出现过度拟合(Overfitting)的情况。所以优先考虑的模型应是AIC/BIC/HQ值最小的那一个
#* AIC=-2 ln(L) + 2 k 中文名字:赤池信息量 akaike information criterion (AIC)
# * BIC=-2 ln(L) + ln(n)*k 中文名字:贝叶斯信息量 bayesian information criterion (BIC)
# * HQ=-2 ln(L) + ln(ln(n))*k hannan-quinn criterion (HQ)# AIC方式定信息准则 + ARMA --------!!!模型检验中也要对应修改!!!------------------------------pmax = int(len(xdata2)/10) # 一般阶数不超过length/10
qmax = int(len(xdata2)/10) # 一般阶数不超过length/10matrix = [] # aic矩阵
for p in range(pmax+1):tmp = []for q in range(qmax+1):try:#存在部分为空值,会报错
#             tmp.append(ARMA(xdata2, (p,q)).fit().bic) #  BIC方式tmp.append(ARMA(xdata2, (p,q)).fit().aic) #  AIC方式
#             tmp.append(ARMA(xdata2, (p,q)).fit().hq) #  HQ方式except:tmp.append(None)matrix.append(tmp)matrix = pd.DataFrame(matrix) # 从中可以找出最小值
print(matrix)
print(matrix.stack())

4.4 模型检验

# 确定模型后,需要检验其残差序列是否是白噪声,若不是,说明,残差中还存在有用的信息,需要修改模型或者进一步提取。
# 若其残差不是白噪声,重新更换p,q的值,重新确定
import pandas as pd
import numpy as npwhile 1:p, q = matrix.stack().idxmin() # 先展平该表格,然后找出最小值的索引位置print (u'当前AIC最小的p值与q值分别为:%s、%s' % (p,q))lagnum = 12 # 残差延迟个数arma = ARMA(xdata2, (p,q)).fit() # 建立并训练模型xdata_pred = arma.predict() # 预测pred_error = (xdata_pred - xdata2).dropna() # 计算残差# 白噪声检测from statsmodels.stats.diagnostic import acorr_ljungboxlbx, px = acorr_ljungbox(pred_error, lags = lagnum)h = (px < 0.05).sum() # p值小于0.05,认为是非噪声if h > 0:print (u'模型ARMA(%s,%s)不符合白噪声检验' % (p,q))print ('在AIC矩阵中去掉[%s,%s]组合,重新进行计算' % (p,q))matrix.iloc[p,q] =  np.nanarimafail = armacontinueelse:print (p,q)print (u'模型ARMA(%s,%s)符合白噪声检验' % (p,q))break

arma.summary() # 当p,q值为0,0时,summary方法报错

4.5 模型预测

forecast_values, forecasts_standard_error, forecast_confidence_interval = arma.forecast(5)
forecast_values

predictdata = pd.DataFrame(xtest_value)
predictdata.insert(1,'CWXT_DB:184:C:\\_predict',forecast_values)
predictdata.rename(columns={'CWXT_DB:184:C:\\':u'实际值','CWXT_DB:184:C:\_predict':u'预测值'},inplace=True)
result_d = predictdata.applymap(lambda x: '%.2f' % x) # 将表格中各个浮点值都格式化
result_d.to_excel('pedictdata_C_AIC_ARMA.xlsx')
result_d

4.5 模型评价

为了评价时序预测模型效果的好坏,本章采用3个衡量模型预测精度的统计量指标:平均绝对误差、均方根误差、平均绝对百分误差

# -*- coding:utf-8 -*-
import pandas as pdinputfile4 = 'pedictdata_C_AIC_ARMA.xlsx'
result = pd.read_excel(inputfile4,index_col='COLLECTTIME')
result = result.applymap(lambda x: x/10**6)
print result# 计算误差
abs_ = (result[u'预测值']-result[u'实际值']).abs()
mae_ = abs_.mean() # mae平均绝对误差
rmas_ = ((abs_**2).mean())**0.5 #rmas均方根误差
mape_ = (abs_/result[u'实际值']).mean() #mape平均绝对百分误差
# print abs_
print mae_
print rmas_
print mape_
errors = 1.5
print '误差阈值为%s' % errors
if (mae_ < errors) & (rmas_ < errors) & (mape_ < errors):print (u'平均绝对误差为:%.4f, \n均方根误差为:%.4f, \n平均绝对百分误差为:%.4f' % (mae_, rmas_, mape_))print '误差检验通过!'
else:print '误差检验不通过!'

5 预测可视化

inputfile = 'attrsConstruction.xlsx'data = pd.read_excel(inputfile)
df = data.iloc[:len(data)-5]inputfile1 = 'pedictdata_C.xlsx'# 预测值
result = pd.read_excel(inputfile1)
inputfile2 = 'pedictdata_D.xlsx'# 预测值
result1 = pd.read_excel(inputfile2)import matplotlib as mpl
import matplotlib.pyplot as plt
plt.rc('figure',figsize=(9,9))
import datetime
import matplotlib.dates as mdates
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']= False
fig  = plt.figure()
fig.set(alpha=0.2)#设置图标透明度ax = fig.add_subplot(2,1,1)
ax.set_title(u"C盘空间时序预测图")ax.set(xlabel=u'日期',ylabel=u'磁盘使用大小')
# 图上时间间隔显示为10天
ax.xaxis.set_major_locator(mdates.DayLocator(bymonthday=range(1,32), interval=7))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m-%d"))
plt.subplots_adjust(bottom=0.13,top=0.95)
ax.plot(df['COLLECTTIME'],df['CWXT_DB:184:C:\\'],'ro--',)
ax.plot(result['COLLECTTIME'],result[u'实际值'],'g+--',)
ax.plot(result['COLLECTTIME'],result[u'预测值'],'b*-',)
ax.grid(axis='y',linestyle='--')
ax.legend()
fig.autofmt_xdate() #自动根据标签长度进行旋转
'''for label in ax.xaxis.get_ticklabels():   #此语句完成功能同上label.set_rotation(45)
'''ax1 = fig.add_subplot(2,1,2)
ax1.set_title(u"D盘空间时序预测图")
# ax.set_xlabel(u'日期')
ax1.set(xlabel=u'日期',ylabel=u'磁盘使用大小')
# 图上时间间隔显示为10天
ax1.xaxis.set_major_locator(mdates.DayLocator(bymonthday=range(1,32), interval=7))
ax1.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m-%d"))
plt.subplots_adjust(bottom=0.13,top=0.95)
ax1.plot(df['COLLECTTIME'],df['CWXT_DB:184:D:\\'],'co--',)
ax1.plot(result1['COLLECTTIME'],result1[u'实际值'],'m+--',)
ax1.plot(result1['COLLECTTIME'],result1[u'预测值'],'y*-',)
ax1.grid(axis='y',linestyle='--')
ax1.legend()
fig.autofmt_xdate() #自动根据标签长度进行旋转
'''for label in ax.xaxis.get_ticklabels():   #此语句完成功能同上label.set_rotation(45)
'''
plt.savefig('data_predict_pic.jpg')
plt.show()


参考:https://blog.csdn.net/u012063773/article/details/79313645

《Python数据分析与挖掘实战》第11章——应用系统负载分析与磁盘容量预测(时间序列)相关推荐

  1. 数据分析与挖掘实战-应用系统负载分析与磁盘容量预测

    应用系统负载分析与磁盘容量预测 背景 某大型企业为了信息化发展的需要,建设了办公自动化系统.人力资源管理系统.财务管理系统.企业信息门户系统等几大企业级应用系统.因应用系统在日常运行时,会对底层软硬件 ...

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

    根据企业历史磁盘数据,采用时间序列的方法预测未来使用情况,据此判断预警级别. 目录 一.数据预处理 1.11 代码: 1.12 结果: 二.模型建立 2.1 平稳性检验 2.11 代码: 2.12 结 ...

  3. 大数据分析案例:应用系统负载分析与磁盘容量预测

    应用系统负载分析与磁盘容量预测 应用系统在日常运行时,会对底层软.硬件造成负荷,显著影响应用系统性能.应用系统性能的因素包括:服务器.数据库.中间件和存储设备.任何一种资源负载过大,都可能会引起应用系 ...

  4. python数据分析与挖掘实战-第六章拓展偷漏税用户识别

    第六章分别使用了LM神经网络和CART 决策树构建了 电力窃漏电用户自动识别模型,章末提出了拓展思考–偷漏税用户识别. 第六章及拓展思考完整代码 https://github.com/dengsiyi ...

  5. Python数据分析与挖掘实战——第三章

    第三章 数据探索 目录 第三章 数据探索 一.数据探索 二.数据质量分析 1. 主要任务: 2. 缺失值分析 3. 异常值分析 4. 一致性分析 三.数据特征分析 1. 分布分析 2. 对比分析 3. ...

  6. python数据挖掘与分析实战pdf_《Python数据分析与挖掘实战》PDF+完整源码

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 本书共15章,分两个部分:基础篇.实战篇.基础篇介绍了数据挖掘的基本原理,实战篇介绍了一个个真实案例,通过对案例深入浅出的剖析,使读者在不知不觉中通过案例 ...

  7. python数据分析与挖掘实战pdf_《Python数据分析与挖掘实战》PDF+完整源码

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 本书共15章,分两个部分:基础篇.实战篇.基础篇介绍了数据挖掘的基本原理,实战篇介绍了一个个真实案例,通过对案例深入浅出的剖析,使读者在不知不觉中通过案例 ...

  8. python数据分析与挖掘实战张良军_《Python数据分析与挖掘实战》PDF+完整源码

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 本书共15章,分两个部分:基础篇.实战篇.基础篇介绍了数据挖掘的基本原理,实战篇介绍了一个个真实案例,通过对案例深入浅出的剖析,使读者在不知不觉中通过案例 ...

  9. 《Python数据分析与挖掘实战》第7章-聚类+绘制雷达图

    本文是基于<Python数据分析与挖掘实战>的第七章的数据--<航空公司客户价值分析>做的分析对部分代码,做出补充,对原文中的雷达图进行了实现. 1. 背景与目标分析 此项目旨 ...

最新文章

  1. 大工计算机基础在线3,大工16秋《计算机应用基础》在线测试3-满分100分.pdf
  2. 【数据结构】队列之链队列
  3. 根据服务器ip地址查看虚拟目录,IIS虚拟目录实现与文件服务器网络驱动器映射共享...
  4. html使用最ie高版本,从html,css,javascript三方面谈谈“浏览器兼容性”的问题
  5. element 下拉选择_猿实战18——商品发布之类目选择
  6. 将 Sublime 打造成一个 Swift 编辑器
  7. 类名作为方法和形参的返回值
  8. 好看的按钮集合HTML + CSS各种好看按钮组件
  9. OpenCV教程(C++)
  10. 动态网页编程新手入门必读
  11. resetuser.php,帝国CMS-管理员密码重置插件
  12. 什么第一台多媒体电子计算机诞生,第一台多媒体电计算机是哪一年诞生的
  13. 【听歌】Happy programmer's Day
  14. 京东白条三道坎:“白条”如何吸金?
  15. 部落卫队 2281
  16. 电波传播基础公式总结
  17. 王者荣耀角色信息在哪个服务器,怎么查询王者荣耀角色在哪个区
  18. 经典进程同步与互斥问题
  19. 专家:火箭留帕森斯胜追甜瓜 引援可考虑加索尔
  20. c语言led灯汉字编码,单片机led灯板显示汉字程序

热门文章

  1. 纸球的40种折法_折纸系列之恐龙的折法
  2. python将输出结果写入csv_python - 将输出写入CSV文件[处于保留状态] - 堆栈内存溢出...
  3. 判断按钮是否触发单机时间_Mixly基础06:按钮与触摸传感器
  4. dnf服务器是什么系统,什么云服务器可以挂的起dnf
  5. 不要怕伤害你最爱的人
  6. Windows 11规格、功能和电脑要求公布:最低RAM 4GB、储存空间64GB
  7. javaweb后端第1次作业
  8. Literate Programming和产品开发
  9. R语言:利用rhdf5包分别创建单组学,多组学.h5文件
  10. 剑指offer笔记(九)栈和队列