2017-07-17 34 views
7

Tôi đang cố gắng triển khai gói R TSdist từ sổ tay python jupyter.Triển khai gói R TSdist từ 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] 

này mang lại cho tôi một NA và tôi nhận được một cảnh báo:

/usr/lib64/python3.4/site-packages/rpy2/rinterface/ init py: 186: RRuntimeWarning: Lỗi: Bộ phim phải vectơ đơn biến

warnings.warn (x, RRuntimeWarning)

Bất kỳ ý tưởng về cách triển khai đúng cách? Hoặc làm thế nào để đo lường sự tương đồng về chuỗi thời gian với các gói python sử dụng các biến đổi Fourier rời rạc (DFT), hệ số tự động hồi quy, Chỉnh sửa khoảng cách trên chuỗi thực (EDR). Các phương pháp được đề cập trong giấy this.

+0

Lỗi này là khả năng * trước * 'quận [0]', khi gọi 'ERPDistance() ', và như thông báo lỗi do mã R mà bạn đang cố gắng chạy cho biết đầu vào của bạn không hợp lệ. – lgautier

+1

Tôi đã thử cài đặt này ('TSdist.ERPDistance (t.values, c.values, g = 0, sigma = 30)') của hàm trong R studio và nó hoạt động. Và việc thực hiện trong python được tham chiếu với bài đăng này: https://stackoverflow.com/questions/5695388/dynamic-time-warping-in-python. –

Trả lời

2

Có thể lý do là hai đối tượng series được chuyển vào phương thức. Giả sử chuỗi có nghĩa là loạt gấu trúc, gọi số values trả về một mảng có nhiều mảng. Và theo số docs, ERPDistance dự kiến ​​các vectơ số, chứ không phải mảng.

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

xem xét việc chỉ đúc loạt như số vectơ với cơ sở R hoặc sử dụng rpy2 của 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) 
Các vấn đề liên quan