尝试使用rpy2和R库时出现错误

4

我正在尝试使用rpy2中的forecast包。我无法找到如何将列表转换为rpy2中的时间序列,因此我想使用pandas时间序列同样可以。

from rpy2.robjects.packages import importr
from rpy2.robjects import r
fore = importr("forecast")
from pandas import *

data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
s = Series(data)

f = fore(s, 5, level = c(80,95))

运行f时会返回以下错误:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'c' is not defined

我不知道错误是来自使用pandas时间序列还是在尝试使用R的forecast包时的语法错误。如果有人能在这里帮助我,我会非常感激。

编辑:我自己解决了。 以下是正确的代码,供有兴趣的人参考:

from rpy2.robjects.packages import importr
from rpy2.robjects import r
import rpy2.robjects.numpy2ri as rpyn
forecast = importr("forecast")

rcode = 'k = as.numeric(list(1, 2, 3, 4, 5, 6, 7, 8, 9))' #I just copied the contents of data in
r(rcode)
rcode1 = 'j <- ts(k)'
r(rcode1)
rcode2 = 'forecast(j, 5, level = c(80,95))'

x = r(rcode2)[1]
vector=rpyn.ri2numpy(x) #Converts from Float Vector to an array
lst = list(vector) #Converts the array to a list.
1个回答

1

你看过错误信息了吗?

NameError: name 'c' is not defined

这个错误是从哪里来的?

f = fore(s, 5, level = c(80,95))

这是 Python 代码,对吧?

Python 中没有 c 函数 - R 中有一个函数,但此时你不在 R 中,而是在 Python 中。

尝试以下代码(未经测试):

f = fore(s, 5, level = [80,95])

使用Python的方括号来创建Python列表对象。这可能会作为向R传递的向量。

此外,我认为这样做行不通。如果你阅读文档,你会发现importr可以让你引用包,并且要调用包中的函数,你需要使用点表示法。你需要执行fore.thingYouWantToCall(whatever)


没错。首先是 base = importr('base')然后 base.c 就会指向正确的函数。如果不确定一个函数在哪里,可以使用 wherefrom()(http://rpy.sourceforge.net/rpy2/doc-2.3/html/robjects_rpackages.html#rpy2.robjects.packages.wherefrom)。 - lgautier
дҪҶжҳҜдҪ зңҹзҡ„йңҖиҰҒеңЁrpy2дёӯдҪҝз”Ёbase.c(1,2,3)еҗ—пјҹдҪ дёҚиғҪеҸӘдҪҝз”ЁPythonеҲ—иЎЁеҗ—пјҹжҲ‘и®ӨдёәжҸҗй—®иҖ…еҸӘжҳҜзІҳиҙҙдәҶдёҖдәӣRд»Јз ҒгҖӮ - Spacedman
在他的第一个代码片段中,有 f = fore(s, 5, level = c(80,95))。可以使用 base.c()rpy2.robjects.vectors.IntVector()rpy2.robjects.vectors.FloatVector() 中的任何一个。前者将猜测所有元素的通用类型。如果使用 python 列表,则目前会被转换为 R 列表(这是与 R 原子向量不同的另一种东西)。 - lgautier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接