2011-06-24 88 views
10

Tôi có hai tập hợp ngày nhiệt độ, có số đọc tại các khoảng thời gian thông thường (nhưng khác nhau). Tôi đang cố gắng để có được sự tương quan giữa hai bộ dữ liệu này.Cách lấy mối tương quan giữa hai khoảng thời gian sử dụng Pandas

Tôi đã chơi với Pandas để cố gắng thực hiện việc này. Tôi đã tạo hai lần kiểm tra và đang sử dụng TimeSeriesA.corr(TimeSeriesB). Tuy nhiên, nếu thời gian trong 2 timeSeries không khớp chính xác (chúng thường giảm dần theo giây), tôi nhận được Null như một câu trả lời. Tôi có thể nhận được một câu trả lời đàng hoàng nếu tôi có thể:

a) suy/fill lần thiếu trong mỗi chuỗi thời gian (Tôi biết điều này là có thể trong Pandas, tôi chỉ không biết làm thế nào để làm điều đó)

b) tách số giây ra khỏi đối tượng ngày giờ trăn (Đặt giây thành 00, không thay đổi phút). Tôi sẽ mất một mức độ chính xác, nhưng không phải là một số tiền rất lớn

c) Sử dụng một cái gì đó khác trong Pandas để có được mối tương quan giữa hai chuỗi thời gian

d) Sử dụng một cái gì đó trong python để có được mối tương quan giữa hai danh sách float, mỗi float có một đối tượng datetime tương ứng, có tính đến thời gian.

Bất kỳ ai có bất kỳ đề xuất nào?

Trả lời

12

Bạn có một số tùy chọn sử dụng gấu trúc, nhưng bạn phải đưa ra quyết định về cách sắp xếp dữ liệu cho phù hợp khi chúng không xuất hiện ở cùng một phiên bản.

Sử dụng các giá trị "như của" thời gian trong một trong những chuỗi thời gian, đây là một ví dụ:

In [15]: ts 
    Out[15]: 
    2000-01-03 00:00:00 -0.722808451504 
    2000-01-04 00:00:00 0.0125041039477 
    2000-01-05 00:00:00 0.777515530539 
    2000-01-06 00:00:00 -0.35714026263 
    2000-01-07 00:00:00 -1.55213541118 
    2000-01-10 00:00:00 -0.508166334892 
    2000-01-11 00:00:00 0.58016097981 
    2000-01-12 00:00:00 1.50766289013 
    2000-01-13 00:00:00 -1.11114968643 
    2000-01-14 00:00:00 0.259320239297 



    In [16]: ts2 
    Out[16]: 
    2000-01-03 00:00:30 1.05595278907 
    2000-01-04 00:00:30 -0.568961755792 
    2000-01-05 00:00:30 0.660511172645 
    2000-01-06 00:00:30 -0.0327384421979 
    2000-01-07 00:00:30 0.158094407533 
    2000-01-10 00:00:30 -0.321679671377 
    2000-01-11 00:00:30 0.977286027619 
    2000-01-12 00:00:30 -0.603541295894 
    2000-01-13 00:00:30 1.15993249209 
    2000-01-14 00:00:30 -0.229379534767 

bạn có thể thấy đây là tắt 30 giây. Chức năng reindex cho phép bạn sắp xếp dữ liệu trong khi làm đầy phía trước giá trị (nhận được "như của" giá trị):

In [17]: ts.reindex(ts2.index, method='pad') 
    Out[17]: 
    2000-01-03 00:00:30 -0.722808451504 
    2000-01-04 00:00:30 0.0125041039477 
    2000-01-05 00:00:30 0.777515530539 
    2000-01-06 00:00:30 -0.35714026263 
    2000-01-07 00:00:30 -1.55213541118 
    2000-01-10 00:00:30 -0.508166334892 
    2000-01-11 00:00:30 0.58016097981 
    2000-01-12 00:00:30 1.50766289013 
    2000-01-13 00:00:30 -1.11114968643 
    2000-01-14 00:00:30 0.259320239297 

    In [18]: ts2.corr(ts.reindex(ts2.index, method='pad')) 
    Out[18]: -0.31004148593302283 

lưu ý rằng 'pad' cũng là aliased bởi 'ffill' (nhưng chỉ trong phiên bản mới nhất của gấu trúc trên GitHub vào thời điểm này!).

Dải giây trong tất cả các khoảng thời gian của bạn. Cách tốt nhất để làm điều này là sử dụng rename

In [25]: ts2.rename(lambda date: date.replace(second=0)) 
    Out[25]: 
    2000-01-03 00:00:00 1.05595278907 
    2000-01-04 00:00:00 -0.568961755792 
    2000-01-05 00:00:00 0.660511172645 
    2000-01-06 00:00:00 -0.0327384421979 
    2000-01-07 00:00:00 0.158094407533 
    2000-01-10 00:00:00 -0.321679671377 
    2000-01-11 00:00:00 0.977286027619 
    2000-01-12 00:00:00 -0.603541295894 
    2000-01-13 00:00:00 1.15993249209 
    2000-01-14 00:00:00 -0.229379534767 

Lưu ý rằng nếu đổi tên khiến có ngày trùng lặp một Exception sẽ được ném ra.

Đối với một chút gì đó cao cấp hơn, giả sử bạn muốn tương quan giá trị trung bình cho mỗi phút (nơi bạn có nhiều quan sát mỗi giây):

In [31]: ts_mean = ts.groupby(lambda date: date.replace(second=0)).mean() 

    In [32]: ts2_mean = ts2.groupby(lambda date: date.replace(second=0)).mean() 

    In [33]: ts_mean.corr(ts2_mean) 
    Out[33]: -0.31004148593302283 

Những đoạn mã cuối cùng có thể không hoạt động nếu bạn không có mã mới nhất từ ​​https://github.com/wesm/pandas. Nếu .mean() không hoạt động trên đối tượng GroupBy trên mỗi lần thử trên .agg(np.mean)

Hy vọng điều này sẽ hữu ích!

+0

Ha, bạn đã nhận được nó trước khi tôi có thể: -) ... –

+0

Nếu tôi đọc phần cuối cùng bên phải, phần cuối cùng tính trung bình cho các giá trị trong khoảng từ 00 đến 60 giây (giá trị trung bình của XX: XX: 30, không phải XX: XX: 00) và gán kết quả là XX: XX : 00. Cách đơn giản xung quanh điều này sẽ là 'date.replace (second = 30)', một cách quá phức tạp để lấy số trung bình mỗi phút sẽ là: 'ts_mean = seriesT.groupby (lambda date: date.replace (second = 0) nếu date.second <30 else date.replace (giây = 0) + timedelta (phút = 1)). mean() ' – user814005

Các vấn đề liên quan