PANDAS сбрасывает Cumsum, когда предыдущее значение является отрицательным - PullRequest
0 голосов
/ 28 февраля 2019

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

В RI может применяться условиев groupby с функцией ave (), но я не могу сделать это в Python, поэтому у меня возникли проблемы с поиском решения.Может кто-нибудь мне помочь?

Вот образец:

import pandas as pd

df = pd.DataFrame({'PRODUCT': ['A'] * 40, 'GROUP': ['1'] * 40, 'FORECAST': [100, -40, -40, -40]*10, })

df['CS'] = df.groupby(['GROUP', 'PRODUCT']).FORECAST.cumsum()

# Reset cumsum if
# condition: (df.FORECAST > 0) & (df.groupby(['GROUP', 'PRODUCT']).FORECAST.shift(-1).fillna(0) <= 0)

1 Ответ

0 голосов
/ 01 марта 2019

Это решение будет работать для сброса суммы для любого примера, где суммируемые значения изменяются с отрицательного на положительное (независимо от того, является ли набор данных хорошим и периодическим, как в вашем примере)

import numpy as np
import pandas as pd

df = pd.DataFrame({'PRODUCT': ['A'] * 40, 'GROUP': ['1'] * 40, 'FORECAST': [100, -40, -40, -40]*10, })

cumsum = np.cumsum(df['FORECAST'])

# Array of indices where sum should be reset
reset_ind = np.where(df['FORECAST'].diff() > 0)[0]

# Sums that need to be subtracted at resets
subs = cumsum[reset_ind-1].values

# Repeat subtraction values for every entry BETWEEN resets and values after final reset
rep_subs = np.repeat(subs, np.hstack([np.diff(reset_ind), df['FORECAST'].size - reset_ind[-1]]))

# Stack together values before first reset and resetted sums
df['CS'] = np.hstack([cumsum[:reset_ind[0]], cumsum[reset_ind[0]:] - rep_subs])

В качестве альтернативы на основе этого решения аналогичен вопрос (и мое понимание полезности groupby)

import pandas as pd
import numpy as np

df = pd.DataFrame({'PRODUCT': ['A'] * 40, 'GROUP': ['1'] * 40, 'FORECAST': [100, -40, -40, -40]*10, })

# Create indices to group sums together
df['cumsum'] = (df['FORECAST'].diff() > 0).cumsum()

# Perform group-wise cumsum
df['CS'] = df.groupby(['cumsum'])['FORECAST'].cumsum()

# Remove intermediary cumsum column
df = df.drop(['cumsum'], axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...