Расширение суммы с группировкой по дате - PullRequest
1 голос
/ 19 марта 2019

У меня есть фрейм данных, в котором я пытаюсь сделать увеличивающуюся сумму значений и сгруппировать их по дате.

В частности, мои данные выглядят так:

creationDateTime    OK  Fail    
2017-01-06 21:30:00 4   0
2017-01-06 21:35:00 4   0
2017-01-06 21:36:00 4   0

2017-01-07 21:48:00 3   1
2017-01-07 21:53:00 4   0

2017-01-08 21:22:00 3   1
2017-01-08 21:27:00 3   1

2017-01-09 21:49:00 3   1

и я 'Я пытаюсь получить что-то похожее на:

creationDateTime    OK  Fail  RollingOK  RollingFail
2017-01-06 21:30:00 4   0     4          0
2017-01-06 21:35:00 4   0     8          0
2017-01-06 21:36:00 4   0     12         0

2017-01-07 21:48:00 3   1     3          1
2017-01-07 21:53:00 4   0     7          1

2017-01-08 21:22:00 3   1     3          1
2017-01-08 21:27:00 3   1     6          2

2017-01-09 21:49:00 3   1     3          1

Я выяснил, как сделать скользящую сумму значений, используя:

data_aggregated['RollingOK'] = data_aggregated['OK'].expanding(0).sum()       
data_aggregated['RollingFail'] = data_aggregated['Fail'].expanding(0).sum()

Но я не уверен, какЯ могу изменить это, чтобы получить скользящие суммы, сгруппированные по дням, поскольку приведенный выше код выполняет скользящую сумму по всем строкам без группировки по дням.

Любая помощь очень ценится.

Ответы [ 2 ]

2 голосов
/ 19 марта 2019

Используйте DataFrameGroupBy.cumsum с указанными столбцами после groupby:

#if DatetimeIndex
idx = data_aggregated.index.date
#if column
#idx = data_aggregated['creationDateTime'].dt.date
data_aggregated[['RollingOK','RollingFail']] = (data_aggregated.groupby(idx)['OK','Fail']
                                                               .cumsum())
print (data_aggregated)
                     OK  Fail  RollingOK  RollingFail
creationDateTime                                     
2017-01-06 21:30:00   4     0          4            0
2017-01-06 21:35:00   4     0          8            0
2017-01-06 21:36:00   4     0         12            0
2017-01-07 21:48:00   3     1          3            1
2017-01-07 21:53:00   4     0          7            1
2017-01-08 21:22:00   3     1          3            1
2017-01-08 21:27:00   3     1          6            2
2017-01-09 21:49:00   3     1          3            1

Вы также можете работать со всеми столбцами:

data_aggregated = (data_aggregated.join(data_aggregated.groupby(idx)
                                                       .cumsum()
                                                       .add_prefix('Rolling')))
print (data_aggregated)
                     OK  Fail  RollingOK  RollingFail
creationDateTime                                     
2017-01-06 21:30:00   4     0          4            0
2017-01-06 21:35:00   4     0          8            0
2017-01-06 21:36:00   4     0         12            0
2017-01-07 21:48:00   3     1          3            1
2017-01-07 21:53:00   4     0          7            1
2017-01-08 21:22:00   3     1          3            1
2017-01-08 21:27:00   3     1          6            2
2017-01-09 21:49:00   3     1          3            1

Ваше решение должнобыть изменены:

data_aggregated[['RollingOK','RollingFail']] = (data_aggregated.groupby(idx)['OK','Fail']
                                                           .expanding(0)
                                                           .sum()
                                                           .reset_index(level=0, drop=True))
2 голосов
/ 19 марта 2019

Вы можете использовать, (если 1-й столбец: creationDateTime является столбцом):

df['RollingOK']=df.groupby(df.creationDateTime.dt.date)['OK'].cumsum()
df['RollingFail']=df.groupby(df.creationDateTime.dt.date)['Fail'].cumsum()
print(df)

    creationDateTime  OK  Fail  RollingOK  RollingFail
0 2017-01-06 21:30:00  4   0     4          0          
1 2017-01-06 21:35:00  4   0     8          0          
2 2017-01-06 21:36:00  4   0     12         0          
3 2017-01-07 21:48:00  3   1     3          1          
4 2017-01-07 21:53:00  4   0     7          1          
5 2017-01-08 21:22:00  3   1     3          1          
6 2017-01-08 21:27:00  3   1     6          2          
7 2017-01-09 21:49:00  3   1     3          1   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...