Как суммировать по> дате для диапазона дат и добавить их в новый столбец в новом фрейме данных в пандах? - PullRequest
3 голосов
/ 25 июня 2019

У меня есть набор данных, похожий на следующий:

abbrev    amount    maturity
acct1     100       6/2/2019
acct1     500       6/3/2019
acct1     1100      6/5/2019
acct2     200       6/3/2019
acct3     1000      6/4/2019
acct4     2500      6/5/2019

Я пытаюсь создать список или диапазон дат. Я попробовал следующее:

accountDates = pd.date_range(start='6/1/2019', end='6/5/2019')

Затем я хочу поочередно просмотреть диапазон дат и получить суммы, когда срок погашения превышает дату. Например, если срок погашения> «01.06.2009», acct1 будет суммировать до 1200. В идеале, я бы хотел, чтобы эта информация сохранялась в новом кадре данных, который выглядит следующим образом:

abbrev    6/1/2019    6/2/2019    6/3/2019    6/4/2019    6/5/2019
acct1     1700        1600        1100        1100        0
acct2     200         200         0           0           0
acct3     1000        1000        1000        0           0
acct4     2500        2500        2500        2500        0

Но я борюсь с тем, как будет работать механика цикла, и если бы я мог просто использовать цикл for с функцией агрегированной суммы и заставить его проходить по датам, но как тогда он будет хранить единичные даты результатов и добавление нового столбца в новый фрейм данных?

Редактировать: Добавил еще некоторую информацию в набор данных, чтобы сделать более понятным (надеюсь) сценарий использования (см. Acct1), где я хочу, чтобы он всегда суммировал все в заданном аккаунте, у которого позиции имеют срок погашения больше, чем дата его тестирования из списка диапазона дат.

Ответы [ 3 ]

3 голосов
/ 25 июня 2019

вы можете использовать pivot_table, затем reindex с обратным списком дат и использовать cumsum плюс shift, чтобы получить смещенную сумму за один день.Затем reindex снова со списком дат в правильном порядке.

print (df.pivot_table(values='amount', index='abbrev', 
                      columns='maturity', aggfunc=sum, fill_value=0)
          .reindex(columns=accountDates[::-1])
          .cumsum(axis=1)
          .shift(axis=1)
          .reindex(columns=accountDates)
          .fillna(0))
       2019-06-01  2019-06-02  2019-06-03  2019-06-04  2019-06-05
abbrev                                                            
acct1       1700.0      1600.0      1100.0      1100.0         0.0
acct2        200.0       200.0         0.0         0.0         0.0
acct3       1000.0      1000.0      1000.0         0.0         0.0
acct4       2500.0      2500.0      2500.0      2500.0         0.0
0 голосов
/ 26 июня 2019

Еще один дубль с использованием join и pivot:

(df[['abbrev','maturity']].join(df.sort_values(['abbrev','maturity'], ascending=False)
                                  .groupby(['abbrev'])
                                  .cumsum())
                          .pivot(index='abbrev', columns='maturity', values='amount')
                          .reindex(columns=accountDates)
                          .shift(-1, axis=1)
                          .bfill(1)
                          .fillna(0))
0 голосов
/ 25 июня 2019

Вам нужно groupby, а затем pivot_table

df['maturity'] = df['maturity'] - pd.Timedelta(days=1)
mdata = df.groupby(['maturity', 'abbrev']).sum().reset_index(1).reindex(accountDates)
pdf = pd.pivot_table(mdata.dropna(), index='abbrev', columns=mdata.dropna().index).bfill(1).fillna(0)

Выход:

       amount                                 
       2019-06-01 2019-06-02 2019-06-03 2019-06-04
abbrev                                            
acct1      1200.0        0.0        0.0        0.0
acct2       200.0      200.0        0.0        0.0
acct3      1000.0     1000.0     1000.0        0.0
acct4      2500.0     2500.0     2500.0     2500.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...