如何使用rpy2运行auto.arima

时间:2016-03-19 18:47:20

标签: rpy2

我想从Python调用R的auto.arima函数。我想我还没有完全理解这个界面。有人可以帮助我 - 向R发送时间序列obj,调用预测相关函数并获取结果吗?

这是我到目前为止所做的:

from rpy2.robjects import r
from rpy2.robjects import pandas2ri

#create a python time series
count = range(1, 51)
df['count'] = count
df['date'] = pd.date_range('2016-01-01', '2016-02-19')
df.set_index('date', inlace = True)
df.sort_index(inplace = True)

pandas2ri.activate()
r_timeseries = pandas2ri.py2ri(df)
r('fit <- auto.arima(r_timeseries)')

我想我必须导入一些R包(比如预测)。不确定如何在Python中执行此操作,将python时间序列对象正确传递给R等。

In [63]: r_ts = pandas2ri.py2ri(df)

In [64]: r_ts
Out[64]:
<DataFrame - Python:0x1126a93f8 / R:0x7ff7bfa51bc8>
[IntVector]
  X0: <class 'rpy2.robjects.vectors.IntVector'>
  <IntVector - Python:0x1126a96c8 / R:0x7ff7be1af1c0>
[       1,        2,        3, ...,       48,       49,       50]

而且,当我尝试调用预测时

In [83]: x = r('forecast(r_ts)')
/Library/Python/2.7/site-packages/rpy2/robjects/functions.py:106: UserWarning: Error in forecast(r_ts) : object 'r_ts' not found

  res = super(Function, self).__call__(*new_args, **new_kwargs)
---------------------------------------------------------------------------
RRuntimeError                             Traceback (most recent call last)
<ipython-input-83-0765ffc30741> in <module>()
----> 1 x = r('forecast(r_ts)')

/Library/Python/2.7/site-packages/rpy2/robjects/__init__.pyc in __call__(self, string)
    319     def __call__(self, string):
    320         p = _rparse(text=StrSexpVector((string,)))
--> 321         res = self.eval(p)
    322         return conversion.ri2py(res)
    323

/Library/Python/2.7/site-packages/rpy2/robjects/functions.pyc in __call__(self, *args, **kwargs)
    176                 v = kwargs.pop(k)
    177                 kwargs[r_k] = v
--> 178         return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs)
    179
    180 pattern_link = re.compile(r'\\link\{(.+?)\}')

/Library/Python/2.7/site-packages/rpy2/robjects/functions.pyc in __call__(self, *args, **kwargs)
    104         for k, v in kwargs.items():
    105             new_kwargs[k] = conversion.py2ri(v)
--> 106         res = super(Function, self).__call__(*new_args, **new_kwargs)
    107         res = conversion.ri2ro(res)
    108         return res

RRuntimeError: Error in forecast(r_ts) : object 'r_ts' not found

我也尝试了以下内容:

In [99]: f = r('forecast.auto.arima(r_ts)')
---------------------------------------------------------------------------
RRuntimeError                             Traceback (most recent call last)
<ipython-input-99-1c4610d2740d> in <module>()
----> 1 f = r('forecast.auto.arima(r_ts)')

/Library/Python/2.7/site-packages/rpy2/robjects/__init__.pyc in __call__(self, string)
    319     def __call__(self, string):
    320         p = _rparse(text=StrSexpVector((string,)))
--> 321         res = self.eval(p)
    322         return conversion.ri2py(res)
    323

/Library/Python/2.7/site-packages/rpy2/robjects/functions.pyc in __call__(self, *args, **kwargs)
    176                 v = kwargs.pop(k)
    177                 kwargs[r_k] = v
--> 178         return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs)
    179
    180 pattern_link = re.compile(r'\\link\{(.+?)\}')

/Library/Python/2.7/site-packages/rpy2/robjects/functions.pyc in __call__(self, *args, **kwargs)
    104         for k, v in kwargs.items():
    105             new_kwargs[k] = conversion.py2ri(v)
--> 106         res = super(Function, self).__call__(*new_args, **new_kwargs)
    107         res = conversion.ri2ro(res)
    108         return res

RRuntimeError: Error in eval(expr, envir, enclos) :
  could not find function "forecast.auto.arima"

2 个答案:

答案 0 :(得分:4)

你可以尝试我做的事情

import rpy2.robjects as ro
from rpy2.robjects import pandas2ri
pandas2ri.activate()

ro.r('library(forecast)')

rdf = pandas2ri.py2ri(df)
ro.globalenv['r_timeseries'] = rdf
pred = ro.r('as.data.frame(forecast(auto.arima(r_timeseries),h=5))')

这样,您可以将pred作为这样的数据框处理

    Point Forecast  Lo 80  Hi 80  Lo 95  Hi 95
51              51     51     51     51     51
52              52     52     52     52     52
53              53     53     53     53     53
54              54     54     54     54     54
55              55     55     55     55     55

答案 1 :(得分:0)

在第一次尝试中,您告诉R使用它现在不太关注的变量r_ts(在您的Python名称空间中定义名称r_ts),并且在第二次尝试中添加到这个函数名称R不知道任何事情。这两条错误消息都准确地将此报告为问题。

您的第一次尝试可以改写为:

x = r('forecast')(r_ts)