2014-05-23 6 views
3

각 ID에 대해 하나 이상의 이벤트가 기록되는 데이터 프레임이 있습니다. 각 이벤트에 대해 ID, 메트릭 x 및 날짜가 기록됩니다. 이런 식으로 뭔가 :그룹 별 팬더 일시적 누적 합계

import pandas as pd 
import datetime as dt 
import numpy as np 
x = range(0, 6) 
id = ['a', 'a', 'b', 'a', 'b', 'b'] 
dates = [dt.datetime(2012, 5, 2),dt.datetime(2012, 4, 2),dt.datetime(2012, 6, 2), 
     dt.datetime(2012, 7, 30),dt.datetime(2012, 4, 1),dt.datetime(2012, 5, 9)] 

df =pd.DataFrame(np.column_stack((id,x,dates)), columns = ['id', 'x', 'dates']) 

내가 좋아하는 것은 해당 ID에 대한 모든 이전 이벤트에 대한 데이터 집합의 각 행에 대해, X의 누적 합계를 전환 확인 기간 (예 : 칠십일)를 설정하고 계산 할 수 있도록 원하는 룩백 (계산이 수행되는 행에 대한 x는 제외) 내에 있어야합니다. 이처럼 보이는 결국해야한다 : (1) 변수를 그룹화하는 등의 '아이디'와 groupby/apply을 수행

id x    dates want 
0 a 0 2012-05-02 00:00:00 1 
1 a 1 2012-04-02 00:00:00 0 
2 b 2 2012-06-02 00:00:00 9 
3 a 3 2012-07-30 00:00:00 0 
4 b 4 2012-04-01 00:00:00 0 
5 b 5 2012-05-09 00:00:00 4 

답변

1

음, 한 가지 방법은 다음과 같다. (2) 적용 범위 내에서 resample 그룹을 일별 시계열로 그룹화합니다. (3) 그런 다음 rolling_sum을 사용하고 (따라서 현재 행 'x'값을 포함하지 않음) 70 일의 전환 확인 기간의 합계를 계산합니다. (4)은 원래 관찰로 다시 그룹을 절감 : 당신은 ['id','dates']으로 분류 데이터를 필요로하기 위하여려고하고있다

In [12]: df = df.sort(['id','dates']) 
In [13]: df 
Out[13]: 
    id x  dates 
1 a 1 2012-04-02 
0 a 0 2012-05-02 
3 a 3 2012-07-30 
4 b 4 2012-04-01 
5 b 5 2012-05-09 
2 b 2 2012-06-02 

. 이제 우리는 할 수있는 groupby/apply :

In [15]: def past70(g): 
      g = g.set_index('dates').resample('D','last') 
      g['want'] = pd.rolling_sum(g['x'],70,0).shift(1) 
      return g[g.x.notnull()]    

In [16]: df = df.groupby('id').apply(past70).drop('id',axis=1) 
In [17]: df 
Out[17]: 
       x want 
id dates    
a 2012-04-02 1 NaN 
    2012-05-02 0  1 
    2012-07-30 3  0 
b 2012-04-01 4 NaN 
    2012-05-09 5  4 
    2012-06-02 2  9 

그런 다음 NaN을 원하지 않는 경우 만 수행

편집
In [28]: df.fillna(0) 
Out[28]: 
       x want 
id dates    
a 2012-04-02 1  0 
    2012-05-02 0  1 
    2012-07-30 3  0 
b 2012-04-01 4  0 
    2012-05-09 5  4 
    2012-06-02 2  9 

: 당신이 매개 변수 전환 확인 창을 확인하려면이 같은 것을 할 다음 :

def past_window(g,win=70): 
    g = g.set_index('dates').resample('D','last') 
    g['want'] = pd.rolling_sum(g['x'],win,0).shift(1) 
    return g[g.x.notnull()]    

df = df.groupby('id').apply(past_window,win=10) 
print df.fillna(0) 
+0

감사합니다. 70을 과거 함수 (예 : def past (g, lookback))의 인수로 사용하려면 어떻게 그 인수를 .apply (과거)로 전달할 수 있습니까? – ADJ

+0

그냥'apply'의 다음 매개 변수가됩니다. 자세한 내용은 편집을 참조하십시오. –

+0

감사합니다. Karl! – ADJ