2017-07-17 30 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)