Python時間序列預測:用rpy2調用R的forecast包

1.問題描述

在時間序列預測上,R語言明顯優於Python。

R中forecast包是很強大的時間序列預測包。例如forecast::nnetar,是用神經網絡對時間序列進行迴歸預測的,python裏確沒有完全相同的函數來實現;R中的forecast::auto.arima感覺比Python的pyramid.auto_arima快得多。

藉助rpy2包,Python可以調用R語言強大的時間序列預測API,可以方便的使用Python來進行時間序列預測。

2.安裝rpy2

ubuntu安裝是常規的安裝方法:

sudo pip3 install rpy2

3.調用R函數

R forecast包裏有很多函數,例如auto.arima()、ets()、tbats()等算法,都可以用下述的方法調用。

以R中的神經網絡迴歸預測nnetar()爲例,用Python調用它的步驟如下(假設時間序列是data,在python中它的類型是list,data=[data1,data2,data3,…])

在R中用nnetar()的預測代碼

library(‘forecast’)
#訓練模型,注意此處data是R中的ts對象,需要用data=ts(data,frequency=T)轉化一下,T爲序列的週期。
data=ts(c(data1,data2,data3,...),freqency=T)
model=nnetar(data)
#下面的h是要預測的數據點的個數,假設爲8
pred=forecast(model,h=8)

在python裏的操作和上述步驟對應:

#導入rpy2包
import rpy2.robjects as robjects
#導入forecast包———rpy2裏面,執行R語言的方法是 robjects.r('Rcode')
robjects.r('library(forecast)')
#下面的四行其實是將Python的list構造成R語言中需要的計算格式,R語言的輸入是需要ts對象。
#R中的數組和Python的list不同,需要轉化一下
#forecast(nnetar(ts(c(data1,data2,data3,...),frequency=T)))
str_list = ','.join([str(i) for i in data])                
str_array = 'ts(c(' + str_list + '),frequency=%d)'%T
str_model = 'nnetar(%s)' % str_array
str_forcast = 'forecast(%s,h=%d)' % (str_model, h)
#調用上述的字符串,在R中計算
res = robjects.r(str_forcast)
#需要對R計算完成之後的返回的結果進行解析一下,見[說明1]
pred = list(res[-1])

[說明1]:上述的最後一步pred = list(res[-1]),需要說明的是,不同的預測算法,對於R預測完成後返回的對象,需要自己去探索解析一下,從中剝離出需要預測的值,有的可能是pred = list(res[-2])。例如有的算法,默認會返回預測值不同置信區間的上界、預測值的下界等多個值,因此需要去R中檢查一下,自己需要的值(一般是預測值的均值)是哪一個。

4.總結

用Python調用R中forecast包的過程就是以下幾步:

(1)用rpy2 導入forecast;

(2)把Python中的數據格式(一般是list)改造成R中可以執行的格式,得到一個可能較長的字符串;

(3)用rpy2執行上述字符串;

(4)對R計算完成之後的返回的對象進行解析,得到想要的預測值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章