Skip to main content

Работа с данными для прогнозов

Мы получаем исходные данные из базы данных MS SQL с помощью SQL-запросов.


Получение данных о заказах

Для получения данных о заказах составляется отчет по заказам с фильтрацией по дате заказа и наличию даты поставки.

Источником получения данных служит таблица Report.[report_zakaz_tbl]

Запрос извлекает данные о заказах из таблицы отчетов за указанный период времени. Запрос фокусируется на заказах, где дата заказа находится в заданном диапазоне, и дата поставки не является NULL. Дополнительно вычисляется поле с датой поставки, увеличенной на 15 минут.

Текст запроса

Ниже представлен запрос для получения информации о заказах:

SELECT 
    id_order as id, 
    ShopNo as shopno, 
    order_type, 
    gettype, 
    date_order, 
    date_supply, 
    date_supply_untill, 
    date_posted, 
    date_collect_start, 
    date_collected, 
    date_delivery_start, 
    date_delivered, 
    sum_paid, 
    sum_paid_coupon, 
    count_pos, 
    latitude, 
    longitude, 
    client_type, 
    order_weight, 
    delivery_hottime, 
    collecting_await_dur, 
    collecting_dur, 
    delivery_await_dur, 
    delivery_dur, 
    completed_agg, 
    distance, 
    DATEADD(Minute, 15, date_supply) as date_supply_vv 
FROM Report.[report_zakaz_tbl] rzt (NOLOCK) 
WHERE date_order BETWEEN '{{payload.from}}' AND '{{payload.to}}' 
AND date_supply IS NOT NULL
Поля запроса

Запрос возвращает 27 полей. Ниже приведена таблица с описаниями:

Поле SELECTИсходное полеТип данных
idid_orderINT
shopnoShopNoINT
order_typeorder_typeTinyInt
gettypegettypeTinyInt
date_orderdate_orderDateTime
date_supplydate_supplyDateTime
date_supply_untilldate_supply_untillDateTime
date_posteddate_postedDateTime
date_collect_startdate_collect_startDateTime
date_collecteddate_collectedDateTime
date_delivery_startdate_delivery_startDateTime
date_delivereddate_deliveredDateTime
sum_paidsum_paidFLOAT
sum_paid_couponsum_paid_couponFLOAT
count_poscount_posSmallInt
latitudelatitudeDecimal(19,16)
longitudelongitudeDecimal(19,16)
client_typeclient_typeNVarChar(100) COLLATE Cyrillic_General_CI_AS
order_weightorder_weightDecimal(15,3)
delivery_hottimedelivery_hottimeDateTime
collecting_await_durcollecting_await_durINT
collecting_durcollecting_durINT
delivery_await_durdelivery_await_durINT
delivery_durdelivery_durINT
completed_aggcompleted_aggINT
distancedistanceReal
date_supply_vvdate_supply(вычисляемое)
Фильтры запроса

В запросе присутствуют 2 фильтра:

  • date_order BETWEEN '{{payload.from}}' AND '{{payload.to}}' — Фильтр по дате заказа. Включает заказы, где дата заказа >= '{{payload.from}}' и <= '{{payload.to}}'.
  • date_supply IS NOT NULL — Исключает заказы без указанной даты поставки.
Вычисляемые поля

В запросе есть вычисляемое поле:

  • DATEADD(Minute, 15, date_supply) as date_supply_vv — Функция SQL Server для добавления 15 минут к полю date_supply.


Получение данных о геозонах

Для получения данных о геозонах составляется отчет по зонам с фильтрацией по магазинам.

Источником получения данных служит таблицы [GeoReports].[Analytics].[EffectiveZonesOnlineServices] и [Geo].[geo].[tt]

Запрос объединяет данные из двух таблиц для получения информации о зонах, услугах и временных интервалах.

Текст запроса

Ниже представлен запрос для получения информации о заказах:

SELECT 
    tt.N AS id_tt, 
    id_online_service, 
    id_poly, 
    date_add, 
    geo, 
    payway, 
    time_start, 
    time_end 
FROM [GeoReports].[Analytics].[EffectiveZonesOnlineServices] (NOLOCK) z
JOIN [Geo].[geo].[tt] tt ON tt.id_TT = z.id_tt
WHERE tt.name_TT LIKE '%ДС[_]%
Поля запроса

Запрос возвращает 8 полей. Ниже приведена таблица с описаниями:

Поле SELECTИсходное полеТип данных
id_tttt.N

id_online_service

id_online_service


id_poly

id_poly


date_add

date_add


geo

geo


payway

payway


time_start

time_start


time_end

time_end

 
Фильтры запроса

В запросе присутствуют 2 фильтра:

  • INNER JOIN на tt.id_TT = z.id_tt — Это объединяет записи только если есть совпадение по идентификатору точки (id_tt). Если в z нет соответствующей записи в tt, она не попадет в результат.
  • WHERE tt.name_TT like '%ДС[_]%' — Фильтр по имени точки (магазина) в таблице tt.


Таблицы хранения полученных данных

Исходные данные, используемые для построения прогноза, размещены в следующих таблицах:

  • vv_orders_ts — гипертаблица с информацией о заказах. Включает поля, заполняемые на основе исходной таблицы Report.[report_zakaz_tbl], а также ряд дополнительных полей.
  • test_vv_points — географические зоны, связанные с торговыми точками (ТТ).
  • weather — данные о погоде, загруженные из сервиса https://api.met.no.
  • weather_stations — погодные станции с сервиса rp5.ru. Применялись для загрузки исторических метеоданных.
  • calendar — табель-календарь, заполняемый посредством системы репликации.

