您好,登錄后才能下訂單哦!
移動(dòng)平均可以使時(shí)間序列變平滑,是典型的有序計(jì)算問題,其基本算法是:將N個(gè)連續(xù)的時(shí)間序列成員作為一個(gè)集合,計(jì)算該集合的平均值,并逐項(xiàng)推移該集合。下面用一個(gè)例子來說明R計(jì)算移動(dòng)平均的方法。
案例描述:
數(shù)據(jù)框sales有兩個(gè)字段:日期和當(dāng)日銷售額,需要計(jì)算三日移動(dòng)平均值。具體算法是:求出前一日、當(dāng)日、后一日的銷售額平均值,并逐日推移。部分源數(shù)據(jù)如下:
代碼:
filter(sales$Amount/3, rep(1, 3))
計(jì)算結(jié)果:
代碼解讀:
R語言可以用函數(shù)filter計(jì)算移動(dòng)平均值,代碼簡短,非常方便。
函數(shù)filter雖然很方便,但初學(xué)者卻不易理解。比如sales$Amount/3的本意是將Amount字段中的當(dāng)前值除以3,但用在filter函數(shù)里卻能將前后三個(gè)值相加再除以三。表達(dá)式rep(1,3)的值為[1,1,1],用在這里卻能指定取數(shù)范圍。另外,filter的函數(shù)名和參數(shù)名中既沒有“平均”,也沒有“移動(dòng)”,許多R語言開發(fā)者都不知道它可以用來計(jì)算移動(dòng)平均值。
事實(shí)上,函數(shù)filter是個(gè)通用的線性過濾器,它的作用不止計(jì)算移動(dòng)平均值這么簡單。其完整的函數(shù)說明如下:filter(x, filter, method= c("convolution", "recursive"),sides = 2,circular = FALSE, init)。
如果想改動(dòng)一下算法,代碼就會(huì)更難理解,比如要計(jì)算當(dāng)日、前一日、前兩日這三天的移動(dòng)平均值,不能寫成:filter(sales$Amount/3,rep(0,2)),而應(yīng)該是filter(sales$Amount/3,rep(1,3), sides = 1)。
總結(jié): R語言可以計(jì)算移動(dòng)平均值,但代碼難理解。
第三方解決方案
本案例也可以用Python、集算器、Perl等語言來實(shí)現(xiàn)。和R語言一樣,這幾種語言都可以進(jìn)行數(shù)據(jù)的統(tǒng)計(jì)分析,都可以計(jì)算移動(dòng)平均值,下面簡單介紹Python和集算器的解決方案。
Python(pandas)
Pandas是Python的第三方庫函數(shù),其基本數(shù)據(jù)類型仿照R中的數(shù)據(jù)框,具有很強(qiáng)的結(jié)構(gòu)化數(shù)據(jù)處理能力,目前最新版本是0.14。代碼如下:
pandas.stats.moments.rolling_mean(sales["Amount"],3)
rolling_mean這個(gè)函數(shù)名一目了然,即使剛接觸pandas的開發(fā)者也能輕易查到這個(gè)函數(shù),rolling_mean的用法也很簡潔,第一個(gè)參數(shù)是被計(jì)算的序列,第二個(gè)參數(shù)是N日移動(dòng)平均值中的N。
集算器
集算器擅長以敏捷語法自由表達(dá)業(yè)務(wù)邏輯,其相對(duì)位置表達(dá)式可以方便地解決有序計(jì)算中的難題。代碼所示:
sales.(Amount{-1,1}.avg())
代碼中的{-1,1}表示相對(duì)區(qū)間,即前一日和后一日之間的三天??梢钥吹?,使用相對(duì)區(qū)間可以直觀地計(jì)算移動(dòng)平均值,而且更加靈活。比如同樣改動(dòng)算法:計(jì)算當(dāng)日、前一日、前兩日這三天的移動(dòng)平均值,集算器只需將區(qū)間改為{-2,0}。
相對(duì)區(qū)間是個(gè)集合,集算器還可以表達(dá)相對(duì)位置的元素,比如銷售增長額可以用sales(Amount -Amount[-1])來直觀計(jì)算,而R語言和Python就沒這么好理解。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。