【问题标题】:Passing a pandas data frame through an R function using rpy2使用 rpy2 通过 R 函数传递 pandas 数据帧
【发布时间】:2017-04-18 19:37:41
【问题描述】:

我正在尝试在 Python 中重现 R 结果。以下 R 代码有效:

library("TTR")
library("zoo")
library("xts")
library("quantmod")
getSymbols("^GSPC",from = "2014-01-01", to = "2015-01-01")
dataf = GSPC[,c("GSPC.High", "GSPC.Low", "GSPC.Close")]
result = CCI(dataf, n=20, c=0.015)

但不是以下 Python 代码:

from datetime import datetime
from rpy2.robjects.packages import importr
TTR = importr('TTR')
import pandas_datareader as pdr
from rpy2.robjects import pandas2ri
pandas2ri.activate()

GSPC = pdr.get_data_yahoo(symbols='^GSPC', start=datetime(2014, 1, 1), end=datetime(2015, 1, 1))
dataf = GSPC[['High', 'Low', 'Close']]
result = TTR.CCI(dataf, n=20, c=0.015)

使用 TTR.CCI 时,我得到的错误发生在最后一行。 Traceback 和返回的错误是:

Traceback (most recent call last):
File "svm_strat_test_oliver.py", line 30, in <module> result = TTR.CCI(dataf, n=20, c=0.015)
File "/usr/local/lib/python2.7/site-packages/rpy2/robjects/functions.py", line 178, in __call__
return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/rpy2/robjects/functions.py", line 106, in __call__
res = super(Function, self).__call__(*new_args, **new_kwargs)
rpy2.rinterface.RRuntimeError: Error in `[.data.frame`(center, beg:NROW(x)) : undefined columns selected

【问题讨论】:

  • 没有回溯的错误通常比完整回溯的帮助要小得多。此外,如果不确定会发生什么,请尝试分解单行中的嵌套函数调用。它可以更轻松地检查每个函数是否按预期运行。例如,尝试:dataf = GSPC[['High', 'Low', 'Close']],然后在dataf 上调用TTR.CCI()
  • @lgautier 我已经添加了回溯并分解了单行。
  • 正如错误消息所说:rpy2 不知道如何处理 pandas 数据帧。检查这个问题的答案:stackoverflow.com/questions/30922213/…
  • 谢谢。我在序言中激活了pandas2ri 并尝试了TTR.CCI('High~Low~Close', data=dataf, n=20, c=0.015),但我得到了rpy2.rinterface.RRuntimeError: Error in runSum(x, n) : Invalid 'n'。在您提供的链接中,没有为线性拟合传递参数,因此这可能会有所不同。如我的问题所示,您是否建议将TTRimportr 一起导入?
  • R 中对 CCI() 的调用似乎与 Python 中对 CCI() 的调用不同...

标签: python r pandas dataframe rpy2


【解决方案1】:

您在 R 代码中的 data.frame 实际上是一个“xts”“zoo”对象,您只需在 python 代码中将其转换为一个:

rzoo = importr('zoo')
datazoo = zoo.as_zoo_xts(dataf)
result = TTR.CCI(datazoo, n=20, c=0.015)

【讨论】:

    猜你喜欢
    • 2014-04-15
    • 2012-06-27
    • 2022-01-21
    • 2018-01-20
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    相关资源
    最近更新 更多