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 Исходное поле Тип данных
id id_order INT
shopno ShopNo INT
order_type order_type TinyInt
gettype gettype TinyInt
date_order date_order DateTime
date_supply date_supply DateTime
date_supply_untill date_supply_untill DateTime
date_posted date_posted DateTime
date_collect_start date_collect_start DateTime
date_collected date_collected DateTime
date_delivery_start date_delivery_start DateTime
date_delivered date_delivered DateTime
sum_paid sum_paid FLOAT
sum_paid_coupon sum_paid_coupon FLOAT
count_pos count_pos SmallInt
latitude latitude Decimal(19,16)
longitude longitude Decimal(19,16)
client_type client_type NVarChar(100) COLLATE Cyrillic_General_CI_AS
order_weight order_weight Decimal(15,3)
delivery_hottime delivery_hottime DateTime
collecting_await_dur collecting_await_dur INT
collecting_dur collecting_dur INT
delivery_await_dur delivery_await_dur INT
delivery_dur delivery_dur INT
completed_agg completed_agg INT
distance distance Real
date_supply_vv date_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_tt tt.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
Поле  Тип данных
id int4
shopno int4
order_type int4
gettype int4
date_order timestamp
date_supply timestamp
date_supply_untill timestamp
date_posted timestamp
date_collect_start timestamp
date_collected timestamp
date_delivery_start timestamp
date_delivered timestamp
sum_paid float8
sum_paid_coupon float8
count_pos int2
latitude numeric(19, 16)
longitude numeric(19, 16)
client_type varchar(100)
order_weight numeric(15, 3)
delivery_hottime timestamp
collecting_await_dur int4
collecting_dur int4
delivery_await_dur int4
delivery_dur int4
completed_agg int4
distance float4
date_supply_vv timestamp
details jsonb
tt_id int4
geohash varchar(20)
test_vv_points
Поле  Тип данных Описание
geohash varchar(20) Геохэш области
tt_id numeric ИД иорговой точки
coeff int4

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

 

weather
Поле  Тип данных Описание
weather_station_id int4 ИД погодной станции
date timestamp Время
temperature numeric(3, 1)

Температура

humidity int4

Влажность

wind_speed int4

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

weather_stations
Поле  Тип данных Описание
id serial4 ИД погодной станции
active bool Признак активности
calendar
Поле  Тип данных Описание
id serial4 ИД
date date Дата
type int4 Тип (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;

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

Поле Тип данных Описание
geohash varchar(20)
bucket timestamp  
cnt int8
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;

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

Поле Тип данных Описание
geohash varchar(20)
bucket timestamp  
cnt int8  


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

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

Поле Тип данных Описание
id bigserial
tstamp timestamptz  
type int4 Описывает тип данных
restaurant_id int4
user_id int4
value float8 Значение прогноза
details jsonb  

Тип прогноза, для которого сформирован результат обработки, определяется значением поля 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