Функция pct_change() в pandas: относительный прирост и темп роста

pct_change() считает относительный прирост между соседними значениями: (s / s.shift()) - 1. Это готовый темп роста MoM/YoY в долях — умножь на 100 и получишь проценты. В SQL то же самое собирают вручную через LAG(): (val - lag) / lag.

Синтаксис

Series.pct_change(periods=1, fill_method=None)

Примеры использования

Пример 1: Прирост к прошлому месяцу (в долях)

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

Пример 2: Прирост в процентах

df['growth_pct'] = (df['revenue'].pct_change() * 100).round(1)

Результат:

revenue  growth_pct
    100         NaN
    150        50.0
    120       -20.0

Пример 3: Прирост внутри групп

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-задачи в тренажёре →

Типичная ошибка

По историческому умолчанию pct_change форвардил пропуски (fill_method='pad') и мог скрывать дыры в данных — в pandas 2.1+ это deprecated, передавай fill_method=None. Результат в долях, а не в процентах (0.5 = +50%). Деление на ноль даёт inf, первая строка — NaN.

Где спрашивают на собеседовании

Любимый вопрос про расчёт темпа роста MoM/YoY; идёт в паре с shift (на котором построен) и diff — просят объяснить разницу абсолютного и относительного прироста.

FAQ: частые вопросы про pct_change

Чем pct_change отличается от 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%. Округление удобно для читаемых отчётов.

Что за предупреждение про fill_method?

Раньше pct_change по умолчанию форвардил NaN (fill_method='pad'), из-за чего пропуски в ряду молча заполнялись и искажали прирост. В pandas 2.1+ это признано deprecated — явно передавай fill_method=None, чтобы NaN не заполнялись автоматически.

Задачи в тренажёре по теме

Вопросы с собеседований по теме

Смежные темы Python

Pandas: временные ряды · Pandas: основы

Другие функции pandas

groupby · merge · pivot_table · apply · value_counts · drop_duplicates

Открыть Python-тренажёр (556 задач) →