溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

R語言計(jì)算移動(dòng)平均的方法

發(fā)布時(shí)間:2020-07-06 01:54:27 來源:網(wǎng)絡(luò) 閱讀:5635 作者:datanalysis 欄目:編程語言

    移動(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ù)如下:

R語言計(jì)算移動(dòng)平均的方法

    代碼:

    filter(sales$Amount/3, rep(1, 3))

    計(jì)算結(jié)果:

R語言計(jì)算移動(dòng)平均的方法

代碼解讀:

    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)

    PandasPython的第三方庫函數(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就沒這么好理解。


向AI問一下細(xì)節(jié)

免責(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)容。

AI