Цикл по скользящей сумме Панд (чтобы получить сумму последних 100) - PullRequest
0 голосов
/ 07 ноября 2019

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

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.2009 г. Кол-во равно 4,15, и, оглядываясь назад, других значений нет, поэтому накопленная сумма не превышает 100. Следовательно, выходное значение равно NULL.

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

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

Аналогично, 12 /01/2019, кол-во здесь составляет 9,18, а совокупная сумма в обратном порядке равна 100,8, потому что сумма кол-во с 12/01/2019 по 01.02.2009 (в обратном направлении) сначала достигает 100 / чуть выше 100.

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

Здесь я пытаюсь добиться того, чтобы кумулятивная сумма достигла 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

1 Ответ

0 голосов
/ 07 ноября 2019

Просто используйте функцию 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

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

...