Панды - как подсчитать отрицательные и положительные значения подряд - PullRequest
0 голосов
/ 24 ноября 2018

Как я могу посчитать количество (количество) и сумму отрицательных и положительных значений подряд без большого количества петель в пандах?Я хочу получить максимальную сумму последовательных негативов, а также максимальную сумму последовательных негативов.Пример кадра данных:

datetime                 Value
2018-11-12 15:10:00       2.00
2018-11-12 15:20:00     -10.50
2018-11-12 15:30:00      10.50
2018-11-12 15:40:00       7.50
2018-11-12 15:50:00       8.00
2018-11-12 16:10:00     -20.00
2018-11-12 16:20:00     -10.00

Мне бы хотелось, чтобы вывод был:

Max # of negatives in a row: 2, Total value = -30.00
Max # of positives in a row: 3, Total value =  26.00

Простой pd.groupby() не решает проблему, поскольку не группирует заказ.Может быть, какой-то SQL-запрос?pd.query()

1 Ответ

0 голосов
/ 25 ноября 2018

Мой подход заключается в том, чтобы сначала присвоить каждой группе «один и тот же знак в строке» другое число, чтобы перейти к groupby.
Сравнение значения со смещенным массивом в отношении знака дает разделители этихгрупп.Кумулятивное суммирование затем приводит к уникальным числам, идентификаторам, если вы хотите:

df['grpnum'] = (np.sign(df.Value) != np.sign(df.Value.shift())).cumsum()

Затем вы можете сгруппировать по этому идентификатору и рассчитать длину групп, сумму и их знак:

ranking = df.groupby('grpnum').agg([sum, len, lambda x: sum(x)>0]).Value

, что приводитдо

         sum  len  <lambda>
grpnum                     
1        2.0  1.0      True
2      -10.5  1.0     False
3       26.0  3.0      True
4      -30.0  2.0     False

print(ranking.groupby('<lambda>')['sum', 'len'].apply(lambda g: g[g['len']==g['len'].max()]))

                  sum  len
<lambda> grpnum           
True     3       26.0  3.0
False    4      -30.0  2.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...