Python數(shù)據(jù)挖掘020-磁盤容量預(yù)測

在系統(tǒng)運(yùn)維中,經(jīng)常會(huì)遇到某個(gè)具體組件發(fā)生故障,進(jìn)而導(dǎo)致整個(gè)應(yīng)用系統(tǒng)癱瘓的情況,所以要及時(shí)對(duì)這些具體組件進(jìn)行跟蹤和預(yù)測,判斷出如果發(fā)生故障,要及時(shí)給予告警。

如下為某個(gè)應(yīng)用系統(tǒng)的拓?fù)潢P(guān)系圖。

image.png

本案例的目的是通過分析歷史磁盤容量相關(guān)數(shù)據(jù),采用時(shí)間序列分析法,預(yù)測應(yīng)用系統(tǒng)服務(wù)器磁盤已使用空間的大小,根據(jù)用戶需求設(shè)定不同的預(yù)警等級(jí),將預(yù)測值和容量值進(jìn)行比較,對(duì)其結(jié)果進(jìn)行預(yù)警判斷,提供定制化預(yù)警的提示。

分析步驟為:

  1. 從數(shù)據(jù)源中選擇型抽取歷史數(shù)據(jù)與每天定時(shí)抽取數(shù)據(jù)。
  2. 對(duì)抽取的數(shù)據(jù)進(jìn)行周期性分析以及數(shù)據(jù)清洗,數(shù)據(jù)變換等操作后,形成建模數(shù)據(jù)。
  3. 采用時(shí)間序列分析法對(duì)建模數(shù)據(jù)進(jìn)行模型的構(gòu)建,利用模型預(yù)測服務(wù)器磁盤已使用情況。
  4. 應(yīng)用模型預(yù)測服務(wù)器磁盤將要使用的情況,通過預(yù)測到的磁盤使用大小與磁盤容量大小按照定制化標(biāo)準(zhǔn)進(jìn)行判斷。

1. 數(shù)據(jù)預(yù)處理

1.1 平穩(wěn)性分析

將原始的時(shí)序型數(shù)據(jù)繪圖,可以觀察到:磁盤的使用情況并不具有周期性,它們表現(xiàn)出緩慢型增長,呈現(xiàn)一定的趨勢性,因此可以初步確認(rèn)數(shù)據(jù)為非平穩(wěn)性。


image.png

1.2 屬性構(gòu)造

原始的磁盤空間數(shù)據(jù)并不是直接可以使用的屬性數(shù)據(jù)集,所以我們需要自己動(dòng)手構(gòu)建屬性,比如


image.png

將上面兩個(gè)樣本的屬性合并為一個(gè)樣本的四個(gè)屬性。代碼為:

data=pd.read_excel(r"E:\PyProjects\DataSet\PyMining\Data\chapter11\demo\data\discdata.xls")
data = data[data['TARGET_ID'] == 184].copy() #只保留TARGET_ID為184的數(shù)據(jù)
# 183表示磁盤容量,而184表示磁盤已使用大小
data_group = data.groupby('COLLECTTIME') #以時(shí)間分組
def attr_trans(x): #定義屬性變換函數(shù)
    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) #逐組處理,每一天構(gòu)成一組,從每一組中提取出value等
data_processed.head(10)
image.png

繪圖查看下C盤和D判斷已使用容量變化趨勢圖為:


image.png
image.png

2. 時(shí)序建模

建模流程圖為:


image.png

首先對(duì)觀測值序列進(jìn)行平穩(wěn)性檢驗(yàn),如果不平穩(wěn),則對(duì)其進(jìn)行差分處理直到差分后的數(shù)據(jù)平穩(wěn),在平穩(wěn)后,對(duì)其進(jìn)行白噪聲檢驗(yàn),如果沒有通過白噪聲檢驗(yàn),就進(jìn)行模型識(shí)別,識(shí)別其模型屬于AR,MA,ARMA中的哪一種模型。

2.1 平穩(wěn)性檢測

為了確定原始數(shù)據(jù)序列中沒有隨機(jī)趨勢或確定趨勢,需要對(duì)數(shù)據(jù)進(jìn)行平穩(wěn)性檢驗(yàn),否則將會(huì)產(chǎn)生偽回歸現(xiàn)象。下面采用單位根檢驗(yàn)(ADF)的方法對(duì)時(shí)序圖進(jìn)行平穩(wěn)性檢驗(yàn)。

data2=data_processed.copy()
#平穩(wěn)性檢測
from statsmodels.tsa.stattools import adfuller as ADF
diff = 0
adf = ADF(data2['CWXT_DB:184:D:\\'])
while adf[1] > 0.05:
    diff = diff + 1
    adf = ADF(data2['CWXT_DB:184:D:\\'].diff(diff).dropna())

print('原始序列經(jīng)過%s階差分后歸于平穩(wěn),p值為%s' %(diff, adf[1]))

