-->

Python的rpy2和quantmod例子(Python rpy2 and quantmod ex

2019-09-03 21:35发布

Python编程语言已经帮了我很多在开发金融数据分析应用。 可替代地,存在用于数据分析过,这有专用金融数据分析软件包,例如R: quantmod 。

现在,有rpy2这两种语言(即,Python的&R)之间的接口。 我想原型使用python的功率与quantmod包中的一些财务数据分析应用。

到现在为止,我已经花了几个小时搜索使用rpy2(Python包),并调用quantmod功能在Python编程语言的一些快速的启动代码示例互联网。 到目前为止,我还没有从rpy2&quantmod单证找到任何合适的材料......除了是成功的。

因此,问题是如下=>

  1. 是否合适的资源/ S的任何一个知道让我开始使用Python和quantmod使用rpy2?
  2. 可替换地,可以使用rpy2调用quantmod功能Python的代码中的某些一个交简单的例子/秒?

下面是我在使用rpy2&quantmod实现原型的尝试:

from rpy2.robjects.packages import importr

sta = {"skeleton.TA": "skeleton_dot_TA", "skeleton_TA": "skeleton_uscore_TA"}
quantmod = importr('quantmod', robject_translations = sta)

IBM = quantmod.getSymbols("IBM")

与上面的代码(quantmodplot.py)的问题是,它产生“RuntimeError”如下:

 As of 0.4-0, ‘getSymbols’ uses env=parent.frame() and
 auto.assign=TRUE by default.

 This  behavior  will be  phased out in 0.5-0  when the call  will
 default to use auto.assign=FALSE. getOption("getSymbols.env") and 
 getOptions("getSymbols.auto.assign") are now checked for alternate defaults

 This message is shown once per session and may be disabled by setting 
 options("getSymbols.warning4.0"=FALSE). See ?getSymbol for more details
Error in as.character(sc[[1]]) : 
  cannot coerce type 'closure' to vector of type 'character'
Traceback (most recent call last):
  File "quantmodplot.py", line 6, in <module>
    IBM = quantmod.getSymbols("IBM")
  File "/usr/local/lib/python2.7/dist-packages/rpy2-2.3.6-py2.7-linux-i686.egg/rpy2/robjects/functions.py", line 86, in __call__
    return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/rpy2-2.3.6-py2.7-linux-i686.egg/rpy2/robjects/functions.py", line 35, in __call__
    res = super(Function, self).__call__(*new_args, **new_kwargs)
rpy2.rinterface.RRuntimeError: Error in as.character(sc[[1]]) : 
  cannot coerce type 'closure' to vector of type 'character'

对你的帮助表示感谢...

Answer 1:

getSymbols()位似乎有点非传统(R已经具有的功能get()mget()

出现此问题的importDefaults()Defaults ),本身就是一个奇怪的野兽:它可以追溯到2帧调用堆栈向上,以获取函数调用(所以在这里“getSymbols”)的名称。

该功能getSymbols()quantmod包含的代码:

function (Symbols = NULL, env = parent.frame(), reload.Symbols = FALSE, 
    verbose = FALSE, warnings = TRUE, src = "yahoo", symbol.lookup = TRUE, 
    auto.assign = getOption("getSymbols.auto.assign", TRUE), 
    ...) 
{
    # (...code cut out...)
    importDefaults("getSymbols")

呼叫importDefaults("getSymbols)上升调用堆栈,以获取调用函数的符号,那就是‘getSymbols’。

在rpy2,称为(在Python)的R函数不具有在R围框(由于包围框架是Python)的一个符号。 在某种程度上,它就像一个匿名函数为R.这或许可以在高层次的接口来提高rpy2.robjects ,但我从来没有发现它的工作时间。

一种解决方法是确保该功能具有呼叫帧和符号:

from rpy2.robjects.vectors import ListVector
base = importr("base")
base.do_call("getSymbols", ListVector({'Symbols':"IBM"}))


Answer 2:

今天,我也测试了以下做法...即显式调用rpy2.robjects按顺序调用蟒蛇R内的脚本。 这种方法的例子是线In [5]: In [6]:在下面的Python脚本。 有趣的是,这种方法似乎工作:

In [1]: from rpy2.robjects import r
In [2]: from rpy2.robjects.packages import importr
In [3]: sta = {"skeleton.TA": "skeleton_dot_TA", "skeleton_TA": "skeleton_uscore_TA"}
In [4]: quantmod = importr('quantmod', robject_translations = sta)
In [5]: IBM = r("getSymbols('IBM', src='google', from='2013-01-01')")
 As of 0.4-0, ‘getSymbols’ uses env=parent.frame() and
 auto.assign=TRUE by default.

 This  behavior  will be  phased out in 0.5-0  when the call  will
 default to use auto.assign=FALSE. getOption("getSymbols.env") and 
 getOptions("getSymbols.auto.assign") are now checked for alternate defaults

 This message is shown once per session and may be disabled by setting 
 options("getSymbols.warning4.0"=FALSE). See ?getSymbol for more details

In [6]: r("candleChart(IBM, TA=NULL)")
Out[6]: <RS4 - Python:0xae3a14c / R:0xaae455c>

但是,在运行这种Python脚本=> quantmod.getSymbols("IBM")产生RRuntimeError
因此,首要的问题还是仍然没有解决!

好了,下面是关于我的机器环境的一些细节:

OS: Ubuntu Linux 12.04
Python version: '2.7.3'
Python package: rpy2-2.3.6
R version: 3.0.0 (2013-04-03)
R package: quantmod_0.4-0


文章来源: Python rpy2 and quantmod examples