агрегированные данные за последние семь дней для каждой даты - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть набор данных:

 app id geo  date        count
    90  NO  2018-09-04  27
    66  HK  2018-09-03  2
    66  HK  2018-09-02  4   
    80  QA  2018-04-22  5  
    85  MA  2018-04-20  1   
    80  BR  2018-04-19  68

Я пытаюсь создать поле, которое объединит данные для каждой даты за последние семь дней. Мой набор данных должен выглядеть так:

 app id geo  date        count   count_last_7_days
        90  NO  2018-09-04  27    33
        66  HK  2018-09-03  2     6
        66  HK  2018-09-02  4     4
        80  QA  2018-04-22  5     74
        85  MA  2018-04-20  1     69
        80  BR  2018-04-19  68    68

Я пытаюсь этот код:

 df['date'] = pd.to_datetime(df['date']) - pd.to_timedelta(7, unit='d')
    df = df.groupby(['geo','app_id', pd.Grouper(key='date', freq='W')]) . 
   ['count'].sum().reset_index().sort_values('date')

Но даже подумал, что я использую Grouper с недельной периодичностью (freq='W'), он учитывает начало недели в воскресенье, и у меня нет задержки в 7 дней для записей, не относящихся к воскресеньям.

Подскажите, пожалуйста, как я могу рассчитать это поле.

1 Ответ

0 голосов
/ 15 ноября 2018

Грязный однострочник будет

import numpy as np
df['count_last_7_days'] = [np.sum(df['count'][np.logical_and(df['date'][i] - df['date'] < pd.to_timedelta(7,unit='d'),df['date'][i] - df['date'] >= pd.to_timedelta(0,unit='d'))]) for i in range(df.shape[0])]

Обратите внимание, что я преобразовал столбец time в дату и время, используя сначала pd.to_datetime().

Что это делает: для каждого дня он находит все другие строки в пределах желаемого промежутка времени в одну неделю, отмечает их логическим значением и суммирует их после

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