結(jié)果為:原始序列經(jīng)過1階差分后歸于平穩(wěn),p值為2.702061091530161e-06

2.2 白噪聲檢驗(yàn)

為了驗(yàn)證序列中有用的信息是否已被提取完畢,需要對(duì)序列進(jìn)行白噪聲檢驗(yàn),如果序列檢驗(yàn)為白噪聲序列,說明序列中有用的信息已經(jīng)被提取完畢,剩下的全都是隨機(jī)擾動(dòng),無法進(jìn)行預(yù)測和使用。下面采用LB統(tǒng)計(jì)量的方法進(jìn)行白噪聲檢驗(yàn)。

#白噪聲檢測
from statsmodels.stats.diagnostic import acorr_ljungbox
[[lb], [p]] = acorr_ljungbox(data2['CWXT_DB:184:D:\\'], lags = 1)
if p < 0.05:
    print('原始序列為非白噪聲序列,對(duì)應(yīng)的p值為:%s' %p)
else:
    print('原始該序列為白噪聲序列,對(duì)應(yīng)的p值為:%s' %p)

[[lb], [p]] = acorr_ljungbox(data2['CWXT_DB:184:D:\\'].diff().dropna(), lags = 1)
if p < 0.05:
    print('一階差分序列為非白噪聲序列,對(duì)應(yīng)的p值為:%s' %p)
else:
    print('一階差分該序列為白噪聲序列,對(duì)應(yīng)的p值為:%s' %p)

結(jié)果為:


image.png

2.3 模型識(shí)別

采用極大似然比方法進(jìn)行模型的參數(shù)估計(jì),估計(jì)各個(gè)參數(shù)的值然后針對(duì)各個(gè)不同模型,采用BIC信息準(zhǔn)則對(duì)模型進(jìn)行定階,確定p,q參數(shù),從而選擇最優(yōu)模型。

from statsmodels.tsa.arima_model import ARIMA

#定階
pmax = int(len(xdata)/10) #一般階數(shù)不超過length/10
qmax = int(len(xdata)/10) #一般階數(shù)不超過length/10
bic_matrix = [] #bic矩陣
for p in range(pmax+1):
    tmp = []
    for q in range(qmax+1):
        try: #存在部分報(bào)錯(cuò),所以用try來跳過報(bào)錯(cuò)。
            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.iloc[:,:-1].stack().argmin() #先用stack展平,然后用idxmin找出最小值位置。
print(u'BIC最小的p值和q值為:%s、%s' %(p,q))

結(jié)果是:BIC最小的p值和q值為:1、1

2.4 模型檢驗(yàn)

模型確定后,需要檢驗(yàn)其殘差序列是否為白噪聲,如果不是白噪聲,說明殘差中還存在有用的信息,需要修改模型或者進(jìn)一步提取。

from statsmodels.tsa.arima_model import ARIMA #建立ARIMA(0,1,1)模型

arima = ARIMA(xdata, (0, 1, 1)).fit() #建立并訓(xùn)練模型
xdata_pred = arima.predict(typ = 'levels') #預(yù)測
pred_error = (xdata_pred - xdata).dropna() #計(jì)算殘差
lagnum = 12 #殘差延遲個(gè)數(shù)
from statsmodels.stats.diagnostic import acorr_ljungbox #白噪聲檢驗(yàn)
lb, p= acorr_ljungbox(pred_error, lags = lagnum)
h = (p < 0.05).sum() #p值小于0.05,認(rèn)為是非白噪聲。
if h > 0:
    print(u'模型ARIMA(0,1,1)不符合白噪聲檢驗(yàn)')
else:
    print(u'模型ARIMA(0,1,1)符合白噪聲檢驗(yàn)')

結(jié)果:模型ARIMA(0,1,1)不符合白噪聲檢驗(yàn),說明殘差序列中還有有用的信息?

2.5 誤差計(jì)算

#計(jì)算誤差
abs_ = (data[u'預(yù)測值'] - data[u'實(shí)際值']).abs()
mae_ = abs_.mean() # mae
rmse_ = ((abs_**2).mean())**0.5 # rmse
mape_ = (abs_/data[u'實(shí)際值']).mean() # mape

print(u'平均絕對(duì)誤差為:%0.4f,\n均方根誤差為:%0.4f,\n平均絕對(duì)百分誤差為:%0.6f。' %(mae_, rmse_, mape_))

參考資料:

《Python數(shù)據(jù)分析和挖掘?qū)崙?zhàn)》張良均等

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,367評(píng)論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,001評(píng)論 3 413
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,213評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,535評(píng)論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,317評(píng)論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,868評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,963評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,090評(píng)論 0 285
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,599評(píng)論 1 331
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,549評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,712評(píng)論 1 367
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,233評(píng)論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,961評(píng)論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,353評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,607評(píng)論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,321評(píng)論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,686評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容