Skip to main content

Графики перевозок

API

Полный инференс
{
    "model_type": "total"
}

Ответом будут отданы результаты инференса по всем ключам, имеющимся в модели.

Инференс по ключу
{
    "model_type": "key",
    "from_city_dir_id": ...,
    "to_city_dir_id": ...,
    ... (полный или частичный набор полей из ключа модели)
}

Если набор ключей полный, то в ответ придет результат инференса только по этому ключу (или 500 ошибка, если такого ключа нет).

Если набор ключей неполный, то будет выполнен поиск по неполному ключу. В этом случае придут результаты инференса по всем полным ключам, которые соответствуют запрошенному частичному ключу.

Формат ответа
 [{
            from_city_dir_id: int,		        id города отправления
            to_city_dir_id,			            id города назначения
            weight: double,                     вес, в кг
            volume: double,                     объем
            loading_type_id: int         	    id таблицы loading_type
            car_type_id: int,                   тип кузова
            forecast_horizon: int,              длительность предложения (дней)
            delta: {                            доверительный интервал по времени для всего графика
                low: int                        нижняя граница интервала
                high: int                       верхняя граница интервала
            },
            period_length: int,                 длительность периода
            sub: [{                             подграфики на каждый день недели
                day: int,                       номер дня в периоде (для периода 7, 0 - понедельник, 6 - воскресенье)
                count: int,                     число поездок в подграфике
                delta: {                        доверительный интервал по времени для подграфика
                    low: int                    нижняя граница интервала
                    high: int                   верхняя граница интервала
                },
                hash: str			            хэш подграфика
            }, ...]     
}, ...]
Расшифровка хэша графика
{
	"model_type": "hash_decipher",
	"hashes": [...] 			          массив хэшей
}

Архитектура

Рабочей единицей модели является ключ. Состав ключа определяется в настройках (параметр key_fields). Фактически это набор полей, которые определяют направление.

По каждому ключу строится предиктивная модель (Prophet) по объему перевозок (фактически по сумме грузоподъемности, поле weight) на каждый день.

При инференсе на период прогнозируемого горизонта (30 дней) извлекается средний объем по дням недели, который проверяется относительным порогом. Если значение выше порога, то считаем перевозку в этот день недели периодичной.

Далее соседние дни недели (воскресенье и понедельник считаются соседними), определенные как периодичные, соединяются в один элемент. В этом элементе день с наибольшим средним объемом считается основным, и он отдается в поле day. По оставшимся дням указанного элемента определяется смещение delta.

Ответом модели является набор дней и их смещений по каждому ключу.


Схема инференса

Реализация на стороне ML-API:

/schedule/transport
  1. Запрос на полный инференс к модели графиков.

  2. Запрос к калькулятору цен по каждому графику. Используется векторизованный инференс калькулятора.

  3. По графикам, для которых калькулятор выдал неуверенный предикт, запрос к БД для медианного тарифа по направлению.

  4. Отдача только тех графиков, для которых была найдена цена.

/schedule/calculate
  1. Восстановление информации по каждому графику в корзине: инференс по неполному ключу к модели графиков (отсутствуют федеральные регионы).

  2. Запрос к калькулятору цен по каждому графику. Подразумевается, что считается корзина из свежих графиков, поэтому если в корзине окажется график, для которого нет цен в калькуляторе или тарифах, то вернется 500 ошибка.

  3. Пересчет цен в корзине, принимая во внимание новое число дней в подграфике.