R語言計算移動平均的方法

來源:互聯網
上載者:User

標籤:python   esproc   集算器   移動平均   

    移動平均可以使時間序列變平滑,是典型的有序計算問題,其基本演算法是:將N個連續的時間序列成員作為一個集合,計算該集合的平均值,並逐項推移該集合。下面用一個例子來說明R計算移動平均的方法。

案例描述:

資料框sales有兩個欄位:日期和當日銷售額,需要計算三日移動平均值。具體演算法是:求出前一日、當日、後一日的銷售額平均值,並逐日推移。部分來源資料如下:

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/4C/50/wKiom1Q7TD2yq4zkAAB6yHVaESg524.jpg" style="float:none;" title="r_moving_average_1.jpg" alt="wKiom1Q7TD2yq4zkAAB6yHVaESg524.jpg" />

    代碼:

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

    計算結果:

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/4C/51/wKioL1Q7THWyQ_rIAADKHNC-eOA961.jpg" style="float:none;" title="r_moving_average_2.jpg" alt="wKioL1Q7THWyQ_rIAADKHNC-eOA961.jpg" />

代碼解讀:

    R語言可以用函數filter計算移動平均值,代碼簡短,非常方便。

    函數filter雖然很方便,但初學者卻不易理解。比如sales$Amount/3的本意是將Amount欄位中的當前值除以3,但用在filter函數裡卻能將前後三個值相加再除以三。運算式rep(1,3)的值為[1,1,1],用在這裡卻能指定取數範圍。另外,filter的函數名和參數名中既沒有“平均”,也沒有“移動”,許多R語言開發人員都不知道它可以用來計算移動平均值。

    事實上,函數filter是個通用的線性過濾器,它的作用不止計算移動平均值這麼簡單。其完整的函數說明如下:filter(x, filter, method= c("convolution", "recursive"),sides = 2,circular = FALSE, init)。

    如果想改動一下演算法,代碼就會更難理解,比如要計算當日、前一日、前兩日這三天的移動平均值,不能寫成:filter(sales$Amount/3,rep(0,2)),而應該是filter(sales$Amount/3,rep(1,3), sides = 1)。


總結: R語言可以計算移動平均值,但代碼難理解。

 

第三方解決方案

    本案例也可以用Python、集算器、Perl等語言來實現。和R語言一樣,這幾種語言都可以進行資料的統計分析,都可以計算移動平均值,下面簡單介紹Python和集算器的解決方案。

    Python(pandas)

    Pandas是Python的第三方庫函數,其基礎資料型別 (Elementary Data Type)仿照R中的資料框,具有很強的結構化資料處理能力,目前最新版本是0.14。代碼如下:

         pandas.stats.moments.rolling_mean(sales["Amount"],3)

    rolling_mean這個函數名一目瞭然,即使剛接觸pandas的開發人員也能輕易查到這個函數,rolling_mean的用法也很簡潔,第一個參數是被計算的序列,第二個參數是N日移動平均值中的N。

    集算器

    集算器擅長以敏捷文法自由表達商務邏輯,其相對位置運算式可以方便地解決有序計算中的難題。代碼所示:

         sales.(Amount{-1,1}.avg())

    代碼中的{-1,1}表示相對區間,即前一日和後一日之間的三天。可以看到,使用相對區間可以直觀地計算移動平均值,而且更加靈活。比如同樣改動演算法:計算當日、前一日、前兩日這三天的移動平均值,集算器只需將區間改為{-2,0}。

    相對區間是個集合,集算器還可以表達相對位置的元素,比如銷售增長額可以用sales(Amount -Amount[-1])來直觀計算,而R語言和Python就沒這麼好理解。


R語言計算移動平均的方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.