У меня есть сценарий Pandas, который подсчитывает количество повторных обращений в больницу в течение 30 дней на основании нескольких условий.Интересно, можно ли это векторизовать для улучшения производительности.Я экспериментировал с df.rolling (). Apply, но пока безуспешно.
Вот таблица с надуманными данными для иллюстрации:
ID VISIT_NO ARRIVED LEFT HAD_A_MASSAGE BROUGHT_A_FRIEND
1 1 29/02/1996 01/03/1996 0 1
1 2 01/12/1996 04/12/1996 1 0
2 1 20/09/1996 21/09/1996 1 0
3 1 27/06/1996 28/06/1996 1 0
3 2 04/07/1996 06/07/1996 0 1
3 3 16/07/1996 18/07/1996 0 1
4 1 21/02/1996 23/02/1996 0 1
4 2 29/04/1996 30/04/1996 1 0
4 3 02/05/1996 02/05/1996 0 1
4 4 02/05/1996 03/05/1996 0 1
5 1 03/10/1996 05/10/1996 1 0
5 2 07/10/1996 08/10/1996 0 1
5 3 10/10/1996 11/10/1996 0 1
Сначала я создаю словарь сИдентификаторы:
ids = massage_df[massage_df['HAD_A_MASSAGE'] == 1]['ID']
id_dict = {id:0 for id in ids}
У всех в этой таблице был массаж, но в моем настоящем наборе данных не всем людям так повезло.
Далее я запускаю этот бит кода:
for grp, df in massage_df.groupby(['ID']):
date_from = df.loc[df[df['HAD_A_MASSAGE']==1].index, 'LEFT']
date_to = date_from + DateOffset(days=30)
mask = ((date_from.values[0] < df['ARRIVED']) &
(df['ARRIVED'] <= date_to.values[0]) &
(df['BROGHT_A_FRIEND'] == 1))
if len(df[mask]) > 0:
id_dict[df['ID'].iloc[0]] = len(df[mask])
По сути, я хочу подсчитать, сколько раз кто-то первоначально приходил на массаж (одинокий или с другом), а затем возвращался в течение 30 дней с другом.Ожидаемые результаты для этой таблицы составят 6 запросов на чтение для идентификаторов 3, 4 и 5.