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计算完成之后的返回的对象进行解析,得到想要的预测值。

你可能感兴趣的:(Python,R语言,时间序列分析)