Панды продлевают дату индекса, используя группу - PullRequest
0 голосов
/ 05 октября 2018

У меня есть ряд транзакций, похожих на эту таблицу:

ID  Customer    Date    Amount
1   A        6/12/2018  33,223.00
2   A        9/20/2018  635.00
3   B        8/3/2018   8,643.00
4   B        8/30/2018  1,231.00
5   C        5/29/2018  7,522.00

Однако мне нужно получить среднюю сумму за последние шесть месяцев (на сегодняшний день)

, которую я использовал

df.groupby('Customer').resample('W')['Amount'].sum()

И получите что-то вроде этого:

CustomerCode  PayDate   
A             2018-05-21                    268
              2018-05-28                   0.00
              2018-06-11                   0.00
              2018-06-18                472,657
              2018-06-25                   0.00

Однако с помощью этого решения я получаю только диапазон дат, в которых сумма была у клиентов.Мне нужно продлить недели для каждого клиента, чтобы я мог получить весь диапазон шести месяцев (в неделях).В этом примере мне нужно было бы получить для клиента A от недели '2018-04-05' (которая ровно шесть месяцев назад с сегодняшнего дня) до сегодняшней недели (заполнено, конечно, 0, так как не было суммы)

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Вот решение, которое я нашел для моего вопроса.Сначала я создаю нужные мне даты (последние шесть месяцев, но с частотой недель)

dates = pd.date_range(datetime.date.today() - datetime.timedelta(6*365/12),
                      pd.datetime.today(),
                      freq='W')

Затем я создаю многоиндексный список, используя продукт клиента с датами.

multi_index = pd.MultiIndex.from_product([pd.Index(df['Customer'].unique()), 
                                          dates], 
                                         names=('Customer', 'Date'))

Затем я переиндексирую df, используя недавно созданный мультииндекс, и, наконец, я заполняю нулями пропущенные значения.

df.reindex(multi_index)
df.fillna(0)
0 голосов
/ 05 октября 2018

Resample супер гибкий.Чтобы получить 6-месячную сумму вместо недельной суммы, которая у вас есть на данный момент, вам нужно:

df.groupby('Customer').resample('6M')['Amount'].sum()

, которые группируются к концу месяца;Начало месяца будет '6MS'.

Более подробную информацию о доступных частотах можно найти здесь: http://pandas.pydata.org/pandas-docs/stable/timeseries.html#offset-aliases

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