2017-06-02 67 views
1

我有一個看起來像這樣的醫療事務數據:求和特定的時間窗口在Python熊貓

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美元。訣竅是我需要每天都這樣做,因此個人可以在一個月內多次觸發此邏輯(例如,從2012年1月15日開始的兩個交易以及從1/16/12個應該每個觸發一次,另外2個事務在2/30/12觸發這個邏輯)。

是什麼讓這個問題更復雜是我必須忽略已經返回付款代碼的患者。因此,如果患者'124'在2012年1月15日有2次付款並在1/17/12年有回報,他們不應該被標記,但他們應該在2012年1月14日標記每次交易& 1/15/12和2/29/12和2/30/12。最終的數據應該是這樣的:

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 

回答

2

我必須確保我們有一個datetime列

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 
+0

這是非常接近我想要的輸出,除了指數第2行和第3行 - 這些不應被標記,因爲它們在期望的窗口中有回報付款... – Daniel

+0

@Daniel測試您的數據上的代碼。我必須增加數據,因爲你有2月30日的錯誤。 – piRSquared

+0

我收到以下錯誤:ValueError:指定爲日期時無效,必須是列(如果是DataFrame)或無 使用python 2.7 – Daniel