s = pd.Series([10, 12, 30])
s.ewm(span=2, adjust=False).mean().round(2)
Результат:
0 10.00 1 11.33 2 23.78 dtype: float64
s = pd.Series([10, 20, 30])
s.ewm(alpha=0.5, adjust=False).mean()
Результат:
0 10.0 1 15.0 2 22.5 dtype: float64Порешать Python-задачи в тренажёре →
Сглаживание шумных метрик (DAU, выручка, конверсия), выделение тренда, EWMA-контроль аномалий. Спрашивают, когда обсуждают сглаживание time-series и разницу между скользящим и экспоненциальным средним.
rolling берёт фиксированное окно и внутри него веса равные (или заданные win_type), забывая всё за пределами окна. ewm же учитывает всю историю, но с экспоненциально убывающими весами, поэтому реагирует на свежие точки быстрее и не имеет резкого края окна. Для стабильного «среднего за N дней» берут rolling, для плавного трендового сглаживания — ewm.
alpha — коэффициент сглаживания от 0 до 1: чем он ближе к 1, тем сильнее вес свежих точек и короче память. span — более наглядная запись через «эквивалент N периодов», связанная как alpha = 2/(span+1). halflife задаёт период полураспада веса. Указывать нужно только один из них.
adjust=True считает взвешенное среднее с корректной нормировкой весов, из-за чего начальные значения ряда отличаются от простой рекуррентной формулы. adjust=False применяет рекуррентное EWMA y_t = alpha*x_t + (1-alpha)*y_{t-1}, что удобно для потоковых расчётов. На длинной дистанции результаты сходятся, расхождение заметно в начале ряда.
Pandas: временные ряды · NumPy векторизация
apply · to_datetime · .str · np.where · rolling · resample
Открыть Python-тренажёр (556 задач) →