Операция с плавающей суммой Python Pandas для подмножества данных - PullRequest
0 голосов
/ 24 мая 2018

Это лучше всего объяснить на примере.

У меня есть следующий фрейм данных (каждую строку можно рассматривать как транзакцию):

DATE        AMOUNT
2017-01-29  10 
2017-01-30  20
2017-01-31  30
2017-02-01  40
2017-02-02  50
2017-02-03  60

Я хотел бы вычислить 2скользящая сумма за день, но только для строк в феврале.

Фрагмент кода, который у меня есть в настоящее время:

df.set_index('DATE',inplace=True)

res=df.rolling('2d')['AMOUNT'].sum()

, что дает:

            AMOUNT 
2017-01-29  10 
2017-01-30  30 
2017-01-31  50 
2017-02-01  70 
2017-02-02  90 
2017-02-03  110

но мне действительно нужны выходные данные только в последних 3 строках, операции с первыми 3 строками не нужны.Когда массив данных огромен, это влечет за собой огромную временную сложность.Как вычислить скользящую сумму только для последних 3 строк (кроме вычисления скользящей суммы для всех строк и последующей операции фильтрации строк после этого)?

* Я также не могу предварительно отфильтровать кадр данных, потому чтов январе не будет периода «просмотра назад» для получения правильного значения скользящей суммы.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Вы можете просто вычислить скользящую сумму только для последних строк, используя tail(4)

res = df.tail(4).rolling('2d')['AMOUNT'].sum()

Вывод:

DATE
2017-01-31      NaN
2017-02-01     70.0
2017-02-02     90.0
2017-02-03    110.0
Name: AMOUNT, dtype: float64

Если вы хотите объединить эти значения - исключая 2017-01-31, то вы можете сделать следующее:

df.loc[res.index[1:]] = res.tail(3)

Вывод:

            AMOUNT
DATE    
2017-01-29  10.0
2017-01-30  20.0
2017-01-31  30.0
2017-02-01  70.0
2017-02-02  90.0
2017-02-03  110.0
0 голосов
/ 24 мая 2018

Вы можете использовать timedelta, чтобы отфильтровать ваш df и сохранить последний день января.

import datetime  

dateStart = datetime.date(2017, 2, 1) - datetime.timedelta(days=1)
dateEnd = datetime.date(2017, 2, 3)
df.loc[dateStart:dateEnd]

Затем вы можете выполнить операцию прокрутки и отбросить первую строку (это 2017-01-31)

...