#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()