cumsum(), cummax(), expanding() în pandas

Calcule cumulate de la primul rând până la rândul curent: total până acum, maximul de până acum, media de până acum.

Sintaxă
serie.cumsum()  serie.cummax()  serie.cummin()  serie.expanding(min_periods=1).mean()

Ce face cumsum(), cummax(), expanding()

cumsum() dă suma cumulată: fiecare rând conține totalul de la început până la el inclusiv. La fel, cummax() și cummin() dau maximul și minimul de până la rândul curent, iar cumprod() produsul.

expanding() este o fereastră care crește: la rândul 3 cuprinde rândurile 1–3, la rândul 4 rândurile 1–4. După ea pui funcția dorită, de exemplu expanding().mean() pentru media de până acum. Este ca rolling, dar fără limită de mărime.

Valorile lipsă sunt sărite implicit (skipna=True): rândul cu lipsă rămâne lipsă, dar calculul continuă după el. Cu groupby poți face totalul cumulat separat pe fiecare grup: df.groupby("oras")["lei"].cumsum().

Parametri

Parametru Descriere
skipna La cumsum/cummax: sare peste valorile lipsă. Implicit True.
min_periods La expanding(): câte valori trebuie să existe ca rezultatul să nu fie lipsă. Implicit 1.

Ce returnează

O Series sau un DataFrame de aceeași formă. expanding() returnează un obiect Expanding, pe care apelezi funcția de calcul.

Exemple

Exemplul 1: Total cumulat și record de până acum

import pandas as pd

df = pd.DataFrame({"luna": ["ian", "feb", "mar", "apr", "mai"],
                   "lei": [300, 450, 200, 500, 350]})
df["total_pana_acum"] = df["lei"].cumsum()
df["record"] = df["lei"].cummax()
df["minim"] = df["lei"].cummin()
print(df)

Rezultat

  luna  lei  total_pana_acum  record  minim
0  ian  300              300     300    300
1  feb  450              750     450    300
2  mar  200              950     450    200
3  apr  500             1450     500    200
4  mai  350             1800     500    200

Exemplul 2: Media de până acum cu expanding()

La rândul 3, media este (8 + 6 + 10) / 3 = 8.

import pandas as pd

note = pd.Series([8, 6, 10, 9, 7], name="nota")
print(pd.DataFrame({"nota": note,
                    "medie_pana_acum": note.expanding().mean().round(2),
                    "max_pana_acum": note.expanding().max()}))

Rezultat

   nota  medie_pana_acum  max_pana_acum
0     8             8.00            8.0
1     6             7.00            8.0
2    10             8.00           10.0
3     9             8.25           10.0
4     7             8.00           10.0

Exemplul 3: Total cumulat pe fiecare oraș

import pandas as pd

df = pd.DataFrame({"oras": ["Iași", "Cluj", "Iași", "Cluj", "Iași"],
                   "lei": [100, 250, 50, 150, 80]})
df["cumulat_oras"] = df.groupby("oras")["lei"].cumsum()
print(df)

Rezultat

   oras  lei  cumulat_oras
0  Iași  100           100
1  Cluj  250           250
2  Iași   50           150
3  Cluj  150           400
4  Iași   80           230

Greșeli frecvente

  • Confunzi cumsum() cu sum(): sum() dă un singur număr, cumsum() dă câte un total pentru fiecare rând.
  • Scrii serie.expanding() fără funcția de la final și primești obiectul Expanding, nu numere.
  • Uiți să sortezi după dată înainte de un total cumulat; ordinea rândurilor decide rezultatul.

Comenzi înrudite

  • DataFrame.rolling(): Calculează pe o fereastră mobilă de rânduri, de exemplu media ultimelor 3 luni, ca să netezești variațiile.
  • shift(), diff(), pct_change(): Compară fiecare rând cu cel dinainte: shift mută valorile, diff dă diferența, pct_change dă creșterea procentuală.
  • DataFrame.groupby(): Împarte tabelul în grupuri după una sau mai multe coloane, ca să calculezi totaluri, medii sau numărări pentru fiecare grup.
  • agg() / aggregate(): Aplică mai multe funcții de agregare deodată, diferite pe coloane, cu nume alese de tine pentru coloanele rezultatului.