вычислить совокупную сумму в массиве из условий

#sum #cumulative-sum #cumsum

#сумма #кумулятивная сумма #cumsum

Вопрос:

на другом языке, который я использую, есть функция, называемая SumSince(условие, массив). Так, например, у меня есть dataArray и ConditionArray, которые выглядят как

Массив данных ConditionArray resultArray
1 1 1
2 0 3
3 0 6
4 1 4
5 0 9
6 0 15

тогда resultArray = SumSince( ConditionArray, dataArray) даст массив, показанный в 3-м столбце

Таким образом, он начинает кумуляцию из условия. Когда новое условие будет выполнено, оно начнет накапливаться с нуля из этого условия.

Есть ли где-нибудь такая похожая функция в Python. Я не смог его найти. Я знаю, что мог бы использовать цикл, но я уверен, что где-то есть функция, которая позволяет это

Спасибо

Ответ №1:

на данный момент я просто написал свою собственную функцию. В Pandas у вас есть Cumsum. Я просто не нашел, как использовать его как SumSince. Я написал функцию ниже. Кажется, работает. Возможно, уродливый код, но только начинающий использовать Python. Если кто-то знает уже существующую функциональность для этого, пожалуйста, дайте мне знать, спасибо

 def SumSince(condition, array):
    length = len(array)
    outputArray = [0] * length
    i = 0
    csum = 0
    while i < length:
        if (condition[i] == 0):
            csum = array[i]   csum
            outputArray[i] = csum
        elif (condition[i] == 1):
            csum = array[i]
            outputArray[i] = csum
        i  = 1
    return outputArray
 
 array = [1,2,3,4,5,6]
condition = [1,0,0,1,0,0]
tst = SumSince(condition, array)

tst
[1, 3, 6, 4, 9, 15]
 

Комментарии:

1. На самом деле я решил это по-другому. Результат тот же, но это работает быстрее. Я работаю с файлами «тиковых данных», где каждый день хранится в файле. Эти файлы обрабатываются в файлы minute, в которых я хочу суммировать информацию каждую минуту. Итак, теперь я удостоверяюсь, что каждая минута в день имеет свой собственный номер, и я использую groupby: df[‘hourplusminute’] = df.index.hour * 60 df.index.minute df[‘cum_volume_at_ask’] = df[‘volume_at_ask’].groupby(df[‘hourplusminute’]).cumsum() df[‘cum_volume_at_bid’] = df[‘volume_at_bid’].groupby(df[‘hourplusminute’]).cumsum()