Skip to main content

Аналитика сборки по прошедшим дням

Пользователю отображаются следующие элементы:

  1. Временной интервал, за который представлены данные;
  2. Прогнозное количество заказов для указанного интервала (ожидаемое значение, сформированное прогнозной моделью на основе данных, описанных в статье);
  3. Фактическое количество заказов за интервал (реальное значение, извлеченное из базы данных ВкусВилл);
  4. Оценка точности прогноза, рассчитываемая как симметричная средняя абсолютная процентная ошибка. 
    (2 * (факт - прогноз) / (факт + прогноз))

Возможные значения:

  • "Попадание" (прогноз был в пределах нормы если разница между фактом и прогнозом меньше либо равна 3 или оценка точности < 0,15), 
  • "Недопрогноз" (прогноз был занижен, фактическое значение выше если оценка точности > 0), 
  • "Перепрогноз" (прогноз был завышен, фактическое значение ниже если оценка точности < 0)

WDsimage.png


Прогнозное значение извлекается из таблицы time_series, из записей с типом 7 (обозначающим прогноз по геозонам для сборки заказов). Значение берется из поля value.

x8mimage.png


Фактическое значение формируется из представления time_series_col_hourly, которое создается на основе информации из таблицы time_series. Количество заказов рассчитывается путем суммирования значений поля qty всех записей за выбранный интервал. Пример расчета: для значений qty = 90 + 118 + 68 общее количество заказов составляет 276.

4pRimage.png


Для отображения всех этих данных в интерфейсе используется настройка dayPlaceTransform, которая формирует массив $hours. Массив содержит объекты для каждого часа суток (0–23) с соответствующими полями:

  • hour — текущий час;
  • stat — прогнозное количество заказов на этот час;
  • plan — фактическое количество заказов на этот час;
  • delta — отклонение между прогнозом и фактическим значением.
  • smape — относительная ошибка прогноза, чтобы оценить его качество независимо от масштаба данных (симметричная средняя абсолютная процентная ошибка).
  • err — ошибка прогноза: 0 — в пределах нормы (попадание), 1 — недопрогноз (прогноз занижен), -1 — перепрогноз (прогноз завышен).

Код, формирующий массив представлен ниже.

$hours := [0..23].(
    $statObj := $lookup($hourStat, $string($));
    $stat := $number($inPast ? $statObj.cnt : $statObj.cnt) * $extraNorm;
    $plan := $number([$lookup($eventsStat, $string($)).sum_qty, 0][0]);
    $delta := $stat
        ? $inPast
            ? $round($plan - $stat, 1)
            : $round(($stat - $plan) / $speed)
        : 0;
    $smape := 2 * ($plan - $stat) / ($plan + $stat);
    $err := ($abs($delta) <= 3 or $abs($smape) < 0.15)
        ? 0
        : $smape > 0
            ? 1
            : -1;
    {
        "hour": $,
        "stat": $round($stat,1),
        "plan": $round($plan,1),
        "delta": $delta,
        "smape": $smape,
        "err": $err
    };
);