从 python 实施 R 包 TSdist

Implement R package TSdist from python

我正在尝试从 python jupyter 笔记本实施 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/init.py:186: RRuntimeWarning: Error : The series must be univariate vectors

warnings.warn(x, RRuntimeWarning)

关于如何正确实施它的任何想法?或者如何使用离散傅里叶变换 (DFT)、自回归系数、真实序列编辑距离 (EDR) 来测量 python 包的时间序列相似性。 this 论文中提到的方法。

可能的原因是两个 series 对象被传递到方法中。假设系列意味着 pandas 系列 ,调用 values returns 一个 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 的 numeric 向量或使用 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)