import pandas as pd
df = pd.DataFrame({
'month': ['2026-01', '2026-02', '2026-03'],
'revenue': [100, 150, 120],
})
df['growth'] = df['revenue'].pct_change()
Результат:
month revenue growth 2026-01 100 NaN 2026-02 150 0.50 2026-03 120 -0.20
df['growth_pct'] = (df['revenue'].pct_change() * 100).round(1)
Результат:
revenue growth_pct
100 NaN
150 50.0
120 -20.0
df = pd.DataFrame({
'user_id': [1, 1, 2, 2],
'spend': [100, 130, 40, 60],
})
df['mom'] = df.groupby('user_id')['spend'].pct_change(fill_method=None)
Результат:
user_id spend mom
1 100 NaN
1 130 0.30
2 40 NaN
2 60 0.50
Порешать Python-задачи в тренажёре →
Любимый вопрос про расчёт темпа роста MoM/YoY; идёт в паре с shift (на котором построен) и diff — просят объяснить разницу абсолютного и относительного прироста.
pct_change — относительный прирост (s / s.shift()) - 1 в долях. diff — абсолютная разность s - s.shift() в исходных единицах. Для темпа роста выручки MoM/YoY берут pct_change, для дельты в рублях или штуках — diff.
Умножь результат на 100: (s.pct_change() * 100).round(1). Сам pct_change возвращает доли, где 0.5 означает +50%, а -0.2 означает -20%. Округление удобно для читаемых отчётов.
Раньше pct_change по умолчанию форвардил NaN (fill_method='pad'), из-за чего пропуски в ряду молча заполнялись и искажали прирост. В pandas 2.1+ это признано deprecated — явно передавай fill_method=None, чтобы NaN не заполнялись автоматически.
Pandas: временные ряды · Pandas: основы
groupby · merge · pivot_table · apply · value_counts · drop_duplicates
Открыть Python-тренажёр (556 задач) →