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
df['next'] = df['revenue'].shift(-1)
Результат:
date revenue next 2026-01 100 150.0 2026-02 150 210.0 2026-03 210 NaN
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-задачи в тренажёре →
Классический вопрос про lag/lead и признаки для временных рядов; идёт в паре с diff, pct_change и groupby. Часто просят назвать SQL-аналог — LAG() и LEAD().
shift просто сдвигает значения и даёт lag/lead. diff считает разность текущего и сдвинутого значения, то есть s - s.shift(). По сути diff — это частный случай, построенный на shift.
Используй df.groupby('user_id')['amount'].shift(1). Без группировки последнее значение одного пользователя «перетечёт» к первой строке следующего. Перед сдвигом обязательно отсортируй данные по времени.
shift(-1) сдвигает значения вверх — это lead, значение следующей строки. NaN при этом появляется в конце ряда, а не в начале. Так удобно сравнивать текущий период со следующим.
Pandas: временные ряды · Pandas groupby
groupby · pivot_table · value_counts · to_datetime · rolling · resample
Открыть Python-тренажёр (556 задач) →