2011-06-24 30 views
10

Düzenli (ancak farklı) zaman aralıklarında okumaları olan iki set sıcaklık tarihim var. Bu iki veri seti arasında ilişki kurmaya çalışıyorum.Pandalar kullanarak iki zamanlama arasındaki ilişki nasıl elde edilir

Bunu yapmak için Pandas ile oynuyordum. İki zaman dilimi oluşturdum ve TimeSeriesA.corr(TimeSeriesB) kullanıyorum. Ancak, 2 timeSeries'deki zamanlar tam olarak eşleşmezse (genellikle saniyeler içinde kapanırlar), Null cevabını alırım. Ben iyi bir cevap alabilir Yapabilsem:

a) Her TimeSeries (Bu Pandalar mümkündür biliyoruz zamanları eksik Ara Değer/dolgu, sadece)

b) bunu nasıl bilmiyorum python datetime nesnelerini saniye cinsinden kaydırın (Dakikaları değiştirmeden saniyeyi 00 olarak ayarlayın). Ben büyük miktarda

c) iki TimeSeries

d) iki liste arasında korelasyon elde etmek Python şey kullan arasındaki korelasyonu almak için başka Pandalar bir şey kullanın doğruluk derecesini kaybetmek değil ediyorum yüzer, her bir kayan zaman dikkate alınarak, karşılık gelen bir datetime nesnesine sahiptir.

Herhangi bir öneriniz var mı?

cevap

12

Pandaları kullanarak çok sayıda seçeneğiniz var, ancak verileri aynı anlarda bulunmadıklarına göre hizalamak nasıl mantıklı bir karar vermek zorundasınız. Bu 30 saniye gecikmeli görünür görebilirsiniz

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 

:

zaman serisi birinde kez "itibariyle" değerleri kullanın, işte size bir örnek. ileriye değerleri doldururken reindex fonksiyonu verileri hizaya olanak tanır (alma değeri "olarak"):

'ped' da ancak çok son sürümünde ('ffill' tarafından, diğer ad olarak not olduğunu
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 

GitHub pandaları bu zamana kadar!).

Tüm saatlerinizden saniyelerle çıkar çıkmaz. Bunu yapmanın en iyi yolu, yeniden adlandırma yinelenen tarihleri ​​kullanılabilmesine neden olursa bir Exception atılmış olacağını 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 

Not kullanmaktır. eğer

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 

Bu son kod parçalarını çalışmayabilir: biraz daha ileri bir şey için

yaptığında (saniyede birden gözlemleri var) her dakika için ortalama değerini ilişkilendirmek istediğini varsayalım En son kod https://github.com/wesm/pandas'dan yok. .mean(), yukarıdaki gibi bir GroupBy nesnesinde çalışmıyorsa, .agg(np.mean)

Yardım edin!

+0

Ha, elimden geleni yaptın: -) ... –

+0

Son bölümü doğru okursam, son bölüm 00 ile 60 saniye arasındaki değerlerin ortalamasını hesaplar (XX: XX: 30 değil, XX: XX: 00 için ortalama) ve sonucu XX: XX olarak atar. : 00. Bunun basit bir yolu, date.replace (second = 30) 'dır, dakika başına ortalamaları almak için çok karmaşık bir yol olurdu: ts_mean = seriesT.groupby (lambda date: date.replace (second = 0) eğer date.second <30 else date.replace (saniye = 0) + zaman dilimi (dakika = 1)). mean() ' – user814005

İlgili konular