总结python pandas中的特定时间窗口

时间:2017-06-02 03:19:57

标签: python pandas sum

我有医疗交易数据,如下所示:

id   date   amt code
124 1/14/12 135 P
124 1/15/12 135 P
124 1/16/12 135 P
124 1/17/12 135 R
124 2/12/12 135 P
124 2/14/12 135 R
124 2/29/12 142 P
124 2/30/12 159 P
192 2/12/12 922 P
192 2/13/12 922 R
192 2/25/12 124 P
192 2/26/12  40 P
135 2/17/12 721 P
135 2/20/12 100 P

' P'代码代表付款,并且' R'代码表示返回。我需要确定在过去10天内付款超过2美元且总计超过100美元的患者。诀窍是我需要每天这样做,所以一个人可以在一个月内多次触发这个逻辑(例如,从1/15/12开始的两个交易,以及从1/16开始的三个交易/ 12应每次触发一次,另外2次交易在2/30/12触发此逻辑)。

使这个问题更复杂的原因是我必须忽略已经退回支付代码的患者。因此,如果患者“124”和“在2012年1月15日有2次付款并在2012年1月17日返回,他们不应被标记,但他们应该在1月14日的交易中被标记为每次交易。 2012年1月15日和2012年2月29日和2月30日。最终数据应如下所示:

id flag_date count amt
124 1/15/12    2   270 
124 1/16/12    3   405
124 2/30/12    2   301
192 2/26/12    2   164
135 2/20/12    2   821

1 个答案:

答案 0 :(得分:2)

我必须确保我们有一个日期时间列

df.date = pd.to_datetime(df.date)
df.sort_values('date') \
    .assign(code=df.code.eq('P')) \
    .groupby('id').rolling('10d', on='date')[['amt', 'code']].sum() \
    .query('code >= 2 and amt > 100').reset_index()

    id       date    amt  code
0  124 2012-01-15  270.0   2.0
1  124 2012-01-16  405.0   3.0
2  124 2012-01-17  540.0   3.0
3  124 2012-02-29  301.0   2.0
4  135 2012-02-20  821.0   2.0
5  192 2012-02-26  164.0   2.0