移動平均可以使時間序列變平滑,是典型的有序計算問題,其基本算法是:將N個連續(xù)的時間序列成員作為一個集合,計算該集合的平均值,并逐項推移該集合。下面用一個例子來說明R計算移動平均的方法。
成都地區(qū)優(yōu)秀IDC服務(wù)器托管提供商(創(chuàng)新互聯(lián)公司).為客戶提供專業(yè)的四川雅安電信機房,四川各地服務(wù)器托管,四川雅安電信機房、多線服務(wù)器托管.托管咨詢專線:028-86922220
案例描述:
數(shù)據(jù)框sales有兩個字段:日期和當日銷售額,需要計算三日移動平均值。具體算法是:求出前一日、當日、后一日的銷售額平均值,并逐日推移。部分源數(shù)據(jù)如下:
代碼:
filter(sales$Amount/3, rep(1, 3))
計算結(jié)果:
代碼解讀:
R語言可以用函數(shù)filter計算移動平均值,代碼簡短,非常方便。
函數(shù)filter雖然很方便,但初學(xué)者卻不易理解。比如sales$Amount/3的本意是將Amount字段中的當前值除以3,但用在filter函數(shù)里卻能將前后三個值相加再除以三。表達式rep(1,3)的值為[1,1,1],用在這里卻能指定取數(shù)范圍。另外,filter的函數(shù)名和參數(shù)名中既沒有“平均”,也沒有“移動”,許多R語言開發(fā)者都不知道它可以用來計算移動平均值。
事實上,函數(shù)filter是個通用的線性過濾器,它的作用不止計算移動平均值這么簡單。其完整的函數(shù)說明如下:filter(x, filter, method= c("convolution", "recursive"),sides = 2,circular = FALSE, init)。
如果想改動一下算法,代碼就會更難理解,比如要計算當日、前一日、前兩日這三天的移動平均值,不能寫成:filter(sales$Amount/3,rep(0,2)),而應(yīng)該是filter(sales$Amount/3,rep(1,3), sides = 1)。
總結(jié): R語言可以計算移動平均值,但代碼難理解。
第三方解決方案
本案例也可以用Python、集算器、Perl等語言來實現(xiàn)。和R語言一樣,這幾種語言都可以進行數(shù)據(jù)的統(tǒng)計分析,都可以計算移動平均值,下面簡單介紹Python和集算器的解決方案。
Python(pandas)
Pandas是Python的第三方庫函數(shù),其基本數(shù)據(jù)類型仿照R中的數(shù)據(jù)框,具有很強的結(jié)構(gòu)化數(shù)據(jù)處理能力,目前最新版本是0.14。代碼如下:
pandas.stats.moments.rolling_mean(sales["Amount"],3)
rolling_mean這個函數(shù)名一目了然,即使剛接觸pandas的開發(fā)者也能輕易查到這個函數(shù),rolling_mean的用法也很簡潔,第一個參數(shù)是被計算的序列,第二個參數(shù)是N日移動平均值中的N。
集算器
集算器擅長以敏捷語法自由表達業(yè)務(wù)邏輯,其相對位置表達式可以方便地解決有序計算中的難題。代碼所示:
sales.(Amount{-1,1}.avg())
代碼中的{-1,1}表示相對區(qū)間,即前一日和后一日之間的三天??梢钥吹?,使用相對區(qū)間可以直觀地計算移動平均值,而且更加靈活。比如同樣改動算法:計算當日、前一日、前兩日這三天的移動平均值,集算器只需將區(qū)間改為{-2,0}。
相對區(qū)間是個集合,集算器還可以表達相對位置的元素,比如銷售增長額可以用sales(Amount -Amount[-1])來直觀計算,而R語言和Python就沒這么好理解。
網(wǎng)站標題:R語言計算移動平均的方法
分享路徑:http://chinadenli.net/article24/jiidje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、、App設(shè)計、標簽優(yōu)化、用戶體驗、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)