2014-11-21 133 views
0

我有每個實體的時間序列數據:大熊貓index.asof與多指標

id event_date value 
1 2013-12-21 3.82 
1 2013-12-22 2.47 
1 2013-12-25 2.13 
1 2014-01-03 3.92 
1 2014-01-04 2.48 
2 2014-10-16 3.96 
2 2014-10-17 3.61 
2 2014-10-29 2.59 
2 2014-11-05 3.64 
2 2014-11-15 2.85 

我已經把它放在一個數據幀具有多指標:

   value 
id event_date 
1 2013-12-21 3.82 
    2013-12-22 2.47 
    2013-12-25 2.13 
    2014-01-03 3.92 
    2014-01-04 2.48 
2 2014-10-16 3.96 
    2014-10-17 3.61 
    2014-10-29 2.59 
    2014-11-05 3.64 
    2014-11-15 2.85 

我想在每個id的系列中找到任意中斷前的最新日期(比如2014-10-31或2014-09-30之前)。 index.asof或Series.asof似乎是我想要的,但我無法弄清楚如何在多個索引中使用它。對於一個日期「2014-10-30」我想這樣的輸出:

id event_date 
1 2014-01-04 00:00:00 
2 2014-10-29 00:00:00 

我可以遍歷第一級索引那裏,但它似乎應該有一個更好的更pandonic方式(完整數據設置非常大),我只是想念它。

In [10]: for idx in df.index.levels[0]: 
    ....:  print idx, df.loc[idx].index.asof('2014-10-30') 
    ....: 
1 2014-01-04 00:00:00 
2 2014-10-29 00:00:00 

沒有理由的數據必須是在這個多指標結構,只是似乎很有道理給予我會爲每個ID的時間序列。時間排序,沒有重複。

版本: 大熊貓:0.15.0 numpy的:1.9.0

回答

0

它看起來對我說,@ gjreda的回答只是缺少你截止濾光片,所以假設event_dateid不在索引中

cutoff = '2014-10-30' 
df[df['event_date'] <= cutoff].groupby(['id'])['event_date'].last() 

這給了相同的輸出之前,但截止是任意的:

id 
1 2014-01-04 
2 2014-10-29 
Name: event_date, dtype: datetime64[ns] 

如果你仍然想在索引中使用這些列,你可以這樣做:

df[df.index.levels[1] <= cutoff].groupby(level=['id']).apply(lambda x: x.index.get_level_values(1).max()) 

順便說一句,.asof似乎應用於groupby數據幀評估整個索引,而不是該組的索引,因此您的asof版本不能按預期工作:

df[df.index.levels[1] <= cutoff].groupby(level=[0]).apply(lambda x: x.index.levels[1].asof(cutoff)) 

返回:

id 
1 2014-10-29 
2 2014-10-29 
dtype: datetime64[ns] 

它看起來似乎可以用於所有組的最後一個真正的價值。

0

如果沒有理由爲它是一個多指標,你可以做這樣的事情:

In [10]: df.reset_index(inplace=True) 
In [11]: df.groupby('id')['event_date'].max() 
Out[11]: 
id 
1  2014-01-04 
2  2014-11-15 
Name: event_date, dtype: object 

`` `

+0

謝謝。我的問題並不完全清楚。我試圖在任意中斷之前找到最新的日期。因此,例如,10月份的最近日期結束。編輯這個問題來澄清。 – 2014-11-21 19:43:24

+0

哎呀,錯過了,但@ Primer的幫助你。 – 2014-11-22 19:56:50