2013-01-22 117 views
4

我似乎无法使行fit = forecast.Arima(series, order=order, xreg=r_exog_train)正常工作。它确实没有xreg参数,所以我非常确定这是npyy数组到rpy2矩阵转换造成的一个问题。将numpy数组转换为rpy2矩阵(预测包,xreg参数)

有没有人在这里观察到错误?谢谢!

这是错误我得到(在德国不幸的是零部件)

Fehler in `colnames<-`(`*tmp*`, value = if (ncol(xreg) == 1) nmxreg else paste(n 
mxreg, : 
    Länge von 'dimnames' [2] ungleich der Arrayausdehnung 
Traceback (most recent call last): 
    File "r.py", line 58, in <module> 
    res = do_forecast(series, horizon=horizon, exog=(exog_train, exog_test)) 
    File "r.py", line 39, in do_forecast 
    fit = forecast.Arima(series, order=order, xreg=exog_train) 
    File "C:\Python27\lib\site-packages\rpy2\robjects\functions.py", line 86, in _ 
_call__ 
    return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs) 
    File "C:\Python27\lib\site-packages\rpy2\robjects\functions.py", line 35, in _ 
_call__ 
    res = super(Function, self).__call__(*new_args, **new_kwargs) 
rpy2.rinterface.RRuntimeError: Fehler in `colnames<-`(`*tmp*`, value = if (ncol(
xreg) == 1) nmxreg else paste(nmxreg, : 
    Lõnge von 'dimnames' [2] ungleich der Arrayausdehnung 

下面是代码示例:

# Python wrapper for R forecast stuff 
import numpy as np 

print 'Start importing R.' 
from rpy2 import robjects 
from rpy2.robjects.packages import importr 
from rpy2.robjects.numpy2ri import numpy2ri 
robjects.conversion.py2ri = numpy2ri 

base = importr('base') 
forecast = importr('forecast') 
stats = importr('stats') 
ts = robjects.r['ts'] 
print 'Finished importing R.' 


def nparray2rmatrix(x): 
    nr, nc = x.shape 
    xvec = robjects.FloatVector(x.transpose().reshape((x.size))) 
    xr = robjects.r.matrix(xvec, nrow=nr, ncol=nc) 
    return xr 

def nparray2rmatrix_alternative(x): 
    nr, nc = x.shape 
    xvec = robjects.FloatVector(x.reshape((x.size))) 
    xr = robjects.r.matrix(xvec, nrow=nr, ncol=nc, byrow=True) 
    return xr 

def do_forecast(series, frequency=None, horizon=30, summary=False, exog=None): 
    if frequency: 
    series = ts(series, frequency=frequency) 
    else: 
    series = ts(series) 
    if exog: 
    exog_train, exog_test = exog 
    r_exog_train = nparray2rmatrix(exog_train) 
    r_exog_test = nparray2rmatrix(exog_test) 
    order = robjects.IntVector([1, 0, 2]) # c(1,0,2) # TODO find right model 
    fit = forecast.Arima(series, order=order, xreg=r_exog_train) 
    forecast_result = forecast.forecast(fit, h=horizon, xreg=r_exog_test) 
    else: 
    # fit = forecast.auto_arima(series) 
    #robjects.r.plot(series) 
    fit = stats.HoltWinters(series) 
    forecast_result = forecast.forecast(fit, h=horizon) 
    if summary: 
    modsummary = base.summary(fit) 
    print modsummary 
    forecast_values = np.array(list(forecast_result.rx2('mean'))) 
    return forecast_values 


# Example 
series = np.arange(100) 
exog_train = np.ones((100,2)) 
exog_test = np.ones((100,2)) 
horizon = 100 
res = do_forecast(series, horizon=horizon, exog=(exog_train, exog_test)) 
print res 
+0

作为一般性评论,我会尽可能限制R到Python的混合。只需在R中创建'doforecast'函数,将函数编入当前工作空间并调用它。这样你就可以将R和Python的接口限制在Python中的几行R代码中。这使得您不太可能遇到特定于rpy的问题,并且更容易调试R代码。 –

+0

谢谢Paul,这很有道理。不过,我会遇到同样的问题让xreg矩阵工作。 – Tim

+0

是的,但仍然是避免问题的一般方法,我会尽可能使代码独立于对方。 –

回答

0

我把它通过明确地指出“dimnames”作为工作: xr = robjects.r.matrix(xvec, nrow=nr, ncol=nc, dimnames=dimnames)。显然,预测包需要这个。