如何使用 rpy2 运行 auto.arima

use*_*931 0 rpy2

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

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

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)')
Run Code Online (Sandbox Code Playgroud)

我想我必须导入一些 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]
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我也尝试了以下方法:

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"
Run Code Online (Sandbox Code Playgroud)

Ros*_*dra 5

你可以试试我做的

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))')
Run Code Online (Sandbox Code Playgroud)

这样,您可以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
Run Code Online (Sandbox Code Playgroud)