Jak policzyć liczbę (liczyć) i sumę wartości ujemnych i dodatnich w jednym rzędzie bez wielu pętli w pandach? Chcę uzyskać maksymalną sumę kolejnych negatywów, a także maksymalną sumę kolejnych pozytywów. Przykładowa ramka danych:

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

Chciałbym, aby wynik wyglądał następująco:

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

Prosty pd.groupby() nie rozwiązuje problemu, ponieważ nie grupuje zamówienia. Może jakieś zapytanie sql? pd.query()?

2
Matt Elgazar 24 listopad 2018, 22:37

1 odpowiedź

Najlepsza odpowiedź

Moje podejście polegałoby na tym, aby najpierw nadać każdemu "ten sam znak z rzędu" -grupę inną liczbę, aby kontynuować z groupby.
Porównanie Value z jego przesuniętą tablicą względem znaku daje separatory tych grup. Sumowanie zbiorcze prowadzi następnie do unikalnych numerów, identyfikatorów, jeśli chcesz:

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

Następnie możesz pogrupować według tego identyfikatora i obliczyć długość grup, sumę i ich znak:

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

Który prowadzi do

         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
2
SpghttCd 26 listopad 2018, 02:58