Кроме того, на базе этих таблиц создаются материализованные представления:

  • vv_orders_ts_hash_hourly — заказы в географической зоне за определенный час, исключая заказы с типом gettype = 6 (доставка через Яндекс).
  • vv_lines_ts_hash_hourly — количество собранных строк для географической зоны за конкретный час.

Ниже приведено описание этих таблиц и представлений, в которым перечислены поля использующиеся для составления прогноза.

vv_orders_ts
Поле Тип данных
idint4
shopnoint4
order_typeint4
gettypeint4
date_ordertimestamp
date_supplytimestamp
date_supply_untilltimestamp
date_postedtimestamp
date_collect_starttimestamp
date_collectedtimestamp
date_delivery_starttimestamp
date_deliveredtimestamp
sum_paidfloat8
sum_paid_couponfloat8
count_posint2
latitudenumeric(19, 16)
longitudenumeric(19, 16)
client_typevarchar(100)
order_weightnumeric(15, 3)
delivery_hottimetimestamp
collecting_await_durint4
collecting_durint4
delivery_await_durint4
delivery_durint4
completed_aggint4
distancefloat4
date_supply_vvtimestamp
detailsjsonb
tt_idint4
geohashvarchar(20)
test_vv_points
Поле Тип данныхОписание
geohashvarchar(20)Геохэш области
tt_idnumericИД иорговой точки
coeffint4

Вероятность того, что заказ в данной области попадет в данную ТТ. Определяется на основе статистики заказов за предыдущие 3 дня

 

weather
Поле Тип данныхОписание
weather_station_idint4ИД погодной станции
datetimestampВремя
temperaturenumeric(3, 1)

Температура

humidityint4

Влажность

wind_speedint4

Скорость ветра

weather_stations
Поле Тип данныхОписание
idserial4ИД погодной станции
activeboolПризнак активности
calendar
Поле Тип данныхОписание
idserial4ИД
datedateДата
typeint4Тип (2 - суббота, 3 - воскресенье, 4 - предпраздничный день, 5 - праздник)
vv_orders_ts_hash_hourly

Для составления представления формируется запрос который формирует представление для хранения агрегированных данных о количестве заказов, сгруппированных по геохешу и часовым интервалам. Исключаются заказы с типом получения gettype = 6. Представление обновляется автоматически.

Источником получения данных служит таблица vv_orders_ts.

Текст запроса:

CREATE MATERIALIZED VIEW vv_orders_ts_hash_hourly 
WITH (timescaledb.continuous) AS 
SELECT 
    geohash, 
    time_bucket('1 hour', ts.date_supply_vv) AS bucket, 
    COUNT(*) AS cnt 
FROM vv_orders_ts ts 
WHERE ts.gettype != 6 
GROUP BY geohash, bucket;

Поля запроса:

ПолеТип данныхОписание
geohashvarchar(20)
buckettimestamp 
cntint8
vv_lines_ts_hash_hourly

Для составления представления формируется запрос который формирует представление для хранения агрегированных данных о суммарном количестве позиций (строк) в заказах, сгруппированных по геохешу и часовым интервалам.

Источником получения данных служит таблица vv_orders_ts.

Текст запроса:

CREATE MATERIALIZED VIEW vv_lines_ts_hash_hourly 
WITH (timescaledb.continuous) AS 
SELECT 
    geohash, 
    time_bucket('1 hour', ts.date_supply_vv) AS bucket, 
    SUM(ts.count_pos) AS cnt 
FROM vv_orders_ts ts 
GROUP BY geohash, bucket;

Поля запроса:

ПолеТип данныхОписание
geohashvarchar(20)
buckettimestamp 
cntint8 


Хранение результатов обработки исходных данных

Данные для прогнозов, сами прогнозы и результаты их анализа хранятся во временных рядах в таблице time_series:

ПолеТип данныхОписание
idbigserial
tstamptimestamptz 
typeint4Описывает тип данных
restaurant_idint4
user_idint4
valuefloat8Значение прогноза
detailsjsonb 

Тип прогноза, для которого сформирован результат обработки, определяется значением поля type. Возможные числовые значения поля и их интерпретация приведены ниже. Сформированный прогноз по часам помещается в таблицу под типами 4-7

typeОписаниеПодразделениеТипИсточник
1Данные по доставкеПоследняя миляИсходные данныеРепликатор
2Данные по сборкеПоследняя миляИсходные данныеРепликатор
4Прогноз доставкаПоследняя миляПрогнозPython
5Прогноз сборкаПоследняя миляПрогнозPython
6Прогноз по геозонам доставкаПоследняя миляПрогнозPython
7Прогноз по геозонам сборкаПоследняя миляПрогнозPython
51Оценка трудоемкости розницаРозницаИсходные данныеNode-RED
52Прогноз суммарной трудоемкости РозницаРозницаПрогнозPython
53Прогноз трудоемкости кассиров РозницаРозницаПрогнозPython
55Факт суммарной выработки РозницаРозницаАналитикаpgAgent
56Факт выработки кассиров РозницаРозницаАналитикаpgAgent
154Курьеры фактПоследняя миляАналитикаNode-RED
155Курьеры планПоследняя миляАналитикаNode-RED
156Курьеры прогнозПоследняя миляАналитикаNode-RED
157Заказы планПоследняя миляАналитикаNode-RED