2011-06-24 43 views
10

我有兩套溫度日期的,其必須在定期(但不同)的時間間隔讀數2個時間序列數據之間的相關性。我試圖獲得這兩組數據之間的關聯。如何獲得使用熊貓

我一直在玩Pandas,試圖做到這一點。我創建了兩個時間序列,並使用TimeSeriesA.corr(TimeSeriesB)。但是,如果兩個時間系列中的時間完全不匹配(它們通常以秒爲單位),那麼我將得到Null作爲答案。我能得到一個像樣的答案,如果我能:

一)插值/填充每個TimeSeries的(我知道這是大熊貓可能缺少時間,我只是不知道如何做到這一點)

B)剝離python datetime對象的秒數(將秒設置爲00,而不更改分鐘)。我失去了準確度,但不是數額巨大

c)用在別的東西熊貓來得到兩個時間序列

d)使用Python的東西拿到兩個列表之間的相關性之間的相關性浮動,每個浮動具有相應的日期時間對象,考慮到時間。

任何人有任何建議嗎?

回答

12

你有一些使用熊貓的選擇,但你必須做一個關於如何有意義的對齊因爲他們沒有在同一時刻發生數據決定。

使用值「爲」時間序列的一個時代,這裏有一個例子:

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 

可以看到這些都是關閉的30秒。該reindex功能可以對齊數據卻使前值(獲得「爲」值):

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 

注意「墊」也是由「ffill」別名(但只有在那些最新版本截至目前,GitHub上的熊貓!)。

地帶秒所有日期時間的。要做到這一點,最好的辦法是使用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 

注意,如果重命名導致那裏是重複日期的Exception將被拋出。

對於一些更先進一點,假設你想爲每分鐘的平均值(你有每秒多次觀察)相關:

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 

這些最後的代碼片段可能不會,如果你的工作沒有來自https://github.com/wesm/pandas的最新代碼。如果.mean()不能在上面的GroupBy物體上試試.agg(np.mean)

希望這有助於!

+0

哈,你之前,我可以得到它: - )... –

+0

如果我正在閱讀最後一部分,最後一部分計算00到60秒(XX:XX:30,而不是XX:XX:00)的平均值,並將結果分配給XX:XX :00。簡單的解決方法是'date.replace(second = 30)',每分鐘得到平均數的過於複雜的方法是:'ts_mean = seriesT.groupby(lambda date:date.replace(second = 0)if date.second <30 else date.replace(second = 0)+ timedelta(minutes = 1))。mean()' – user814005