Скользящие периоды и нарастающие окна

Считаем показатели за «последние N месяцев» — для сглаживания и трендов.

Скользящее окно — расчёт показателя за фиксированный период, отсчитанный назад от текущей даты (например, последние 3 месяца).

Зачем нужны скользящие периоды

Месячная выручка скачет: акция, праздники, случайность. Чтобы увидеть тренд, а не шум, берут скользящее окно — например, среднюю выручку за последние 3 месяца. Каждый месяц окно «сдвигается», сглаживая колебания. Такие метрики (rolling average, last-N-months) — стандарт в аналитике продаж и трафика.

DATESINPERIOD

Главный инструмент — функция, возвращающая набор дат за период от опорной даты:

Выручка за 3 мес = CALCULATE(
    [Выручка],
    DATESINPERIOD( Date[Дата], MAX(Date[Дата]), -3, MONTH )
)

Аргументы: столбец дат, опорная дата (берём максимальную в контексте), число периодов (-3 = три назад) и единица (MONTH). Результат — сумма за последние три месяца относительно текущей точки.

Скользящее окно «последние 3 месяца»:
  точка Мар  →  [Янв Фев Мар]
  точка Апр  →     [Фев Мар Апр]
  точка Май  →        [Мар Апр Май]   окно «едет» вправо
  точка Июн  →           [Апр Май Июн]

Скользящее среднее

Чтобы сгладить тренд, окно делят на число периодов:

Среднее за 3 мес =
VAR СуммаОкна = CALCULATE( [Выручка],
    DATESINPERIOD( Date[Дата], MAX(Date[Дата]), -3, MONTH ) )
RETURN
    DIVIDE( СуммаОкна, 3 )

На графике линия скользящего среднего идёт плавно, в отличие от «зубчатой» фактической выручки — по ней легко прочитать направление бизнеса.

Иллюстрация сглаживания

rev = [100, 150, 120, 90, 200, 180]  # выручка по месяцам
window = 3
for i in range(window - 1, len(rev)):
    avg = sum(rev[i - window + 1:i + 1]) / window
    print("месяц", i + 1, "скользящее среднее:", round(avg, 1))

Вывод:

месяц 3 скользящее среднее: 123.3
месяц 4 скользящее среднее: 120.0
месяц 5 скользящее среднее: 136.7
месяц 6 скользящее среднее: 156.7

Как работает под капотом

В каждой точке оси (месяце) функция определяет опорную дату через MAX(Date[Дата]) в текущем контексте, затем DATESINPERIOD отсчитывает назад нужное число периодов и формирует диапазон дат. CALCULATE накладывает его как фильтр, и мера считается по этому окну. Поскольку опорная дата своя в каждой точке, окно автоматически «едет» вдоль оси — отсюда эффект скольжения.

Частые ошибки

  • Жёстко делить на 3 при неполном окне. В первых месяцах данных меньше трёх — среднее исказится; иногда делят на фактическое число месяцев.
  • Путать накопительный итог и скользящее окно. YTD растёт с начала года, скользящее окно — фиксированной ширины и «едет».
  • Брать опорную дату из фактов, а не из таблицы дат. Нарушает непрерывность и сдвигает окно.

Итог

  • Скользящее окно считает показатель за последние N периодов и сглаживает колебания.
  • DATESINPERIOD строит диапазон от опорной даты назад; делением получают скользящее среднее.
  • Окно «едет» вдоль оси, потому что опорная дата своя в каждой точке.
Проверьте себя
1. Зачем считают скользящее среднее за последние N месяцев?
AЧтобы увеличить выручку
BЧтобы сгладить колебания и увидеть тренд
CЧтобы удалить старые данные
DЭто требование лицензии
2. Какая функция возвращает диапазон дат за N периодов назад от опорной даты?
ATOTALYTD
BDATESINPERIOD
CALL
DDISTINCTCOUNT