Короткий ответ
Скользящая средняя считается через df['col'].rolling(window=N).mean(), где N — размер окна в количестве периодов (или временной интервал при отсортированном datetime-индексе).
Как это работает подробнее
rolling(window=N) создаёт объект скользящего окна, который для каждой позиции берёт N последних значений (включая текущее) и применяет указанную агрегатную функцию; первые N-1 значений результата будут NaN, так как для них не хватает полного окна (если не задан min_periods).
Пример кода
question-126.py
import pandas as pd
df = pd.DataFrame({'day': range(1, 8), 'sales': [10, 12, 9, 15, 20, 18, 22]})
df['rolling_3'] = df['sales'].rolling(window=3).mean()
print(df)Что использовать на практике
- Практика. перед расчётом важно убедиться, что данные отсортированы по времени и не содержат пропущенных дат внутри ряда (иначе окно из N "строк" не будет соответствовать N календарным дням); min_periods можно использовать, чтобы считать статистику даже по неполному окну в начале ряда.
- Проверка. для day=3 rolling_3 должен равняться среднему значений дней 1,2,3 — (10+12+9)/3 = 10.33, а для day=1 и day=2 значения будут NaN из-за неполного окна.
Подводные камни
- Частая ошибка. применяют rolling по числу строк к данным с пропущенными датами, думая, что окно соответствует календарным дням, хотя при пропущенных днях окно "сдвигается" на доступные записи; не учитывают, что NaN в начале ряда — не ошибка, а естественное следствие недостатка данных для полного окна, и пытаются "исправить" это искусственным заполнением.