2017-07-17 5 views
7

Ich versuche, das R-Paket TSdist von Python Jupyter Notebook zu implementieren.Implementieren R-Paket TSdist von Python

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] 

Das gibt mir eine NA und ich bekam eine Warnung:

/usr/lib64/python3.4/site-packages/rpy2/rinterface/ init Py: 186: RRuntimeWarning: Fehler: Die Serie

univariate Vektoren sein muss

warnings.warn (x, RRuntimeWarning)

Alle Ideen, wie man es richtig umsetzt? Oder wie Zeitreihenähnlichkeit mit Python-Paketen mit diskreten Fourier-Transformationen (DFT), Auto-regressive Koeffizient, Edit Entfernung auf Real-Sequenz (EDR) zu messen. Methoden erwähnt in this Papier.

+0

Der Fehler ist wahrscheinlich * vor * 'dist [0]', wenn Sie anrufen 'ERPDistance() ', und die Fehlermeldung, die von dem R-Code ausgegeben wird, den Sie ausführen möchten, zeigt an, dass Ihre Eingabe ungültig ist. – lgautier

+1

Ich habe diese Implementierung ('TSdist.ERPDistance (t.Values, c.Values, g = 0, Sigma = 30)') der Funktion in R Studio versucht und es funktioniert. Auf die Implementierung in Python wird mit diesem Post verwiesen: https://stackoverflow.com/questions/5695388/dynamic-time-warping-in-python. –

Antwort

2

Wahrscheinlich der Grund ist die zwei Serie Objekte, die in die Methode übergeben werden. Angenommen, Serienmittel Pandas Serie, Aufruf values gibt ein numpy Array zurück. Und pro docs erwartet der ERPDistance numerische Vektoren, nicht Arrays.

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'> 

einfach Erwägen Casting-Serie als numerische Vektoren mit Basis R oder rpy2 die Verwendung 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) 
Verwandte Themen