2017-07-17 96 views
7

我正试图从python jupyter笔记本实现R包TSdist从python执行R包TSdist

import rpy2.robjects.numpy2ri 
from rpy2.robjects.packages import importr 
rpy2.robjects.numpy2ri.activate() 

R = rpy2.robjects.r 
## load in package 
TSdist = importr('TSdist') 
## t,c are two series 
dist = TSdist.ERPDistance(t.values,c.values,g=0,sigma =30) 
## dist is a R Boolean vector with one value 
dist[0] 

这给了我一个NA,我得到了一个警告:

/usr/lib64/python3.4/site-packages/rpy2/rinterface/ 初始化的.py:186: RRuntimeWarning:错误:该系列必须是单变量矢量

warnings.warn(X,RRuntimeWarning)

不限如何正确实施它的想法?或者如何使用离散傅立叶变换(DFT),自回归系数,编辑实际序列距离(EDR)来测量与python软件包的时间序列相似性。在this论文中提到的方法。

+0

该错误是可能*之前*'DIST [0]',调用'ERPDistance()时',并且正在尝试运行的R代码发出的错误消息表明它的输入无效。 – lgautier

+1

我试过这个实现('TSdist.ERPDistance(t.values,c.values,g = 0,sigma = 30)')在R studio中的功能,它的工作原理。在python中的实现引用这篇文章:https://stackoverflow.com/questions/5695388/dynamic-time-warping-in-python。 –

回答

2

可能原因是两个系列对象被传入该方法。假设系列号意味着熊猫系列,调用values返回一个numpy数组。根据docsERPDistance需要数字向量,而不是数组。

print(type(pd.Series(np.random.randn(5)))) 
# <class 'pandas.core.series.Series'> 

print(type(pd.Series(np.random.randn(5)).values)) 
# <class 'numpy.ndarray'> 

请考虑简单地铸造系列作为数字载体用碱R或使用rpy2的FloatVector

from rpy2.robjects.packages import importr 

R = rpy2.robjects.r 
## load in package 
base = importr('base') 
TSdist = importr('TSdist') 

new_t = base.as_numeric(t.tolist()) 
print(type(new_t)) 
# <class 'rpy2.robjects.vectors.FloatVector'> 

new_c = rpy2.robjects.FloatVector(c.tolist()) 
print(type(new_c)) 
# <class 'rpy2.robjects.vectors.FloatVector'> 

## new_t, new_c are now numeric vectors 
dist = TSdist.ERPDistance(new_t, new_c, g=0, sigma =30)