Функция Series.shift() в pandas: сдвиг значений для lag и lead

Series.shift() сдвигает значения на n позиций: shift(1) тянет прошлую строку (lag), shift(-1) — следующую (lead). Это фундамент для расчёта приростов, сравнения с предыдущим периодом и построения признаков во временных рядах. В SQL это оконные функции LAG() и LEAD() — на собесе часто просят показать, что понимаешь связь.

Синтаксис

Series.shift(periods=1, freq=None, fill_value=None)

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

Пример 1: Lag — значение прошлого периода

import pandas as pd

df = pd.DataFrame({
    'date': ['2026-01', '2026-02', '2026-03'],
    'revenue': [100, 150, 210],
})
df['prev'] = df['revenue'].shift(1)

Результат:

   date  revenue   prev
2026-01      100    NaN
2026-02      150  100.0
2026-03      210  150.0

Пример 2: Lead — значение следующего периода

df['next'] = df['revenue'].shift(-1)

Результат:

   date  revenue   next
2026-01      100  150.0
2026-02      150  210.0
2026-03      210    NaN

Пример 3: Сдвиг внутри групп

df = pd.DataFrame({
    'user_id': [1, 1, 2, 2],
    'amount': [100, 300, 50, 80],
})
df['prev'] = df.groupby('user_id')['amount'].shift(1)

Результат:

user_id  amount   prev
      1     100    NaN
      1     300  100.0
      2      50    NaN
      2      80   50.0
Порешать Python-задачи в тренажёре →

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

shift не сортирует данные сам — если строки не упорядочены по времени, lag/lead будут бессмысленными. По группам всегда через groupby(...).shift(), иначе значения перетекут между пользователями. На краях появляется NaN, из-за чего числовой столбец приводится к float.

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

Классический вопрос про lag/lead и признаки для временных рядов; идёт в паре с diff, pct_change и groupby. Часто просят назвать SQL-аналог — LAG() и LEAD().

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

Чем shift отличается от diff?

shift просто сдвигает значения и даёт lag/lead. diff считает разность текущего и сдвинутого значения, то есть s - s.shift(). По сути diff — это частный случай, построенный на shift.

Как сделать shift внутри групп пользователей?

Используй df.groupby('user_id')['amount'].shift(1). Без группировки последнее значение одного пользователя «перетечёт» к первой строке следующего. Перед сдвигом обязательно отсортируй данные по времени.

Что делает отрицательный periods?

shift(-1) сдвигает значения вверх — это lead, значение следующей строки. NaN при этом появляется в конце ряда, а не в начале. Так удобно сравнивать текущий период со следующим.

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

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

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

Pandas: временные ряды · Pandas groupby

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

groupby · pivot_table · value_counts · to_datetime · rolling · resample

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