我有医疗交易数据,如下所示:
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
答案 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