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()cusum():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 obiectulExpanding, 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.