Векторизация условного подсчета в пандах - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть сценарий 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...