Графики перевозок
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
-
Запрос на полный инференс к модели графиков.
-
Запрос к калькулятору цен по каждому графику. Используется векторизованный инференс калькулятора.
-
По графикам, для которых калькулятор выдал неуверенный предикт, запрос к БД для медианного тарифа по направлению.
-
Отдача только тех графиков, для которых была найдена цена.
/schedule/calculate
-
Восстановление информации по каждому графику в корзине: инференс по неполному ключу к модели графиков (отсутствуют федеральные регионы).
-
Запрос к калькулятору цен по каждому графику. Подразумевается, что считается корзина из свежих графиков, поэтому если в корзине окажется график, для которого нет цен в калькуляторе или тарифах, то вернется 500 ошибка.
-
Пересчет цен в корзине, принимая во внимание новое число дней в подграфике.
No Comments