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

Исходные данные извлекаются из базы данных ВкусВилл (таблицы: Report.\[report\_zakaz\_tbl\], \[GeoReports\].\[Analytics\].\[EffectiveZonesOnlineServices\] и \[Geo\].\[geo\].\[tt\]), а также с внешних источников: API met.no и rp5.ru.  
Собранные данные сохраняются в следующих таблицах:

- vv\_orders\_ts — временные ряды заказов;
- test\_vv\_points — тестовые точки;
- weather — данные о погоде;
- weather\_stations — информация о метеостанциях;
- calendar — календарные данные.

Прогнозная модель CatBoost извлекает данные из указанных таблиц и выполняет их обработку.

Результаты обработки, включая прогнозы модели CatBoost, сохраняются в таблице time\_series. На основе этих результатов производятся дальнейшие расчеты для аналитики.

[![Описание прогноза (2).png](https://bookstack.ally.software/uploads/images/gallery/2025-09/scaled-1680-/opisanie-prognoza-2.png)](https://bookstack.ally.software/uploads/images/gallery/2025-09/opisanie-prognoza-2.png)

---

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

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

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

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

<details id="bkmrk-%D0%A2%D0%B5%D0%BA%D1%81%D1%82-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0-%D0%9D%D0%B8%D0%B6%D0%B5-%D0%BF"><summary>Текст запроса</summary>

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

```
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
```

</details><details id="bkmrk-%D0%9F%D0%BE%D0%BB%D1%8F-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0-%D0%97%D0%B0%D0%BF%D1%80%D0%BE%D1%81-"><summary>Поля запроса</summary>

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

<table border="1" style="border-collapse: collapse; width: 100%; height: 833.11px;"><colgroup><col style="width: 33.3745%;"></col><col style="width: 27.6935%;"></col><col style="width: 39.0555%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td class="align-center" style="height: 29.7969px; background-color: rgb(206, 212, 217);">Поле SELECT</td><td class="align-center" style="height: 29.7969px; background-color: rgb(206, 212, 217);">Исходное поле</td><td class="align-center" style="height: 29.7969px; background-color: rgb(206, 212, 217);">Тип данных</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">id</td><td style="height: 29.7969px;">id\_order</td><td style="height: 29.7969px;">INT</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">shopno</td><td style="height: 29.7969px;">ShopNo</td><td style="height: 29.7969px;">INT</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">order\_type</td><td style="height: 29.7969px;">order\_type</td><td style="height: 29.7969px;">TinyInt</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">gettype</td><td style="height: 29.7969px;">gettype</td><td style="height: 29.7969px;">TinyInt</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">date\_order</td><td style="height: 29.7969px;">date\_order</td><td style="height: 29.7969px;">DateTime</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">date\_supply</td><td style="height: 29.7969px;">date\_supply</td><td style="height: 29.7969px;">DateTime</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">date\_supply\_untill</td><td style="height: 29.7969px;">date\_supply\_untill</td><td style="height: 29.7969px;">DateTime</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">date\_posted</td><td style="height: 29.7969px;">date\_posted</td><td style="height: 29.7969px;">DateTime</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">date\_collect\_start</td><td style="height: 29.7969px;">date\_collect\_start</td><td style="height: 29.7969px;">DateTime</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">date\_collected</td><td style="height: 29.7969px;">date\_collected</td><td style="height: 29.7969px;">DateTime</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">date\_delivery\_start</td><td style="height: 29.7969px;">date\_delivery\_start</td><td style="height: 29.7969px;">DateTime</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">date\_delivered</td><td style="height: 29.7969px;">date\_delivered</td><td style="height: 29.7969px;">DateTime</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">sum\_paid</td><td style="height: 29.7969px;">sum\_paid</td><td style="height: 29.7969px;">FLOAT</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">sum\_paid\_coupon</td><td style="height: 29.7969px;">sum\_paid\_coupon</td><td style="height: 29.7969px;">FLOAT</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">count\_pos</td><td style="height: 29.7969px;">count\_pos</td><td style="height: 29.7969px;">SmallInt</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">latitude</td><td style="height: 29.7969px;">latitude</td><td style="height: 29.7969px;">Decimal(19,16)</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">longitude</td><td style="height: 29.7969px;">longitude</td><td style="height: 29.7969px;">Decimal(19,16)</td></tr><tr style="height: 28.5938px;"><td style="height: 28.5938px;">client\_type</td><td style="height: 28.5938px;">client\_type</td><td style="height: 28.5938px;">NVarChar(100) COLLATE Cyrillic\_General\_CI\_AS</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">order\_weight</td><td style="height: 29.7969px;">order\_weight</td><td style="height: 29.7969px;">Decimal(15,3)</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">delivery\_hottime</td><td style="height: 29.7969px;">delivery\_hottime</td><td style="height: 29.7969px;">DateTime</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">collecting\_await\_dur</td><td style="height: 29.7969px;">collecting\_await\_dur</td><td style="height: 29.7969px;">INT</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">collecting\_dur</td><td style="height: 29.7969px;">collecting\_dur</td><td style="height: 29.7969px;">INT</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">delivery\_await\_dur</td><td style="height: 29.7969px;">delivery\_await\_dur</td><td style="height: 29.7969px;">INT</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">delivery\_dur</td><td style="height: 29.7969px;">delivery\_dur</td><td style="height: 29.7969px;">INT</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">completed\_agg</td><td style="height: 29.7969px;">completed\_agg</td><td style="height: 29.7969px;">INT</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">distance</td><td style="height: 29.7969px;">distance</td><td style="height: 29.7969px;">Real</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">date\_supply\_vv</td><td style="height: 29.7969px;">date\_supply</td><td style="height: 29.7969px;">(вычисляемое)</td></tr></tbody></table>

</details><details id="bkmrk-%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D1%8B-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0-%D0%92-%D0%B7%D0%B0"><summary>Фильтры запроса</summary>

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

- date\_order BETWEEN '{{payload.from}}' AND '{{payload.to}}' — Фильтр по дате заказа. Включает заказы, где дата заказа &gt;= '{{payload.from}}' и &lt;= '{{payload.to}}'.
- date\_supply IS NOT NULL — Исключает заказы без указанной даты поставки.

</details><details id="bkmrk-%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D1%8F%D0%B5%D0%BC%D1%8B%D0%B5-%D0%BF%D0%BE%D0%BB%D1%8F-%D0%92-%D0%B7"><summary>Вычисляемые поля</summary>

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

- DATEADD(Minute, 15, date\_supply) as date\_supply\_vv — Функция SQL Server для добавления 15 минут к полю date\_supply.

</details>---

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

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

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

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

<details id="bkmrk-%D0%A2%D0%B5%D0%BA%D1%81%D1%82-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0-%D0%9D%D0%B8%D0%B6%D0%B5-%D0%BF-1"><summary>Текст запроса</summary>

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

```
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 '%ДС[_]%
```

</details><details id="bkmrk-%D0%9F%D0%BE%D0%BB%D1%8F-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0-%D0%97%D0%B0%D0%BF%D1%80%D0%BE%D1%81--1"><summary>Поля запроса</summary>

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

<table border="1" style="border-collapse: collapse; width: 100%; height: 297.969px;"><colgroup><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td class="align-center" style="height: 29.7969px; background-color: rgb(206, 212, 217);">Поле SELECT</td><td class="align-center" style="height: 29.7969px; background-color: rgb(206, 212, 217);">Исходное поле</td><td class="align-center" style="height: 29.7969px; background-color: rgb(206, 212, 217);">Тип данных</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">id\_tt</td><td style="height: 29.7969px;">tt.N</td><td style="height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">id\_online\_service

</td><td style="height: 29.7969px;">id\_online\_service

</td><td style="height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">id\_poly

</td><td style="height: 29.7969px;">id\_poly

</td><td style="height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">date\_add

</td><td style="height: 29.7969px;">date\_add

</td><td style="height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">geo

</td><td style="height: 29.7969px;">geo

</td><td style="height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">payway

</td><td style="height: 29.7969px;">payway

</td><td style="height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">time\_start

</td><td style="height: 29.7969px;">time\_start

</td><td style="height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">time\_end

</td><td style="height: 29.7969px;">time\_end

</td><td style="height: 29.7969px;"> </td></tr></tbody></table>

</details><details id="bkmrk-%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D1%8B-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0-%D0%92-%D0%B7%D0%B0-1"><summary>Фильтры запроса</summary>

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

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

</details>---

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

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

- vv\_orders\_ts — гипертаблица с информацией о заказах. Включает поля, заполняемые на основе исходной таблицы Report.\[report\_zakaz\_tbl\], а также ряд дополнительных полей.
- test\_vv\_points — географические зоны, связанные с торговыми точками (ТТ).
- weather — данные о погоде, загруженные из сервиса [https://api.met.no](https://api.met.no).
- weather\_stations — погодные станции с сервиса rp5.ru. Применялись для загрузки исторических метеоданных.
- calendar — табель-календарь, заполняемый посредством системы репликации.

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

- vv\_orders\_ts\_hash\_hourly — заказы в географической зоне за определенный час, исключая заказы с типом gettype = 6 (доставка через Яндекс).
- vv\_lines\_ts\_hash\_hourly — количество собранных строк для географической зоны за конкретный час.

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

<details id="bkmrk-vv_orders_ts-%D0%9F%D0%BE%D0%BB%D0%B5%C2%A0-%D0%A2"><summary>vv\_orders\_ts</summary>

<table border="1" style="border-collapse: collapse; width: 100%; height: 923.704px;"><colgroup><col style="width: 50.0618%;"></col><col style="width: 50.0618%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td class="align-center" style="background-color: rgb(206, 212, 217); height: 29.7969px;">Поле </td><td class="align-center" style="background-color: rgb(206, 212, 217); height: 29.7969px;">Тип данных</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">id</td><td style="height: 29.7969px;">int4</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">shopno</td><td style="height: 29.7969px;">int4</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">order\_type</td><td style="height: 29.7969px;">int4</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">gettype</td><td style="height: 29.7969px;">int4</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">date\_order</td><td style="height: 29.7969px;">timestamp</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">date\_supply</td><td style="height: 29.7969px;">timestamp</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">date\_supply\_untill</td><td style="height: 29.7969px;">timestamp</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">date\_posted</td><td style="height: 29.7969px;">timestamp</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">date\_collect\_start</td><td style="height: 29.7969px;">timestamp</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">date\_collected</td><td style="height: 29.7969px;">timestamp</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">date\_delivery\_start</td><td style="height: 29.7969px;">timestamp</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">date\_delivered</td><td style="height: 29.7969px;">timestamp</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">sum\_paid</td><td style="height: 29.7969px;">float8</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">sum\_paid\_coupon</td><td style="height: 29.7969px;">float8</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">count\_pos</td><td style="height: 29.7969px;">int2</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">latitude</td><td style="height: 29.7969px;">numeric(19, 16)</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">longitude</td><td style="height: 29.7969px;">numeric(19, 16)</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">client\_type</td><td style="height: 29.7969px;">varchar(100)</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">order\_weight</td><td style="height: 29.7969px;">numeric(15, 3)</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">delivery\_hottime</td><td style="height: 29.7969px;">timestamp</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">collecting\_await\_dur</td><td style="height: 29.7969px;">int4</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">collecting\_dur</td><td style="height: 29.7969px;">int4</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">delivery\_await\_dur</td><td style="height: 29.7969px;">int4</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">delivery\_dur</td><td style="height: 29.7969px;">int4</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">completed\_agg</td><td style="height: 29.7969px;">int4</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">distance</td><td style="height: 29.7969px;">float4</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">date\_supply\_vv</td><td style="height: 29.7969px;">timestamp</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">details</td><td style="height: 29.7969px;">jsonb</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">tt\_id</td><td style="height: 29.7969px;">int4</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">geohash</td><td style="height: 29.7969px;">varchar(20)</td></tr></tbody></table>

</details><details id="bkmrk-test_vv_points-%D0%9F%D0%BE%D0%BB%D0%B5%C2%A0"><summary>test\_vv\_points</summary>

<table border="1" style="border-collapse: collapse; width: 100%; height: 115.188px;"><colgroup><col style="width: 24.0051%;"></col><col style="width: 25.303%;"></col><col style="width: 50.6919%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td class="align-center" style="background-color: rgb(206, 212, 217); height: 29.7969px;">Поле </td><td class="align-center" style="background-color: rgb(206, 212, 217); height: 29.7969px;">Тип данных</td><td class="align-center" style="background-color: rgb(206, 212, 217);">Описание</td></tr><tr style="height: 25.7969px;"><td style="height: 25.7969px;">geohash</td><td style="height: 25.7969px;">varchar(20)</td><td>Геохэш области</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">tt\_id</td><td style="height: 29.7969px;">numeric</td><td>ИД иорговой точки</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">coeff</td><td style="height: 29.7969px;">int4</td><td>Вероятность того, что заказ в данной области попадет в данную ТТ. Определяется на основе статистики заказов за предыдущие 3 дня

</td></tr></tbody></table>

</details><details id="bkmrk-weather-%D0%9F%D0%BE%D0%BB%D0%B5%C2%A0-%D0%A2%D0%B8%D0%BF-%D0%B4%D0%B0"><summary>weather</summary>

<table border="1" style="border-collapse: collapse; width: 100%; height: 115.188px;"><colgroup><col style="width: 24.0051%;"></col><col style="width: 25.303%;"></col><col style="width: 50.6919%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td class="align-center" style="background-color: rgb(206, 212, 217); height: 29.7969px;">Поле </td><td class="align-center" style="background-color: rgb(206, 212, 217); height: 29.7969px;">Тип данных</td><td class="align-center" style="background-color: rgb(206, 212, 217);">Описание</td></tr><tr style="height: 25.7969px;"><td style="height: 25.7969px;">weather\_station\_id</td><td style="height: 25.7969px;">int4</td><td>ИД погодной станции</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">date</td><td style="height: 29.7969px;">timestamp</td><td>Время</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">temperature</td><td style="height: 29.7969px;">numeric(3, 1)</td><td>Температура

</td></tr><tr><td>humidity</td><td>int4</td><td>Влажность

</td></tr><tr><td>wind\_speed</td><td>int4</td><td>Скорость ветра

</td></tr></tbody></table>

</details><details id="bkmrk-weather_stations-%D0%9F%D0%BE%D0%BB"><summary>weather\_stations</summary>

<table border="1" style="border-collapse: collapse; width: 100%; height: 115.188px;"><colgroup><col style="width: 24.0051%;"></col><col style="width: 25.303%;"></col><col style="width: 50.6919%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td class="align-center" style="background-color: rgb(206, 212, 217); height: 29.7969px;">Поле </td><td class="align-center" style="background-color: rgb(206, 212, 217); height: 29.7969px;">Тип данных</td><td class="align-center" style="background-color: rgb(206, 212, 217);">Описание</td></tr><tr style="height: 25.7969px;"><td style="height: 25.7969px;">id</td><td style="height: 25.7969px;">serial4</td><td>ИД погодной станции</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">active</td><td style="height: 29.7969px;">bool</td><td>Признак активности</td></tr></tbody></table>

</details><details id="bkmrk-calendar-%D0%9F%D0%BE%D0%BB%D0%B5%C2%A0-%D0%A2%D0%B8%D0%BF-%D0%B4"><summary>calendar</summary>

<table border="1" style="border-collapse: collapse; width: 100%; height: 119.188px;"><colgroup><col style="width: 24.0051%;"></col><col style="width: 25.303%;"></col><col style="width: 50.6919%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td class="align-center" style="background-color: rgb(206, 212, 217); height: 29.7969px;">Поле </td><td class="align-center" style="background-color: rgb(206, 212, 217); height: 29.7969px;">Тип данных</td><td class="align-center" style="background-color: rgb(206, 212, 217); height: 29.7969px;">Описание</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">id</td><td style="height: 29.7969px;">serial4</td><td style="height: 29.7969px;">ИД</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">date</td><td style="height: 29.7969px;">date</td><td style="height: 29.7969px;">Дата</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">type</td><td style="height: 29.7969px;">int4</td><td style="height: 29.7969px;">Тип (2 - суббота, 3 - воскресенье, 4 - предпраздничный день, 5 - праздник)</td></tr></tbody></table>

</details><details id="bkmrk-vv_orders_ts_hash_ho-1"><summary>vv\_orders\_ts\_hash\_hourly</summary>

Для составления представления формируется запрос который формирует представление для хранения агрегированных данных о количестве заказов, сгруппированных по геохешу и часовым интервалам. Исключаются заказы с типом получения 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;
```

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

<table border="1" style="border-collapse: collapse; width: 100%; height: 119.188px;"><colgroup><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td class="align-center" style="background-color: rgb(206, 212, 217); height: 29.7969px;">Поле</td><td class="align-center" style="background-color: rgb(206, 212, 217); height: 29.7969px;">Тип данных</td><td class="align-center" style="background-color: rgb(206, 212, 217); height: 29.7969px;">Описание</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">geohash</td><td style="height: 29.7969px;">varchar(20)</td><td style="height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">bucket</td><td style="height: 29.7969px;">timestamp</td><td style="height: 29.7969px;"> </td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">cnt</td><td style="height: 29.7969px;">int8</td><td style="height: 29.7969px;">  
</td></tr></tbody></table>

</details><details id="bkmrk-vv_lines_ts_hash_hou"><summary>vv\_lines\_ts\_hash\_hourly</summary>

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

Источником получения данных служит таблица 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;
```

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

<table border="1" style="border-collapse: collapse; width: 100%; height: 119.188px;"><colgroup><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td class="align-center" style="background-color: rgb(206, 212, 217); height: 29.7969px;">Поле</td><td class="align-center" style="background-color: rgb(206, 212, 217); height: 29.7969px;">Тип данных</td><td class="align-center" style="background-color: rgb(206, 212, 217); height: 29.7969px;">Описание</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">geohash</td><td style="height: 29.7969px;">varchar(20)</td><td style="height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">bucket</td><td style="height: 29.7969px;">timestamp</td><td style="height: 29.7969px;"> </td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">cnt</td><td style="height: 29.7969px;">int8</td><td style="height: 29.7969px;"> </td></tr></tbody></table>

</details>---

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

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

<table border="1" id="bkmrk-%D0%9F%D0%BE%D0%BB%D0%B5-%D0%A2%D0%B8%D0%BF-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%9E%D0%BF%D0%B8%D1%81" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col></colgroup><tbody><tr><td class="align-center" style="background-color: rgb(206, 212, 217);">Поле</td><td class="align-center" style="background-color: rgb(206, 212, 217);">Тип данных</td><td class="align-center" style="background-color: rgb(206, 212, 217);">Описание</td></tr><tr><td>id</td><td>bigserial</td><td>  
</td></tr><tr><td>tstamp</td><td>timestamptz</td><td> </td></tr><tr><td>type</td><td>int4</td><td>Описывает тип данных</td></tr><tr><td>restaurant\_id</td><td>int4</td><td>  
</td></tr><tr><td>user\_id</td><td>int4</td><td>  
</td></tr><tr><td>value</td><td>float8</td><td>Значение прогноза</td></tr><tr><td>details</td><td>jsonb</td><td> </td></tr></tbody></table>

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

<table border="1" id="bkmrk-id-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-%D0%9F%D0%BE%D0%B4%D1%80%D0%B0%D0%B7%D0%B4%D0%B5" style="border-collapse: collapse; width: 100%; height: 515.532px;"><colgroup><col style="width: 5.93523%;"></col><col style="width: 34.1142%;"></col><col style="width: 20.0247%;"></col><col style="width: 20.0247%;"></col><col style="width: 20.0247%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td class="align-center" style="height: 29.7969px; background-color: rgb(206, 212, 217);"><span style="color: rgb(0, 0, 0);">type</span></td><td class="align-center" style="height: 29.7969px; background-color: rgb(206, 212, 217);"><span style="color: rgb(0, 0, 0);">Описание</span></td><td class="align-center" style="height: 29.7969px; background-color: rgb(206, 212, 217);"><span style="color: rgb(0, 0, 0);">Подразделение</span></td><td class="align-center" style="height: 29.7969px; background-color: rgb(206, 212, 217);"><span style="color: rgb(0, 0, 0);">Тип</span></td><td class="align-center" style="height: 29.7969px; background-color: rgb(206, 212, 217);"><span style="color: rgb(0, 0, 0);">Источник</span></td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">1</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Данные по доставке</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Последняя миля</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Исходные данные</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Репликатор</span></td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">2</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Данные по сборке</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Последняя миля</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Исходные данные</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Репликатор</span></td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">4</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Прогноз доставка</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Последняя миля</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Прогноз</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Python</span></td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">5</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Прогноз сборка</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Последняя миля</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Прогноз</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Python</span></td></tr><tr style="height: 30.5938px;"><td style="height: 30.5938px;"><span style="color: rgb(0, 0, 0);">6</span></td><td style="height: 30.5938px;"><span style="color: rgb(0, 0, 0);">Прогноз по геозонам доставка</span></td><td style="height: 30.5938px;"><span style="color: rgb(0, 0, 0);">Последняя миля</span></td><td style="height: 30.5938px;"><span style="color: rgb(0, 0, 0);">Прогноз</span></td><td style="height: 30.5938px;"><span style="color: rgb(0, 0, 0);">Python</span></td></tr><tr style="height: 31.5938px;"><td style="height: 31.5938px;"><span style="color: rgb(0, 0, 0);">7</span></td><td style="height: 31.5938px;"><span style="color: rgb(0, 0, 0);">Прогноз по геозонам сборка</span></td><td style="height: 31.5938px;"><span style="color: rgb(0, 0, 0);">Последняя миля</span></td><td style="height: 31.5938px;"><span style="color: rgb(0, 0, 0);">Прогноз</span></td><td style="height: 31.5938px;"><span style="color: rgb(0, 0, 0);">Python</span></td></tr><tr style="height: 31.5938px;"><td style="height: 31.5938px;"><span style="color: rgb(0, 0, 0);">51</span></td><td style="height: 31.5938px;"><span style="color: rgb(0, 0, 0);">Оценка трудоемкости розница</span></td><td style="height: 31.5938px;"><span style="color: rgb(0, 0, 0);">Розница</span></td><td style="height: 31.5938px;"><span style="color: rgb(0, 0, 0);">Исходные данные</span></td><td style="height: 31.5938px;"><span style="color: rgb(0, 0, 0);">Node-RED</span></td></tr><tr style="height: 46.5938px;"><td style="height: 46.5938px;"><span style="color: rgb(0, 0, 0);">52</span></td><td style="height: 46.5938px;"><span style="color: rgb(0, 0, 0);">Прогноз суммарной трудоемкости Розница</span></td><td style="height: 46.5938px;"><span style="color: rgb(0, 0, 0);">Розница</span></td><td style="height: 46.5938px;"><span style="color: rgb(0, 0, 0);">Прогноз</span></td><td style="height: 46.5938px;"><span style="color: rgb(0, 0, 0);">Python</span></td></tr><tr style="height: 46.5938px;"><td style="height: 46.5938px;"><span style="color: rgb(0, 0, 0);">53</span></td><td style="height: 46.5938px;"><span style="color: rgb(0, 0, 0);">Прогноз трудоемкости кассиров Розница</span></td><td style="height: 46.5938px;"><span style="color: rgb(0, 0, 0);">Розница</span></td><td style="height: 46.5938px;"><span style="color: rgb(0, 0, 0);">Прогноз</span></td><td style="height: 46.5938px;"><span style="color: rgb(0, 0, 0);">Python</span></td></tr><tr style="height: 30.5938px;"><td style="height: 30.5938px;"><span style="color: rgb(0, 0, 0);">55</span></td><td style="height: 30.5938px;"><span style="color: rgb(0, 0, 0);">Факт суммарной выработки Розница</span></td><td style="height: 30.5938px;"><span style="color: rgb(0, 0, 0);">Розница</span></td><td style="height: 30.5938px;"><span style="color: rgb(0, 0, 0);">Аналитика</span></td><td style="height: 30.5938px;"><span style="color: rgb(0, 0, 0);">pgAgent</span></td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">56</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Факт выработки кассиров Розница</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Розница</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Аналитика</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">pgAgent</span></td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">154</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Курьеры факт</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Последняя миля</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Аналитика</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Node-RED</span></td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">155</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Курьеры план</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Последняя миля</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Аналитика</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Node-RED</span></td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">156</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Курьеры прогноз</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Последняя миля</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Аналитика</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Node-RED</span></td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">157</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Заказы план</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Последняя миля</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Аналитика</span></td><td style="height: 29.7969px;"><span style="color: rgb(0, 0, 0);">Node-RED</span></td></tr></tbody></table>