Прокрутите скользящую сумму Pandas (чтобы получить сумму последних 100)

У меня есть следующие данные:

Date        Qty
01/01/2019  4.15
02/01/2019  12.39
03/01/2019  14.15
04/01/2019  12.15
05/01/2019  3.26
06/01/2019  6.23
07/01/2019  15.89
08/01/2019  5.55
09/01/2019  12.49
10/01/2019  9.4
11/01/2019  9.11
12/01/2019  9.18
13/01/2019  13.45
14/01/2019  4.52
15/01/2019  0
16/01/2019  0
17/01/2019  8.41
18/01/2019  9.55
19/01/2019  15.43
20/01/2019  16.45
21/01/2019  9.28
22/01/2019  9.55
23/01/2019  7.87
24/01/2019  12.58
25/01/2019  6.12
26/01/2019  6.15
27/01/2019  6.07
28/01/2019  15.53

Результат, которого я пытаюсь достичь, таков:

Date        Window_Sum
01/01/2019  
02/01/2019  
03/01/2019  
04/01/2019  
05/01/2019  
06/01/2019  
07/01/2019  
08/01/2019  
09/01/2019  
10/01/2019  
11/01/2019  100.62
12/01/2019  109.8
13/01/2019  110.86
14/01/2019  101.23
15/01/2019  101.23
16/01/2019  101.23
17/01/2019  109.64
18/01/2019  103.78
19/01/2019  112.98
20/01/2019  107.99
21/01/2019  104.78
22/01/2019  104.93
23/01/2019  103.69
24/01/2019  107.09
25/01/2019  113.21
26/01/2019  101.39
27/01/2019  107.46
28/01/2019  105.03

Позвольте мне вкратце объяснить логику получения вывода: Итак, на 01.01.2019 количество равно 4,15, и, оглядываясь назад, нет других значений, поэтому совокупная сумма не превышает 100. Следовательно, выходное значение равно NULL.

Перенесемся в 10.01.2019, количество составляет 9,4, а если оглянуться назад, то общая сумма составит 95,66. Поскольку совокупная сумма не превышает 100, на выходе будет значение NULL.

Далее посмотрим на 01.11.2019. Кол-во здесь составляет 9,11, а, оглядываясь назад, общая сумма равна 100,62. Причина, по которой это 100,62, а не 104,77, заключается в том, что сумма Qty с 01.11.2019 по 02.01.2019 (если смотреть назад) сначала достигает 100 / немного выше 100.

Точно так же на 01.12.2019 количество здесь составляет 9,18, а, оглядываясь назад, совокупная сумма составляет 100,8, потому что сумма Qty с 01.12.2019 по 02.01.2019 (если смотреть назад) составляет 100 / немного выше. 100 первых.

Есть ли решение, которое позволяет использовать цикл в функции скользящей суммы pandas для достижения этого результата?

Здесь я пытаюсь добиться, чтобы как только совокупная сумма достигнет 100 или чуть больше 100, я возьму значение и добавлю его в «Window_Sum».

Обновление: удалось запустить код с помощью. Вот решение:

#get last row index
start=len(data)-1

#initialise cumulative sum
cumsum = 0

for i in range(start,-1,-1):
    j=i
    while cumsum < 100:
        cumsum +=  data.loc[j,'Qty']
        if j!=0:
            j-=1
        else: 
            cumsum=None
            break

    data.loc[i,'Window_Sum']=cumsum
    cumsum=0

person Wenna Loo    schedule 07.11.2019    source источник


Ответы (1)


Просто используйте функцию cumsum():

In [7]: df['Window_Sum'] = df['Qty'].cumsum()

In [8]: df.head()
Out[8]:
        Date  Qty  Window_Sum
0  01-Jan-19  4.0         4.0
1  02-Jan-19  1.0         5.0
2  03-Jan-19  6.0        11.0
3  04-Jan-19  3.0        14.0
4  05-Jan-19  3.0        17.0

Надеюсь, это то, что вы искали!

person Swagga Ting    schedule 07.11.2019
comment
Привет, я пытаюсь добиться, чтобы как только совокупная сумма достигнет 100 или чуть больше 100, я возьму значение и добавлю его в Window_Sum. - person Wenna Loo; 07.11.2019
comment
Я пропустил эту часть, но до сих пор неясно, чего именно вы пытаетесь достичь. Не возражаете ли вы отредактировать вопрос, чтобы уточнить, и, возможно, использовать меньший набор данных (например, 5-10 строк) в качестве примера? - person Swagga Ting; 07.11.2019
comment
Думаю, я начинаю понимать. Вам нужна оконная кумулятивная сумма с постоянной ретроспективой? - person Swagga Ting; 07.11.2019
comment
Привет да. Мне нужно найти оптимальное окно для скользящей суммы, чтобы как только совокупная сумма достигнет 100 или чуть больше 100, я возьму значение и добавлю его в новый столбец Window_Sum для этого конкретного периода даты. - person Wenna Loo; 07.11.2019
comment
Я все еще не полностью понимаю. Что вы имеете в виду под добавлением? Можете ли вы отредактировать вопрос, чтобы продемонстрировать аналогичную вещь с меньшим набором данных? - person Swagga Ting; 07.11.2019
comment
Привет, редактировали вопрос. Спасибо, что нашли время помочь. :) - person Wenna Loo; 08.11.2019