Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5b78a24439 | |||
| 60abc04ea5 | |||
| b3ec72ca34 | |||
| 9d331db8a3 | |||
| 5d82f7b7f3 | |||
| 4acad9a25c | |||
| aab2b42d9c | |||
| ccf82b026f | |||
| 26390f6239 | |||
| 504a5280e8 | |||
| f78b59aeb1 | |||
| eb14634177 | |||
| 02f2d6a177 | |||
| b1b3f4682a | |||
| 028ebe605f | |||
| 40b66d2b93 | |||
| 2a5aa60bcc |
6
.gitignore
vendored
6
.gitignore
vendored
@ -2,3 +2,9 @@
|
|||||||
config.js
|
config.js
|
||||||
*.env
|
*.env
|
||||||
.env*
|
.env*
|
||||||
|
|
||||||
|
# updater (скрипт обновления CSV из Impala)
|
||||||
|
updater/config.yaml
|
||||||
|
updater/venv/
|
||||||
|
updater/__pycache__/
|
||||||
|
updater/update.log
|
||||||
|
|||||||
181
Impala_connection.md
Normal file
181
Impala_connection.md
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
# Подключение к Impala из Python
|
||||||
|
|
||||||
|
Инструкция описывает, как подключиться к корпоративному кластеру Impala через Python-библиотеку `impyla`. Используется в проекте `metrics_audit`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Параметры кластера
|
||||||
|
|
||||||
|
| Параметр | Значение |
|
||||||
|
|---|---|
|
||||||
|
| Основной хост | `bdas-worker-08.bdpak.telecom.kz` |
|
||||||
|
| Резервный хост | `bdas-utility-01.bdpak.telecom.kz` |
|
||||||
|
| Порт | `21050` |
|
||||||
|
| База данных | `drb` |
|
||||||
|
| Аутентификация | PLAIN (логин + пароль) |
|
||||||
|
| SSL | включён (`use_ssl=True`) |
|
||||||
|
| Доступ | только из внутренней сети или через VPN |
|
||||||
|
|
||||||
|
> **Username и password** хранятся в `config.yaml` и не коммитятся в git.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Зависимости
|
||||||
|
|
||||||
|
`impyla` работает через протокол Thrift напрямую — Java-драйверы (JDBC `.zip`) **не нужны**, они только для DBeaver/Tableau.
|
||||||
|
|
||||||
|
```
|
||||||
|
# requirements.txt
|
||||||
|
impyla==0.19.0
|
||||||
|
thrift==0.16.0
|
||||||
|
thrift-sasl==0.4.3
|
||||||
|
pure-sasl>=0.6.2 # вместо sasl — не требует C++ компилятора на Windows
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Важно:** пакет `sasl==0.3.1` на Windows не устанавливается без Microsoft C++ Build Tools.
|
||||||
|
> Используйте `pure-sasl` — он устанавливается автоматически как зависимость `thrift-sasl`.
|
||||||
|
|
||||||
|
Установка:
|
||||||
|
```bat
|
||||||
|
python -m venv venv
|
||||||
|
venv\Scripts\activate
|
||||||
|
pip install impyla==0.19.0 thrift==0.16.0 thrift-sasl==0.4.3 pandas
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Проблема с SSL и её решение
|
||||||
|
|
||||||
|
При подключении с `use_ssl=True` возникает ошибка:
|
||||||
|
|
||||||
|
```
|
||||||
|
ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure
|
||||||
|
```
|
||||||
|
|
||||||
|
**Причина:** сервер Impala использует устаревшие cipher suites, которые Python 3.10+ отклоняет по умолчанию (security level 2).
|
||||||
|
|
||||||
|
**Решение:** monkey-patch SSL-контекста библиотеки `thrift` перед подключением:
|
||||||
|
|
||||||
|
```python
|
||||||
|
import ssl
|
||||||
|
import thrift.transport.TSSLSocket as _mod
|
||||||
|
|
||||||
|
def _patch_thrift_ssl():
|
||||||
|
_orig = _mod.TSSLSocket.__init__
|
||||||
|
|
||||||
|
def _patched(self, *a, **kw):
|
||||||
|
_orig(self, *a, **kw)
|
||||||
|
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
|
||||||
|
ctx.check_hostname = False
|
||||||
|
ctx.verify_mode = ssl.CERT_NONE
|
||||||
|
ctx.set_ciphers("DEFAULT:@SECLEVEL=0")
|
||||||
|
self._context = ctx
|
||||||
|
|
||||||
|
_mod.TSSLSocket.__init__ = _patched
|
||||||
|
|
||||||
|
# Вызвать ДО impyla_connect:
|
||||||
|
_patch_thrift_ssl()
|
||||||
|
```
|
||||||
|
|
||||||
|
Это нужно вызвать один раз перед первым подключением. Патч снижает проверку сертификата и разрешает старые шифры — приемлемо для внутренней сети за VPN.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Подключение
|
||||||
|
|
||||||
|
```python
|
||||||
|
from impala.dbapi import connect
|
||||||
|
|
||||||
|
conn = connect(
|
||||||
|
host="bdas-worker-08.bdpak.telecom.kz",
|
||||||
|
port=21050,
|
||||||
|
database="drb",
|
||||||
|
user="<username>", # из config.yaml
|
||||||
|
password="<password>", # из config.yaml
|
||||||
|
use_ssl=True,
|
||||||
|
auth_mechanism="PLAIN", # AuthMech=3 в JDBC-терминологии
|
||||||
|
timeout=60,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
С резервным хостом — оберните в try/except и переключитесь на `bdas-utility-01.bdpak.telecom.kz` при ошибке.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Выполнение запроса
|
||||||
|
|
||||||
|
```python
|
||||||
|
cursor = conn.cursor()
|
||||||
|
cursor.execute("SELECT event_type, entry_date, count(*) AS cnt FROM drb.drb_iliyas_amplitude_metrics_full GROUP BY 1, 2")
|
||||||
|
|
||||||
|
import pandas as pd
|
||||||
|
rows = cursor.fetchall()
|
||||||
|
columns = [desc[0] for desc in cursor.description]
|
||||||
|
df = pd.DataFrame(rows, columns=columns)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Схема таблицы метрик
|
||||||
|
|
||||||
|
**`drb.drb_iliyas_amplitude_metrics_full`**
|
||||||
|
|
||||||
|
| Колонка | Тип | Описание |
|
||||||
|
|---|---|---|
|
||||||
|
| `metrics` | string | Платформа: `TelecomKz` или `Aitu` |
|
||||||
|
| `event_type` | string | Название метрики (событие Amplitude) |
|
||||||
|
| `entry_date` | string | Дата события (`YYYY-MM-DD`) |
|
||||||
|
| `event_time` | string | Полная метка времени |
|
||||||
|
| `event_properties` | string | JSON с параметрами события |
|
||||||
|
| `platform` | string | `android` / `iOS` / `Web` |
|
||||||
|
| ... | | прочие поля пользователя и устройства |
|
||||||
|
|
||||||
|
> **Внимание:** колонка `metrics` содержит **платформу** (`TelecomKz`/`Aitu`), а не название метрики.
|
||||||
|
> Название метрики — в колонке `event_type`.
|
||||||
|
|
||||||
|
**`external_sources.amplitude_loyalty_program_logs`**
|
||||||
|
|
||||||
|
| Колонка | Тип | Описание |
|
||||||
|
|---|---|---|
|
||||||
|
| `event_type` | string | Название метрики |
|
||||||
|
| `event_time` | string | Полная метка времени (дата берётся через `left(event_time, 10)`) |
|
||||||
|
| ... | | прочие поля |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Агрегирующий запрос проекта
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- TelecomKz (все метрики) + Aitu (только whitelist)
|
||||||
|
SELECT metrics AS platform, event_type AS metrics, entry_date, count(*) AS cnt
|
||||||
|
FROM drb.drb_iliyas_amplitude_metrics_full
|
||||||
|
WHERE event_type IS NOT NULL AND event_type != ''
|
||||||
|
AND (
|
||||||
|
metrics = 'TelecomKz'
|
||||||
|
OR (metrics = 'Aitu' AND event_type IN ('miniapp_opened', 'main_tab_selected', ...))
|
||||||
|
)
|
||||||
|
GROUP BY 1, 2, 3
|
||||||
|
|
||||||
|
UNION ALL
|
||||||
|
|
||||||
|
-- Loyalty (без временных акционных метрик)
|
||||||
|
SELECT 'Loyalty' AS platform, event_type AS metrics,
|
||||||
|
left(event_time, 10) AS entry_date, count(*) AS cnt
|
||||||
|
FROM external_sources.amplitude_loyalty_program_logs
|
||||||
|
WHERE event_type IS NOT NULL AND event_type != ''
|
||||||
|
AND event_type NOT LIKE 'detail_promo_%'
|
||||||
|
AND event_type NOT LIKE 'company_promo_%'
|
||||||
|
GROUP BY 1, 2, 3
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Типичные ошибки
|
||||||
|
|
||||||
|
| Ошибка | Причина | Решение |
|
||||||
|
|---|---|---|
|
||||||
|
| `SSLV3_ALERT_HANDSHAKE_FAILURE` | Старые cipher suites на сервере | Применить `_patch_thrift_ssl()` (см. выше) |
|
||||||
|
| `ConnectionRefusedError` / `TSocket read 0 bytes` | VPN не подключён | Подключить VPN и повторить |
|
||||||
|
| `AuthenticationError` | Неверный логин/пароль | Проверить `config.yaml` |
|
||||||
|
| `sasl` не устанавливается | Нет C++ Build Tools | Использовать `pure-sasl` (устанавливается автоматически) |
|
||||||
|
| `ssl.PROTOCOL_TLS is deprecated` | Предупреждение thrift 0.16 | Некритично, патч перезаписывает контекст после |
|
||||||
File diff suppressed because one or more lines are too long
4611
app_stats/app_metrics.json
Normal file
4611
app_stats/app_metrics.json
Normal file
File diff suppressed because it is too large
Load Diff
5227
app_stats/index.html
Normal file
5227
app_stats/index.html
Normal file
File diff suppressed because it is too large
Load Diff
BIN
app_stats/Результаты по метрикам 202606.xlsx
Normal file
BIN
app_stats/Результаты по метрикам 202606.xlsx
Normal file
Binary file not shown.
@ -1,150 +1,168 @@
|
|||||||
"report_period_id";"entry_date";"abons";"registered_total";"registered_pct";"mau_daily";"mau_per_registered";"traditional_comms_pct";"prev_year_traditional_comms_pct";"traditional_comms_decrease_pct";"cumulative_digital_rap_total";"cumulative_rap_total";"fd_rap_pct";"fd_orders";"fd_orders_goal";"fd_orders_pct";"cum_fd_orders";"cum_fd_orders_goal";"cum_fd_orders_pct"
|
"report_period_id";"entry_date";"abons";"registered_total";"registered_pct";"mau_daily";"mau_per_registered";"traditional_comms_pct";"prev_yesr_traditional_comms_pct";"traditional_comms_decrease_pct";"cumulative_digital_rap_total";"cumulative_rap_total";"fd_rap_pct";"fd_orders";"fd_orders_goal";"fd_orders_pct";"cum_fd_orders";"cum_fd_orders_goal";"cum_fd_orders_pct"
|
||||||
202605;"2026-05-29";2100718;1067535;0.508;236392;0.221;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202606;"2026-06-16";2097075;1077498;0.514;;;0.5320566040059457;0.6672788405240422;0.20264727173410857;2506757114.471736;5195580964.135895;0.482478693292512;87;1000;0.087;1444;6000;0.24066666666666667
|
||||||
202605;"2026-05-28";2100718;1067532;0.508;236392;0.221;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202606;"2026-06-15";2097075;1077495;0.514;172690;0.16;0.5320566040059457;0.6672788405240422;0.20264727173410857;2506757114.471736;5195580964.135895;0.482478693292512;87;1000;0.087;1444;6000;0.24066666666666667
|
||||||
202605;"2026-05-27";2100718;1066924;0.508;231473;0.217;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202606;"2026-06-14";2097075;1076729;0.513;172683;0.16;0.5320566040059457;0.6672788405240422;0.20264727173410857;2506757114.471736;5195580964.135895;0.482478693292512;87;1000;0.087;1444;6000;0.24066666666666667
|
||||||
202605;"2026-05-26";2100718;1066631;0.508;227794;0.214;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202606;"2026-06-13";2097075;1076504;0.513;168978;0.157;0.5320566040059457;0.6672788405240422;0.20264727173410857;2506757114.471736;5195580964.135895;0.482478693292512;87;1000;0.087;1444;6000;0.24066666666666667
|
||||||
202605;"2026-05-25";2100718;1066084;0.507;222648;0.209;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202606;"2026-06-12";2097075;1076155;0.513;164595;0.153;0.5320566040059457;0.6672788405240422;0.20264727173410857;2506757114.471736;5195580964.135895;0.482478693292512;87;1000;0.087;1444;6000;0.24066666666666667
|
||||||
202605;"2026-05-24";2100718;1065569;0.507;217146;0.204;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202606;"2026-06-11";2097075;1075512;0.513;158101;0.147;0.5320566040059457;0.6672788405240422;0.20264727173410857;2506757114.471736;5195580964.135895;0.482478693292512;87;1000;0.087;1444;6000;0.24066666666666667
|
||||||
202605;"2026-05-23";2100718;1065297;0.507;210438;0.198;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202606;"2026-06-10";2097075;1074824;0.513;148960;0.139;0.5320566040059457;0.6672788405240422;0.20264727173410857;2506757114.471736;5195580964.135895;0.482478693292512;87;1000;0.087;1444;6000;0.24066666666666667
|
||||||
202605;"2026-05-22";2100718;1064996;0.507;206702;0.194;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202606;"2026-06-09";2097075;1074070;0.512;124103;0.116;0.5320566040059457;0.6672788405240422;0.20264727173410857;2506757114.471736;5195580964.135895;0.482478693292512;87;1000;0.087;1444;6000;0.24066666666666667
|
||||||
202605;"2026-05-21";2100718;1064508;0.507;201861;0.19;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202606;"2026-06-08";2097075;1073316;0.512;115065;0.107;0.5320566040059457;0.6672788405240422;0.20264727173410857;2506757114.471736;5195580964.135895;0.482478693292512;87;1000;0.087;1444;6000;0.24066666666666667
|
||||||
202605;"2026-05-20";2100718;1064000;0.506;196136;0.184;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202606;"2026-06-07";2097075;1072642;0.511;106789;0.1;0.5320566040059457;0.6672788405240422;0.20264727173410857;2506757114.471736;5195580964.135895;0.482478693292512;87;1000;0.087;1444;6000;0.24066666666666667
|
||||||
202605;"2026-05-19";2100718;1063493;0.506;190391;0.179;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202606;"2026-06-06";2097075;1072337;0.511;97052;0.091;0.5320566040059457;0.6672788405240422;0.20264727173410857;2506757114.471736;5195580964.135895;0.482478693292512;87;1000;0.087;1444;6000;0.24066666666666667
|
||||||
202605;"2026-05-18";2100718;1063028;0.506;185169;0.174;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202606;"2026-06-05";2097075;1072020;0.511;89877;0.084;0.5320566040059457;0.6672788405240422;0.20264727173410857;2506757114.471736;5195580964.135895;0.482478693292512;87;1000;0.087;1444;6000;0.24066666666666667
|
||||||
202605;"2026-05-17";2100718;1062578;0.506;179417;0.169;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202606;"2026-06-04";2097075;1071483;0.511;79230;0.074;0.5320566040059457;0.6672788405240422;0.20264727173410857;2506757114.471736;5195580964.135895;0.482478693292512;87;1000;0.087;1444;6000;0.24066666666666667
|
||||||
202605;"2026-05-16";2100718;1062398;0.506;175852;0.166;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202606;"2026-06-03";2097075;1070863;0.511;67920;0.063;0.5320566040059457;0.6672788405240422;0.20264727173410857;2506757114.471736;5195580964.135895;0.482478693292512;87;1000;0.087;1444;6000;0.24066666666666667
|
||||||
202605;"2026-05-15";2100718;1062131;0.506;171740;0.162;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202606;"2026-06-02";2097075;1070276;0.51;54169;0.051;0.5320566040059457;0.6672788405240422;0.20264727173410857;2506757114.471736;5195580964.135895;0.482478693292512;87;1000;0.087;1444;6000;0.24066666666666667
|
||||||
202605;"2026-05-14";2100718;1061692;0.505;165454;0.156;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202606;"2026-06-01";2097075;1069598;0.51;31301;0.029;0.5320566040059457;0.6672788405240422;0.20264727173410857;2506757114.471736;5195580964.135895;0.482478693292512;87;1000;0.087;1444;6000;0.24066666666666667
|
||||||
202605;"2026-05-13";2100718;1061183;0.505;158742;0.15;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-31";2101425;1068795;0.509;252058;0.236;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202605;"2026-05-12";2100718;1060626;0.505;150930;0.142;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-30";2101425;1068493;0.508;248340;0.232;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202605;"2026-05-11";2100718;1060034;0.505;140882;0.133;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-29";2101425;1068104;0.508;244316;0.229;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202605;"2026-05-10";2100718;1059741;0.504;133994;0.126;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-28";2101425;1067532;0.508;239087;0.224;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202605;"2026-05-09";2100718;1059532;0.504;108417;0.102;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-27";2101425;1066924;0.508;233964;0.219;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202605;"2026-05-08";2100718;1059344;0.504;103158;0.097;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-26";2101425;1066631;0.508;230150;0.216;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202605;"2026-05-07";2100718;1058907;0.504;93860;0.089;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-25";2101425;1066084;0.507;224880;0.211;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202605;"2026-05-06";2100718;1058693;0.504;87307;0.082;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-24";2101425;1065569;0.507;219277;0.206;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202605;"2026-05-05";2100718;1058239;0.504;77687;0.073;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-23";2101425;1065297;0.507;212446;0.199;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202605;"2026-05-04";2100718;1057748;0.504;61144;0.058;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-22";2101425;1064996;0.507;208656;0.196;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202605;"2026-05-03";2100718;1057207;0.503;47949;0.045;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-21";2101425;1064508;0.507;203737;0.191;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202605;"2026-05-02";2100718;1057009;0.503;38528;0.036;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-20";2101425;1064000;0.506;197947;0.186;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202605;"2026-05-01";2100718;1056756;0.503;25816;0.024;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-19";2101425;1063493;0.506;192140;0.181;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202604;"2026-04-30";2106236;1056399;0.502;262629;0.249;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202605;"2026-05-18";2101425;1063028;0.506;186876;0.176;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202604;"2026-04-29";2106236;1055833;0.501;257844;0.244;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202605;"2026-05-17";2101425;1062578;0.506;181083;0.17;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202604;"2026-04-28";2106236;1055340;0.501;253602;0.24;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202605;"2026-05-16";2101425;1062398;0.506;177483;0.167;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202604;"2026-04-27";2106236;1054774;0.501;248967;0.236;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202605;"2026-05-15";2101425;1062131;0.505;173343;0.163;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202604;"2026-04-26";2106236;1054128;0.5;243467;0.231;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202605;"2026-05-14";2101425;1061692;0.505;167017;0.157;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202604;"2026-04-25";2106236;1053911;0.5;240371;0.228;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202605;"2026-05-13";2101425;1061183;0.505;160272;0.151;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202604;"2026-04-24";2106236;1053569;0.5;236545;0.225;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202605;"2026-05-12";2101425;1060626;0.505;152414;0.144;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202604;"2026-04-23";2106236;1053042;0.5;229391;0.218;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202605;"2026-05-11";2101425;1060034;0.504;142296;0.134;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202604;"2026-04-22";2106236;1052586;0.5;223915;0.213;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202605;"2026-05-10";2101425;1059741;0.504;135368;0.128;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202604;"2026-04-21";2106236;1052162;0.5;218407;0.208;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202605;"2026-05-09";2101425;1059532;0.504;109629;0.103;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202604;"2026-04-20";2106236;1051719;0.499;213139;0.203;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202605;"2026-05-08";2101425;1059344;0.504;104328;0.098;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202604;"2026-04-19";2106236;1051232;0.499;207205;0.197;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202605;"2026-05-07";2101425;1058907;0.504;94985;0.09;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202604;"2026-04-18";2106236;1051035;0.499;203784;0.194;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202605;"2026-05-06";2101425;1058693;0.504;88375;0.083;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202604;"2026-04-17";2106236;1050776;0.499;199826;0.19;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202605;"2026-05-05";2101425;1058239;0.504;78699;0.074;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202604;"2026-04-16";2106236;1050388;0.499;194196;0.185;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202605;"2026-05-04";2101425;1057748;0.503;62059;0.059;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202604;"2026-04-15";2106236;1049972;0.499;189147;0.18;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202605;"2026-05-03";2101425;1057207;0.503;48739;0.046;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202604;"2026-04-14";2106236;1049551;0.498;182802;0.174;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202605;"2026-05-02";2101425;1057009;0.503;39177;0.037;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202604;"2026-04-13";2106236;1049115;0.498;176433;0.168;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202605;"2026-05-01";2101425;1056756;0.503;26233;0.025;0.5364864394522413;0.6678275448430819;0.19666919462224575;2230439124.00071;4135403924.1137757;0.5393521805681163;180;1000;0.18;1357;5000;0.2714
|
||||||
202604;"2026-04-12";2106236;1048669;0.498;169981;0.162;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-30";2106236;1056399;0.502;263435;0.249;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202604;"2026-04-11";2106236;1048506;0.498;165624;0.158;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-29";2106236;1055833;0.501;258629;0.245;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202604;"2026-04-10";2106236;1048275;0.498;159654;0.152;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-28";2106236;1055340;0.501;254379;0.241;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202604;"2026-04-09";2106236;1047857;0.498;135848;0.13;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-27";2106236;1054774;0.501;249727;0.237;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202604;"2026-04-08";2106236;1047422;0.497;127968;0.122;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-26";2106236;1054128;0.5;244212;0.232;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202604;"2026-04-07";2106236;1046968;0.497;118896;0.114;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-25";2106236;1053911;0.5;241106;0.229;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202604;"2026-04-06";2106236;1046511;0.497;109255;0.104;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-24";2106236;1053569;0.5;237273;0.225;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202604;"2026-04-05";2106236;1046023;0.497;100140;0.096;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-23";2106236;1053042;0.5;230094;0.219;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202604;"2026-04-04";2106236;1045862;0.497;89993;0.086;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-22";2106236;1052586;0.5;224601;0.213;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202604;"2026-04-03";2106236;1045604;0.496;78934;0.075;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-21";2106236;1052162;0.5;219065;0.208;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202604;"2026-04-02";2106236;1045104;0.496;63301;0.061;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-20";2106236;1051719;0.499;213781;0.203;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202604;"2026-04-01";2106236;1044565;0.496;42523;0.041;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-19";2106236;1051232;0.499;207831;0.198;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202603;"2026-03-31";2111350;1043888;0.494;274372;0.263;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202604;"2026-04-18";2106236;1051035;0.499;204403;0.194;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202603;"2026-03-30";2111350;1043214;0.494;269033;0.258;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202604;"2026-04-17";2106236;1050776;0.499;200432;0.191;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202603;"2026-03-29";2111350;1042636;0.494;263479;0.253;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202604;"2026-04-16";2106236;1050388;0.499;194792;0.185;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202603;"2026-03-28";2111350;1042415;0.494;259821;0.249;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202604;"2026-04-15";2106236;1049972;0.499;189731;0.181;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202603;"2026-03-27";2111350;1042108;0.494;255783;0.245;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202604;"2026-04-14";2106236;1049551;0.498;183373;0.175;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202603;"2026-03-26";2111350;1041554;0.493;250261;0.24;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202604;"2026-04-13";2106236;1049115;0.498;176985;0.169;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202603;"2026-03-25";2111350;1040942;0.493;243903;0.234;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202604;"2026-04-12";2106236;1048669;0.498;170523;0.163;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202603;"2026-03-24";2111350;1040609;0.493;239163;0.23;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202604;"2026-04-11";2106236;1048506;0.498;166158;0.158;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202603;"2026-03-23";2111350;1040287;0.493;230597;0.222;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202604;"2026-04-10";2106236;1048275;0.498;160177;0.153;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202603;"2026-03-22";2111350;1040068;0.493;227016;0.218;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202604;"2026-04-09";2106236;1047857;0.498;136323;0.13;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202603;"2026-03-21";2111350;1039913;0.493;224156;0.216;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202604;"2026-04-08";2106236;1047422;0.497;128426;0.123;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202603;"2026-03-20";2111350;1039702;0.492;220464;0.212;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202604;"2026-04-07";2106236;1046968;0.497;119337;0.114;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202603;"2026-03-19";2111350;1039290;0.492;214057;0.206;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202604;"2026-04-06";2106236;1046511;0.497;109672;0.105;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202603;"2026-03-18";2111350;1038815;0.492;207676;0.2;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202604;"2026-04-05";2106236;1046023;0.497;100533;0.096;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202603;"2026-03-17";2111350;1038395;0.492;202020;0.195;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202604;"2026-04-04";2106236;1045862;0.497;90353;0.086;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202603;"2026-03-16";2111350;1037939;0.492;195789;0.189;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202604;"2026-04-03";2106236;1045604;0.496;79252;0.076;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202603;"2026-03-15";2111350;1037451;0.491;190464;0.184;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202604;"2026-04-02";2106236;1045104;0.496;63568;0.061;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202603;"2026-03-14";2111350;1037272;0.491;186579;0.18;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202604;"2026-04-01";2106236;1044565;0.496;42699;0.041;0.5338141778442984;0.6673857841989713;0.20014152161630472;1725113174.911269;2960579249.961586;0.5826944760670238;265;1000;0.265;1177;4000;0.29425
|
||||||
202603;"2026-03-13";2111350;1036969;0.491;181916;0.175;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-31";2111350;1043888;0.494;274729;0.263;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-12";2111350;1036447;0.491;175609;0.169;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-30";2111350;1043214;0.494;269383;0.258;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-11";2111350;1035955;0.491;167891;0.162;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-29";2111350;1042636;0.494;263822;0.253;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-10";2111350;1035390;0.49;152405;0.147;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-28";2111350;1042415;0.494;260161;0.25;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-09";2111350;1034771;0.49;132216;0.128;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-27";2111350;1042108;0.494;256114;0.246;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-08";2111350;1034511;0.49;124335;0.12;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-26";2111350;1041554;0.493;250586;0.241;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-07";2111350;1034336;0.49;118788;0.115;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-25";2111350;1040942;0.493;244222;0.235;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-06";2111350;1034044;0.49;107871;0.104;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-24";2111350;1040609;0.493;239476;0.23;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-05";2111350;1033640;0.49;98376;0.095;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-23";2111350;1040287;0.493;230891;0.222;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-04";2111350;1033166;0.489;81444;0.079;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-22";2111350;1040068;0.493;227305;0.219;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-03";2111350;1032627;0.489;67276;0.065;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-21";2111350;1039913;0.493;224438;0.216;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-02";2111350;1032038;0.489;53611;0.052;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-20";2111350;1039702;0.492;220743;0.212;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-01";2111350;1031337;0.488;28670;0.028;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-19";2111350;1039290;0.492;214335;0.206;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202602;"2026-02-28";2115881;1030969;0.487;255186;0.248;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202603;"2026-03-18";2111350;1038815;0.492;207947;0.2;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202602;"2026-02-27";2115881;1030503;0.487;250982;0.244;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202603;"2026-03-17";2111350;1038395;0.492;202285;0.195;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202602;"2026-02-26";2115881;1029917;0.487;245809;0.239;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202603;"2026-03-16";2111350;1037939;0.492;196044;0.189;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202602;"2026-02-25";2115881;1029314;0.486;240418;0.234;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202603;"2026-03-15";2111350;1037451;0.491;190713;0.184;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202602;"2026-02-24";2115881;1028705;0.486;234498;0.228;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202603;"2026-03-14";2111350;1037272;0.491;186822;0.18;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202602;"2026-02-23";2115881;1028056;0.486;223926;0.218;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202603;"2026-03-13";2111350;1036969;0.491;182155;0.176;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202602;"2026-02-22";2115881;1027538;0.486;219188;0.213;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202603;"2026-03-12";2111350;1036447;0.491;175838;0.17;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202602;"2026-02-21";2115881;1027337;0.486;215467;0.21;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202603;"2026-03-11";2111350;1035955;0.491;168116;0.162;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202602;"2026-02-20";2115881;1026963;0.485;211510;0.206;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202603;"2026-03-10";2111350;1035390;0.49;152613;0.147;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202602;"2026-02-19";2115881;1026457;0.485;206671;0.201;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202603;"2026-03-09";2111350;1034771;0.49;132411;0.128;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202602;"2026-02-18";2115881;1026004;0.485;201382;0.196;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202603;"2026-03-08";2111350;1034511;0.49;124526;0.12;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202602;"2026-02-17";2115881;1025488;0.485;195244;0.19;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202603;"2026-03-07";2111350;1034336;0.49;118977;0.115;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202602;"2026-02-16";2115881;1025061;0.484;189087;0.184;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202603;"2026-03-06";2111350;1034044;0.49;108045;0.104;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202602;"2026-02-15";2115881;1024577;0.484;184042;0.18;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202603;"2026-03-05";2111350;1033640;0.49;98540;0.095;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202602;"2026-02-14";2115881;1024357;0.484;179979;0.176;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202603;"2026-03-04";2111350;1033166;0.489;81590;0.079;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202602;"2026-02-13";2115881;1024081;0.484;175645;0.172;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202603;"2026-03-03";2111350;1032627;0.489;67411;0.065;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202602;"2026-02-12";2115881;1023528;0.484;169492;0.166;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202603;"2026-03-02";2111350;1032038;0.489;53732;0.052;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202602;"2026-02-11";2115881;1022916;0.483;162308;0.159;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202603;"2026-03-01";2111350;1031337;0.488;28751;0.028;0.5286542053435805;0.665055952360185;0.205098152317162;1289109151.3384373;1995773623.166498;0.6459195253282958;302;1000;0.302;912;3000;0.304
|
||||||
202602;"2026-02-10";2115881;1022265;0.483;144628;0.141;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-28";2115881;1030969;0.487;255378;0.248;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-09";2115881;1021630;0.483;120014;0.117;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-27";2115881;1030503;0.487;251171;0.244;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-08";2115881;1021035;0.483;104867;0.103;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-26";2115881;1029917;0.487;245993;0.239;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-07";2115881;1020800;0.482;98639;0.097;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-25";2115881;1029314;0.486;240597;0.234;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-06";2115881;1020457;0.482;91218;0.089;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-24";2115881;1028705;0.486;234673;0.228;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-05";2115881;1019955;0.482;81730;0.08;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-23";2115881;1028056;0.486;224093;0.218;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-04";2115881;1019386;0.482;71492;0.07;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-22";2115881;1027538;0.486;219352;0.213;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-03";2115881;1018799;0.482;60568;0.059;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-21";2115881;1027337;0.486;215627;0.21;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-02";2115881;1018100;0.481;46952;0.046;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-20";2115881;1026963;0.485;211669;0.206;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-01";2115881;1017353;0.481;28190;0.028;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-19";2115881;1026457;0.485;206823;0.201;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202601;"2026-01-31";2119709;1016924;0.48;258199;0.254;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202602;"2026-02-18";2115881;1026004;0.485;201529;0.196;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202601;"2026-01-30";2119709;1016432;0.48;255143;0.251;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202602;"2026-02-17";2115881;1025488;0.485;195383;0.191;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202601;"2026-01-29";2119709;1015746;0.479;251261;0.247;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202602;"2026-02-16";2115881;1025061;0.484;189225;0.185;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202601;"2026-01-28";2119709;1015140;0.479;246361;0.243;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202602;"2026-02-15";2115881;1024577;0.484;184178;0.18;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202601;"2026-01-27";2119709;1014520;0.479;242061;0.239;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202602;"2026-02-14";2115881;1024357;0.484;180110;0.176;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202601;"2026-01-26";2119709;1013886;0.478;237580;0.234;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202602;"2026-02-13";2115881;1024081;0.484;175773;0.172;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202601;"2026-01-25";2119709;1013248;0.478;232829;0.23;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202602;"2026-02-12";2115881;1023528;0.484;169614;0.166;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202601;"2026-01-24";2119709;1012924;0.478;229318;0.226;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202602;"2026-02-11";2115881;1022916;0.483;162429;0.159;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202601;"2026-01-23";2119709;1012500;0.478;222590;0.22;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202602;"2026-02-10";2115881;1022265;0.483;144738;0.142;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202601;"2026-01-22";2119709;1011910;0.477;217002;0.214;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202602;"2026-02-09";2115881;1021630;0.483;120116;0.118;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202601;"2026-01-21";2119709;1011318;0.477;211901;0.21;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202602;"2026-02-08";2115881;1021035;0.483;104960;0.103;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202601;"2026-01-20";2119709;1010784;0.477;207205;0.205;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202602;"2026-02-07";2115881;1020800;0.482;98728;0.097;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202601;"2026-01-19";2119709;1010244;0.477;202734;0.201;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202602;"2026-02-06";2115881;1020457;0.482;91304;0.089;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202601;"2026-01-18";2119709;1009671;0.476;197504;0.196;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202602;"2026-02-05";2115881;1019955;0.482;81807;0.08;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202601;"2026-01-17";2119709;1009441;0.476;194019;0.192;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202602;"2026-02-04";2115881;1019386;0.482;71561;0.07;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202601;"2026-01-16";2119709;1009127;0.476;189558;0.188;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202602;"2026-02-03";2115881;1018799;0.482;60628;0.06;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202601;"2026-01-15";2119709;1008640;0.476;184617;0.183;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202602;"2026-02-02";2115881;1018100;0.481;47006;0.046;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202601;"2026-01-14";2119709;1008138;0.476;177007;0.176;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202602;"2026-02-01";2115881;1017353;0.481;28217;0.028;0.5281317255851335;0.6560053598865053;0.1949277279129168;831300912.996345;1151932517.8018386;0.7216576493410092;236;1000;0.236;610;2000;0.305
|
||||||
202601;"2026-01-13";2119709;1007587;0.475;171155;0.17;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-31";2119709;1016924;0.48;258305;0.254;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-12";2119709;1007015;0.475;164480;0.163;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-30";2119709;1016432;0.48;255248;0.251;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-11";2119709;1006355;0.475;156058;0.155;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-29";2119709;1015746;0.479;251360;0.247;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-10";2119709;1006055;0.475;144870;0.144;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-28";2119709;1015140;0.479;246453;0.243;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-09";2119709;1005603;0.474;125634;0.125;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-27";2119709;1014520;0.479;242151;0.239;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-08";2119709;1004940;0.474;117022;0.116;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-26";2119709;1013886;0.478;237665;0.234;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-07";2119709;1004268;0.474;107934;0.107;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-25";2119709;1013248;0.478;232913;0.23;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-06";2119709;1003933;0.474;100992;0.101;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-24";2119709;1012924;0.478;229400;0.226;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-05";2119709;1003255;0.473;89813;0.09;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-23";2119709;1012500;0.478;222668;0.22;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-04";2119709;1002458;0.473;77277;0.077;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-22";2119709;1011910;0.477;217074;0.215;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-03";2119709;1002142;0.473;68400;0.068;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-21";2119709;1011318;0.477;211973;0.21;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-02";2119709;1001753;0.473;57710;0.058;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-20";2119709;1010784;0.477;207275;0.205;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-01";2119709;1001226;0.472;40373;0.04;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-19";2119709;1010244;0.477;202800;0.201;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
|
202601;"2026-01-18";2119709;1009671;0.476;197566;0.196;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
|
202601;"2026-01-17";2119709;1009441;0.476;194079;0.192;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
|
202601;"2026-01-16";2119709;1009127;0.476;189615;0.188;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
|
202601;"2026-01-15";2119709;1008640;0.476;184673;0.183;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
|
202601;"2026-01-14";2119709;1008138;0.476;177060;0.176;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
|
202601;"2026-01-13";2119709;1007587;0.475;171206;0.17;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
|
202601;"2026-01-12";2119709;1007015;0.475;164531;0.163;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
|
202601;"2026-01-11";2119709;1006355;0.475;156105;0.155;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
|
202601;"2026-01-10";2119709;1006055;0.475;144915;0.144;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
|
202601;"2026-01-09";2119709;1005603;0.474;125671;0.125;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
|
202601;"2026-01-08";2119709;1004940;0.474;117057;0.116;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
|
202601;"2026-01-07";2119709;1004268;0.474;107968;0.108;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
|
202601;"2026-01-06";2119709;1003933;0.474;101024;0.101;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
|
202601;"2026-01-05";2119709;1003255;0.473;89839;0.09;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
|
202601;"2026-01-04";2119709;1002458;0.473;77296;0.077;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
|
202601;"2026-01-03";2119709;1002142;0.473;68417;0.068;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
|
202601;"2026-01-02";2119709;1001753;0.473;57719;0.058;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
|
202601;"2026-01-01";2119709;1001226;0.472;40381;0.04;0.505198177979913;0.6601086161270731;0.23467416477008884;418338119.26134884;496911305.38743484;0.8418768394395383;374;1000;0.374;374;1000;0.374
|
||||||
|
|||||||
|
483
index.html
483
index.html
@ -75,8 +75,8 @@ body { font-family: var(--font-base); background: var(--color-bg); color: var(--
|
|||||||
/* ── SUMMARY BAR ── */
|
/* ── SUMMARY BAR ── */
|
||||||
.summary-section { padding: 20px 24px 0; }
|
.summary-section { padding: 20px 24px 0; }
|
||||||
.summary-bar { display: grid; grid-template-columns: repeat(5, 1fr); gap: 14px; }
|
.summary-bar { display: grid; grid-template-columns: repeat(5, 1fr); gap: 14px; }
|
||||||
.kpi-card { background: var(--color-surface); border-radius: var(--radius-card); padding: 16px; box-shadow: var(--shadow-card); cursor: pointer; transition: box-shadow 0.2s, transform 0.15s; border-top: 4px solid var(--color-border); }
|
.kpi-card { background: var(--color-surface); border-radius: var(--radius-card); padding: 16px; box-shadow: var(--shadow-card); cursor: pointer; transition: box-shadow 0.25s, transform 0.25s; border-top: 4px solid var(--color-border); }
|
||||||
.kpi-card:hover { box-shadow: var(--shadow-card-hover); transform: translateY(-2px); }
|
.kpi-card:hover { box-shadow: var(--shadow-card-hover); transform: scale(1.03); }
|
||||||
.kpi-card.status-green { border-top-color: var(--color-green); }
|
.kpi-card.status-green { border-top-color: var(--color-green); }
|
||||||
.kpi-card.status-yellow { border-top-color: var(--color-yellow); }
|
.kpi-card.status-yellow { border-top-color: var(--color-yellow); }
|
||||||
.kpi-card.status-red { border-top-color: var(--color-red); }
|
.kpi-card.status-red { border-top-color: var(--color-red); }
|
||||||
@ -209,6 +209,27 @@ body { font-family: var(--font-base); background: var(--color-bg); color: var(--
|
|||||||
@media (max-width: 1024px) { .main-layout { grid-template-columns: 1fr; } .ai-panel { position: static; } }
|
@media (max-width: 1024px) { .main-layout { grid-template-columns: 1fr; } .ai-panel { position: static; } }
|
||||||
@media (max-width: 768px) { .charts-grid { grid-template-columns: 1fr; } .charts-grid .chart-section:nth-child(5) { grid-column: auto; } .summary-bar { grid-template-columns: 1fr 1fr; } .main-layout,.summary-section { padding-left: 12px; padding-right: 12px; } .toolbar { padding: 10px 12px; } }
|
@media (max-width: 768px) { .charts-grid { grid-template-columns: 1fr; } .charts-grid .chart-section:nth-child(5) { grid-column: auto; } .summary-bar { grid-template-columns: 1fr 1fr; } .main-layout,.summary-section { padding-left: 12px; padding-right: 12px; } .toolbar { padding: 10px 12px; } }
|
||||||
@media (max-width: 480px) { .summary-bar { grid-template-columns: 1fr; } .header-left h1 { font-size: 14px; } }
|
@media (max-width: 480px) { .summary-bar { grid-template-columns: 1fr; } .header-left h1 { font-size: 14px; } }
|
||||||
|
|
||||||
|
/* ── KPI MODAL ── */
|
||||||
|
#kpi-modal-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.55); z-index: 999; display: none; align-items: center; justify-content: center; }
|
||||||
|
#kpi-modal-overlay.active { display: flex; }
|
||||||
|
#kpi-modal { background: var(--color-surface); border-radius: 16px; max-width: 840px; width: 94%; max-height: 92vh; overflow-y: auto; box-shadow: 0 20px 60px rgba(0,0,0,0.25); }
|
||||||
|
.modal-header { display: flex; justify-content: space-between; align-items: flex-start; padding: 24px 24px 0; }
|
||||||
|
.modal-header h2 { font-size: 20px; font-weight: 700; display: flex; align-items: center; gap: 10px; }
|
||||||
|
.modal-close { background: var(--color-bg); color: var(--color-text-secondary); border: 1px solid var(--color-border); width: 36px; height: 36px; border-radius: 8px; cursor: pointer; font-size: 18px; flex-shrink: 0; transition: all 0.15s; }
|
||||||
|
.modal-close:hover { background: var(--color-red-bg); color: var(--color-red); border-color: var(--color-red); }
|
||||||
|
.modal-body { padding: 20px 24px 24px; }
|
||||||
|
.modal-info { font-size: 13px; line-height: 1.7; color: var(--color-text-secondary); margin-bottom: 20px; }
|
||||||
|
.modal-info b { color: var(--color-text-primary); }
|
||||||
|
.modal-formula { background: var(--color-brand-light); border: 1px solid rgba(0,82,204,0.15); border-radius: 8px; padding: 12px 16px; margin-bottom: 16px; font-family: var(--font-mono); font-size: 13px; }
|
||||||
|
.modal-formula .formula-val { color: var(--color-brand); font-weight: 700; }
|
||||||
|
.modal-link { display: inline-flex; align-items: center; gap: 6px; color: var(--color-brand); font-size: 12px; font-weight: 500; text-decoration: none; margin-bottom: 20px; }
|
||||||
|
.modal-link:hover { text-decoration: underline; }
|
||||||
|
.modal-charts { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
|
||||||
|
.modal-chart-box { background: var(--color-bg); border-radius: 10px; padding: 14px; }
|
||||||
|
.modal-chart-box h4 { font-size: 12px; font-weight: 600; color: var(--color-text-secondary); margin-bottom: 10px; text-transform: uppercase; letter-spacing: 0.03em; }
|
||||||
|
.modal-chart-box canvas { max-height: 210px; }
|
||||||
|
@media (max-width: 640px) { .modal-charts { grid-template-columns: 1fr; } }
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
@ -259,6 +280,7 @@ body { font-family: var(--font-base); background: var(--color-bg); color: var(--
|
|||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<span id="last-updated">—</span>
|
<span id="last-updated">—</span>
|
||||||
|
<a class="btn btn-ghost" href="app_stats/index.html" style="text-decoration:none">📱 Метрики МП</a>
|
||||||
<button class="btn btn-ghost" id="btn-export-csv">↓ Скачать CSV</button>
|
<button class="btn btn-ghost" id="btn-export-csv">↓ Скачать CSV</button>
|
||||||
<button class="btn btn-outline" id="btn-reload">Обновить данные</button>
|
<button class="btn btn-outline" id="btn-reload">Обновить данные</button>
|
||||||
</div>
|
</div>
|
||||||
@ -355,6 +377,25 @@ body { font-family: var(--font-base); background: var(--color-bg); color: var(--
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- KPI DETAIL MODAL -->
|
||||||
|
<div id="kpi-modal-overlay" onclick="closeKpiModal(event)">
|
||||||
|
<div id="kpi-modal" onclick="event.stopPropagation()">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h2 id="modal-title"></h2>
|
||||||
|
<button class="modal-close" onclick="closeKpiModal()">×</button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<div class="modal-info" id="modal-info"></div>
|
||||||
|
<div class="modal-formula" id="modal-formula"></div>
|
||||||
|
<a class="modal-link" id="modal-link" href="#" target="_blank" rel="noopener">📊 Открыть детальный отчёт в Qlik Sense →</a>
|
||||||
|
<div class="modal-charts">
|
||||||
|
<div class="modal-chart-box"><h4 id="modal-chart1-label"></h4><canvas id="modal-chart1"></canvas></div>
|
||||||
|
<div class="modal-chart-box"><h4 id="modal-chart2-label"></h4><canvas id="modal-chart2"></canvas></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/marked@12/marked.min.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/marked@12/marked.min.js"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.3/dist/chart.umd.min.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.3/dist/chart.umd.min.js"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-annotation@3.0.1/dist/chartjs-plugin-annotation.min.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-annotation@3.0.1/dist/chartjs-plugin-annotation.min.js"></script>
|
||||||
@ -362,156 +403,158 @@ body { font-family: var(--font-base); background: var(--color-bg); color: var(--
|
|||||||
// ═══════════════════ CONSTANTS ═══════════════════
|
// ═══════════════════ CONSTANTS ═══════════════════
|
||||||
// ─── Embedded CSV data (update this when the CSV changes) ───────────────────
|
// ─── Embedded CSV data (update this when the CSV changes) ───────────────────
|
||||||
// This makes the dashboard work via file:// AND on GitHub Pages without a server.
|
// This makes the dashboard work via file:// AND on GitHub Pages without a server.
|
||||||
const EMBEDDED_CSV = `"report_period_id";"entry_date";"abons";"registered_total";"registered_pct";"mau_daily";"mau_per_registered";"traditional_comms_pct";"prev_year_traditional_comms_pct";"traditional_comms_decrease_pct";"cumulative_digital_rap_total";"cumulative_rap_total";"fd_rap_pct";"fd_orders";"fd_orders_goal";"fd_orders_pct";"cum_fd_orders";"cum_fd_orders_goal";"cum_fd_orders_pct"
|
const EMBEDDED_CSV = `"report_period_id";"entry_date";"abons";"registered_total";"registered_pct";"mau_daily";"mau_per_registered";"traditional_comms_pct";"prev_yesr_traditional_comms_pct";"traditional_comms_decrease_pct";"cumulative_digital_rap_total";"cumulative_rap_total";"fd_rap_pct";"fd_orders";"fd_orders_goal";"fd_orders_pct";"cum_fd_orders";"cum_fd_orders_goal";"cum_fd_orders_pct"
|
||||||
202605;"2026-05-29";2100718;1067535;0.508;236392;0.221;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-31";2101989;1068795;0.508;249700;0.234;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-28";2100718;1067532;0.508;236392;0.221;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-30";2101989;1068493;0.508;246154;0.23;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-27";2100718;1066924;0.508;231473;0.217;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-29";2101989;1068104;0.508;242298;0.227;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-26";2100718;1066631;0.508;227794;0.214;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-28";2101989;1067532;0.508;237187;0.222;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-25";2100718;1066084;0.507;222648;0.209;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-27";2101989;1066924;0.508;232155;0.218;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-24";2100718;1065569;0.507;217146;0.204;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-26";2101989;1066631;0.507;228406;0.214;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-23";2100718;1065297;0.507;210438;0.198;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-25";2101989;1066084;0.507;223215;0.209;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-22";2100718;1064996;0.507;206702;0.194;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-24";2101989;1065569;0.507;217678;0.204;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-21";2100718;1064508;0.507;201861;0.19;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-23";2101989;1065297;0.507;210932;0.198;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-20";2100718;1064000;0.506;196136;0.184;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-22";2101989;1064996;0.507;207178;0.195;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-19";2100718;1063493;0.506;190391;0.179;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-21";2101989;1064508;0.506;202306;0.19;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-18";2100718;1063028;0.506;185169;0.174;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-20";2101989;1064000;0.506;196569;0.185;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-17";2100718;1062578;0.506;179417;0.169;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-19";2101989;1063493;0.506;190808;0.179;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-16";2100718;1062398;0.506;175852;0.166;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-18";2101989;1063028;0.506;185572;0.175;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-15";2100718;1062131;0.506;171740;0.162;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-17";2101989;1062578;0.506;179812;0.169;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-14";2100718;1061692;0.505;165454;0.156;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-16";2101989;1062398;0.505;176238;0.166;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-13";2100718;1061183;0.505;158742;0.15;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-15";2101989;1062131;0.505;172113;0.162;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-12";2100718;1060626;0.505;150930;0.142;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-14";2101989;1061692;0.505;165824;0.156;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-11";2100718;1060034;0.505;140882;0.133;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-13";2101989;1061183;0.505;159101;0.15;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-10";2100718;1059741;0.504;133994;0.126;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-12";2101989;1060626;0.505;151282;0.143;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-09";2100718;1059532;0.504;108417;0.102;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-11";2101989;1060034;0.504;141221;0.133;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-08";2100718;1059344;0.504;103158;0.097;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-10";2101989;1059741;0.504;134326;0.127;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-07";2100718;1058907;0.504;93860;0.089;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-09";2101989;1059532;0.504;108714;0.103;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-06";2100718;1058693;0.504;87307;0.082;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-08";2101989;1059344;0.504;103441;0.098;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-05";2100718;1058239;0.504;77687;0.073;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-07";2101989;1058907;0.504;94130;0.089;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-04";2100718;1057748;0.504;61144;0.058;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-06";2101989;1058693;0.504;87564;0.083;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-03";2100718;1057207;0.503;47949;0.045;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-05";2101989;1058239;0.503;77931;0.074;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-02";2100718;1057009;0.503;38528;0.036;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-04";2101989;1057748;0.503;61363;0.058;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202605;"2026-05-01";2100718;1056756;0.503;25816;0.024;0.5346041830749427;0.6678292219732731;0.19948968166544545;2124943881.8517177;4001729145.793371;0.531006423582032;164;1000;0.164;1343;5000;0.2686
|
202605;"2026-05-03";2101989;1057207;0.503;48135;0.046;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202604;"2026-04-30";2106236;1056399;0.502;262629;0.249;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202605;"2026-05-02";2101989;1057009;0.503;38686;0.037;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202604;"2026-04-29";2106236;1055833;0.501;257844;0.244;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202605;"2026-05-01";2101989;1056756;0.503;25919;0.025;0.5366890026123278;0.6678290454812975;0.1963676838500764;2175065186.3946314;4051850450.3362856;0.5368078642226567;180;1000;0.18;1359;5000;0.2718
|
||||||
202604;"2026-04-28";2106236;1055340;0.501;253602;0.24;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-30";2106236;1056399;0.502;262808;0.249;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-27";2106236;1054774;0.501;248967;0.236;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-29";2106236;1055833;0.501;258016;0.244;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-26";2106236;1054128;0.5;243467;0.231;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-28";2106236;1055340;0.501;253771;0.24;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-25";2106236;1053911;0.5;240371;0.228;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-27";2106236;1054774;0.501;249130;0.236;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-24";2106236;1053569;0.5;236545;0.225;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-26";2106236;1054128;0.5;243625;0.231;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-23";2106236;1053042;0.5;229391;0.218;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-25";2106236;1053911;0.5;240525;0.228;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-22";2106236;1052586;0.5;223915;0.213;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-24";2106236;1053569;0.5;236698;0.225;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-21";2106236;1052162;0.5;218407;0.208;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-23";2106236;1053042;0.5;229540;0.218;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-20";2106236;1051719;0.499;213139;0.203;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-22";2106236;1052586;0.5;224061;0.213;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-19";2106236;1051232;0.499;207205;0.197;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-21";2106236;1052162;0.5;218547;0.208;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-18";2106236;1051035;0.499;203784;0.194;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-20";2106236;1051719;0.499;213277;0.203;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-17";2106236;1050776;0.499;199826;0.19;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-19";2106236;1051232;0.499;207340;0.197;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-16";2106236;1050388;0.499;194196;0.185;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-18";2106236;1051035;0.499;203917;0.194;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-15";2106236;1049972;0.499;189147;0.18;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-17";2106236;1050776;0.499;199957;0.19;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-14";2106236;1049551;0.498;182802;0.174;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-16";2106236;1050388;0.499;194325;0.185;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-13";2106236;1049115;0.498;176433;0.168;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-15";2106236;1049972;0.499;189274;0.18;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-12";2106236;1048669;0.498;169981;0.162;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-14";2106236;1049551;0.498;182926;0.174;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-11";2106236;1048506;0.498;165624;0.158;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-13";2106236;1049115;0.498;176555;0.168;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-10";2106236;1048275;0.498;159654;0.152;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-12";2106236;1048669;0.498;170102;0.162;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-09";2106236;1047857;0.498;135848;0.13;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-11";2106236;1048506;0.498;165743;0.158;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-08";2106236;1047422;0.497;127968;0.122;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-10";2106236;1048275;0.498;159771;0.152;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-07";2106236;1046968;0.497;118896;0.114;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-09";2106236;1047857;0.498;135958;0.13;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-06";2106236;1046511;0.497;109255;0.104;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-08";2106236;1047422;0.497;128075;0.122;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-05";2106236;1046023;0.497;100140;0.096;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-07";2106236;1046968;0.497;119000;0.114;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-04";2106236;1045862;0.497;89993;0.086;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-06";2106236;1046511;0.497;109350;0.104;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-03";2106236;1045604;0.496;78934;0.075;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-05";2106236;1046023;0.497;100225;0.096;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-02";2106236;1045104;0.496;63301;0.061;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-04";2106236;1045862;0.497;90067;0.086;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202604;"2026-04-01";2106236;1044565;0.496;42523;0.041;0.5338425639244234;0.6673874142558902;0.20010094208978135;1710926678.0289857;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
202604;"2026-04-03";2106236;1045604;0.496;79001;0.076;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202603;"2026-03-31";2111350;1043888;0.494;274372;0.263;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202604;"2026-04-02";2106236;1045104;0.496;63359;0.061;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202603;"2026-03-30";2111350;1043214;0.494;269033;0.258;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202604;"2026-04-01";2106236;1044565;0.496;42565;0.041;0.5338365169324176;0.6673869796669217;0.20010948190981526;1710926678.0289855;2933216654.6453385;0.5832936599890735;267;1000;0.267;1179;4000;0.29475
|
||||||
202603;"2026-03-29";2111350;1042636;0.494;263479;0.253;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-31";2111350;1043888;0.494;274427;0.263;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-28";2111350;1042415;0.494;259821;0.249;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-30";2111350;1043214;0.494;269087;0.258;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-27";2111350;1042108;0.494;255783;0.245;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-29";2111350;1042636;0.494;263532;0.253;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-26";2111350;1041554;0.493;250261;0.24;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-28";2111350;1042415;0.494;259873;0.249;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-25";2111350;1040942;0.493;243903;0.234;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-27";2111350;1042108;0.494;255833;0.245;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-24";2111350;1040609;0.493;239163;0.23;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-26";2111350;1041554;0.493;250310;0.24;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-23";2111350;1040287;0.493;230597;0.222;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-25";2111350;1040942;0.493;243951;0.234;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-22";2111350;1040068;0.493;227016;0.218;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-24";2111350;1040609;0.493;239211;0.23;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-21";2111350;1039913;0.493;224156;0.216;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-23";2111350;1040287;0.493;230641;0.222;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-20";2111350;1039702;0.492;220464;0.212;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-22";2111350;1040068;0.493;227059;0.218;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-19";2111350;1039290;0.492;214057;0.206;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-21";2111350;1039913;0.493;224197;0.216;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-18";2111350;1038815;0.492;207676;0.2;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-20";2111350;1039702;0.492;220503;0.212;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-17";2111350;1038395;0.492;202020;0.195;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-19";2111350;1039290;0.492;214096;0.206;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-16";2111350;1037939;0.492;195789;0.189;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-18";2111350;1038815;0.492;207714;0.2;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-15";2111350;1037451;0.491;190464;0.184;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-17";2111350;1038395;0.492;202057;0.195;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-14";2111350;1037272;0.491;186579;0.18;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-16";2111350;1037939;0.492;195826;0.189;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-13";2111350;1036969;0.491;181916;0.175;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-15";2111350;1037451;0.491;190501;0.184;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-12";2111350;1036447;0.491;175609;0.169;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-14";2111350;1037272;0.491;186615;0.18;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-11";2111350;1035955;0.491;167891;0.162;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-13";2111350;1036969;0.491;181952;0.175;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-10";2111350;1035390;0.49;152405;0.147;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-12";2111350;1036447;0.491;175644;0.169;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-09";2111350;1034771;0.49;132216;0.128;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-11";2111350;1035955;0.491;167925;0.162;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-08";2111350;1034511;0.49;124335;0.12;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-10";2111350;1035390;0.49;152437;0.147;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-07";2111350;1034336;0.49;118788;0.115;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-09";2111350;1034771;0.49;132245;0.128;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-06";2111350;1034044;0.49;107871;0.104;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-08";2111350;1034511;0.49;124363;0.12;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-05";2111350;1033640;0.49;98376;0.095;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-07";2111350;1034336;0.49;118815;0.115;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-04";2111350;1033166;0.489;81444;0.079;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-06";2111350;1034044;0.49;107895;0.104;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-03";2111350;1032627;0.489;67276;0.065;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-05";2111350;1033640;0.49;98398;0.095;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-02";2111350;1032038;0.489;53611;0.052;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-04";2111350;1033166;0.489;81465;0.079;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202603;"2026-03-01";2111350;1031337;0.488;28670;0.028;0.5286579372563773;0.6650577906177735;0.20509473805982192;1277504399.5958557;1976256535.1164815;0.646426401074777;302;1000;0.302;912;3000;0.304
|
202603;"2026-03-03";2111350;1032627;0.489;67294;0.065;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202602;"2026-02-28";2115881;1030969;0.487;255186;0.248;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202603;"2026-03-02";2111350;1032038;0.489;53625;0.052;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202602;"2026-02-27";2115881;1030503;0.487;250982;0.244;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202603;"2026-03-01";2111350;1031337;0.488;28679;0.028;0.5286574982050782;0.6650572246826678;0.2050947218003274;1277504399.5958557;1976256535.1164813;0.646426401074777;302;1000;0.302;912;3000;0.304
|
||||||
202602;"2026-02-26";2115881;1029917;0.487;245809;0.239;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-28";2115881;1030969;0.487;255217;0.248;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-25";2115881;1029314;0.486;240418;0.234;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-27";2115881;1030503;0.487;251011;0.244;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-24";2115881;1028705;0.486;234498;0.228;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-26";2115881;1029917;0.487;245838;0.239;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-23";2115881;1028056;0.486;223926;0.218;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-25";2115881;1029314;0.486;240445;0.234;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-22";2115881;1027538;0.486;219188;0.213;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-24";2115881;1028705;0.486;234523;0.228;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-21";2115881;1027337;0.486;215467;0.21;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-23";2115881;1028056;0.486;223949;0.218;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-20";2115881;1026963;0.485;211510;0.206;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-22";2115881;1027538;0.486;219211;0.213;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-19";2115881;1026457;0.485;206671;0.201;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-21";2115881;1027337;0.486;215490;0.21;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-18";2115881;1026004;0.485;201382;0.196;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-20";2115881;1026963;0.485;211533;0.206;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-17";2115881;1025488;0.485;195244;0.19;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-19";2115881;1026457;0.485;206694;0.201;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-16";2115881;1025061;0.484;189087;0.184;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-18";2115881;1026004;0.485;201406;0.196;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-15";2115881;1024577;0.484;184042;0.18;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-17";2115881;1025488;0.485;195267;0.19;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-14";2115881;1024357;0.484;179979;0.176;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-16";2115881;1025061;0.484;189110;0.184;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-13";2115881;1024081;0.484;175645;0.172;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-15";2115881;1024577;0.484;184065;0.18;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-12";2115881;1023528;0.484;169492;0.166;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-14";2115881;1024357;0.484;180002;0.176;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-11";2115881;1022916;0.483;162308;0.159;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-13";2115881;1024081;0.484;175668;0.172;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-10";2115881;1022265;0.483;144628;0.141;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-12";2115881;1023528;0.484;169515;0.166;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-09";2115881;1021630;0.483;120014;0.117;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-11";2115881;1022916;0.483;162331;0.159;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-08";2115881;1021035;0.483;104867;0.103;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-10";2115881;1022265;0.483;144649;0.141;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-07";2115881;1020800;0.482;98639;0.097;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-09";2115881;1021630;0.483;120035;0.117;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-06";2115881;1020457;0.482;91218;0.089;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-08";2115881;1021035;0.483;104886;0.103;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-05";2115881;1019955;0.482;81730;0.08;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-07";2115881;1020800;0.482;98656;0.097;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-04";2115881;1019386;0.482;71492;0.07;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-06";2115881;1020457;0.482;91233;0.089;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-03";2115881;1018799;0.482;60568;0.059;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-05";2115881;1019955;0.482;81744;0.08;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-02";2115881;1018100;0.481;46952;0.046;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-04";2115881;1019386;0.482;71505;0.07;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202602;"2026-02-01";2115881;1017353;0.481;28190;0.028;0.5281336608448282;0.6560082059673001;0.19492827065161145;823396217.71518;1139791017.7953122;0.7224098144832446;236;1000;0.236;610;2000;0.305
|
202602;"2026-02-03";2115881;1018799;0.482;60578;0.059;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202601;"2026-01-31";2119709;1016924;0.48;258199;0.254;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202602;"2026-02-02";2115881;1018100;0.481;46960;0.046;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202601;"2026-01-30";2119709;1016432;0.48;255143;0.251;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202602;"2026-02-01";2115881;1017353;0.481;28194;0.028;0.5281336608448282;0.6560073927988388;0.19492727270715748;823396217.7151799;1139791017.795312;0.7224098144832447;236;1000;0.236;610;2000;0.305
|
||||||
202601;"2026-01-29";2119709;1015746;0.479;251261;0.247;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-31";2119709;1016924;0.48;258214;0.254;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-28";2119709;1015140;0.479;246361;0.243;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-30";2119709;1016432;0.48;255158;0.251;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-27";2119709;1014520;0.479;242061;0.239;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-29";2119709;1015746;0.479;251275;0.247;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-26";2119709;1013886;0.478;237580;0.234;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-28";2119709;1015140;0.479;246374;0.243;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-25";2119709;1013248;0.478;232829;0.23;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-27";2119709;1014520;0.479;242074;0.239;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-24";2119709;1012924;0.478;229318;0.226;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-26";2119709;1013886;0.478;237592;0.234;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-23";2119709;1012500;0.478;222590;0.22;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-25";2119709;1013248;0.478;232841;0.23;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-22";2119709;1011910;0.477;217002;0.214;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-24";2119709;1012924;0.478;229330;0.226;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-21";2119709;1011318;0.477;211901;0.21;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-23";2119709;1012500;0.478;222602;0.22;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-20";2119709;1010784;0.477;207205;0.205;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-22";2119709;1011910;0.477;217013;0.214;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-19";2119709;1010244;0.477;202734;0.201;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-21";2119709;1011318;0.477;211912;0.21;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-18";2119709;1009671;0.476;197504;0.196;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-20";2119709;1010784;0.477;207216;0.205;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-17";2119709;1009441;0.476;194019;0.192;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-19";2119709;1010244;0.477;202745;0.201;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-16";2119709;1009127;0.476;189558;0.188;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-18";2119709;1009671;0.476;197515;0.196;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-15";2119709;1008640;0.476;184617;0.183;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-17";2119709;1009441;0.476;194030;0.192;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-14";2119709;1008138;0.476;177007;0.176;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-16";2119709;1009127;0.476;189569;0.188;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-13";2119709;1007587;0.475;171155;0.17;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-15";2119709;1008640;0.476;184628;0.183;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-12";2119709;1007015;0.475;164480;0.163;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-14";2119709;1008138;0.476;177018;0.176;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-11";2119709;1006355;0.475;156058;0.155;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-13";2119709;1007587;0.475;171165;0.17;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-10";2119709;1006055;0.475;144870;0.144;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-12";2119709;1007015;0.475;164491;0.163;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-09";2119709;1005603;0.474;125634;0.125;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-11";2119709;1006355;0.475;156069;0.155;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-08";2119709;1004940;0.474;117022;0.116;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-10";2119709;1006055;0.475;144880;0.144;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-07";2119709;1004268;0.474;107934;0.107;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-09";2119709;1005603;0.474;125643;0.125;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-06";2119709;1003933;0.474;100992;0.101;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-08";2119709;1004940;0.474;117031;0.116;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-05";2119709;1003255;0.473;89813;0.09;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-07";2119709;1004268;0.474;107943;0.107;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-04";2119709;1002458;0.473;77277;0.077;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-06";2119709;1003933;0.474;101001;0.101;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-03";2119709;1002142;0.473;68400;0.068;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-05";2119709;1003255;0.473;89822;0.09;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-02";2119709;1001753;0.473;57710;0.058;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374
|
202601;"2026-01-04";2119709;1002458;0.473;77284;0.077;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
202601;"2026-01-01";2119709;1001226;0.472;40373;0.04;0.5051958171773308;0.6601111271723942;0.2346806524208247;415145489.39247954;492169296.8361092;0.8435013968998591;374;1000;0.374;374;1000;0.374`;
|
202601;"2026-01-03";2119709;1002142;0.473;68406;0.068;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
|
202601;"2026-01-02";2119709;1001753;0.473;57714;0.058;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374
|
||||||
|
202601;"2026-01-01";2119709;1001226;0.472;40377;0.04;0.5051958171773308;0.6601094531400574;0.23467871157703024;415145489.39247936;492169296.8361089;0.8435013968998593;374;1000;0.374;374;1000;0.374`;
|
||||||
// ─────────────────────────────────────────────────────────────────────────────
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
const MONTH_NAMES = ['','Янв','Фев','Мар','Апр','Май','Июн','Июл','Авг','Сен','Окт','Ноя','Дек'];
|
const MONTH_NAMES = ['','Янв','Фев','Мар','Апр','Май','Июн','Июл','Авг','Сен','Окт','Ноя','Дек'];
|
||||||
@ -547,6 +590,39 @@ const KPI_CONFIG = [
|
|||||||
{ id:'fd-orders', name:'FD установки', icon:'⚡', field:'cum_fd_orders_pct', target:1.00, targetLabel:'12 000 шт.'},
|
{ id:'fd-orders', name:'FD установки', icon:'⚡', field:'cum_fd_orders_pct', target:1.00, targetLabel:'12 000 шт.'},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const KPI_DETAIL = {
|
||||||
|
registrations: {
|
||||||
|
formula: 'Доля регистраций = 100% × (Зарегистрировано / Всего абонентов B2C)',
|
||||||
|
description: 'Используется вся активная абонентская база B2C компании Казахтелеком и полное количество зарегистрированных абонентов в системе <b>telecom.kz</b> за всё время.',
|
||||||
|
qlik: 'https://app-qlik-ss03.cdn.telecom.kz/sense/app/a343af17-0cfc-4538-81d6-ea87abb615a2/sheet/a08db3f1-bf5b-44d9-bc62-43386169c221/state/analysis',
|
||||||
|
charts: [{field:'abons', label:'Абоненты B2C'}, {field:'registered_total', label:'Зарегистрировано'}],
|
||||||
|
},
|
||||||
|
mau: {
|
||||||
|
formula: 'MAU / Зарегистрированные = 100% × (MAU за месяц / Всего зарегистрированных)',
|
||||||
|
description: 'Используется полное количество зарегистрированных абонентов в системе <b>telecom.kz</b> и общее количество уникальных пользователей приложения <b>TelecomKz</b> за месяц.',
|
||||||
|
qlik: 'https://app-qlik-ss03.cdn.telecom.kz/sense/app/a343af17-0cfc-4538-81d6-ea87abb615a2/sheet/a08db3f1-bf5b-44d9-bc62-43386169c221/state/analysis',
|
||||||
|
charts: [{field:'registered_total', label:'Зарегистрировано'}, {field:'mau_max', label:'MAU (макс. за месяц)'}],
|
||||||
|
},
|
||||||
|
traditional: {
|
||||||
|
formula: 'Снижение = (Доля трад. прошлого года − Доля трад. этого года) / Доля трад. прошлого года × 100%',
|
||||||
|
description: 'Берётся доля традиционных обращений текущего года и доля традиционных обращений прошлого года. Количество заказов по традиционным каналам — из отчётов <b>Qlik Sense</b>, предоставленных отделом Customer Service.',
|
||||||
|
qlik: 'https://app-qlik-ss03.cdn.telecom.kz/sense/app/a343af17-0cfc-4538-81d6-ea87abb615a2/sheet/a08db3f1-bf5b-44d9-bc62-43386169c221/state/analysis',
|
||||||
|
charts: [{field:'traditional_comms_pct', label:'Традиционные обращения 2026 (%)', isPct:true}, {field:'prev_yesr_traditional_comms_pct', label:'Традиционные обращения 2025 (%)', isPct:true}],
|
||||||
|
},
|
||||||
|
'digital-sales': {
|
||||||
|
formula: 'Доля цифровых продаж = 100% × (Цифровая выручка / Общая выручка)',
|
||||||
|
description: 'Берутся доходы по всем каналам продаж компании и вычисляется доля цифровых каналов. Детальная разбивка по каждому каналу — в отчёте Qlik Sense.',
|
||||||
|
qlik: 'https://app-qlik-ss03.cdn.telecom.kz/sense/app/203416cd-f1e2-44dd-8b73-7afeb0f8037e/sheet/ajCCVt/state/analysis',
|
||||||
|
charts: [{field:'cumulative_digital_rap_total', label:'Цифровая выручка', isMoney:true}, {field:'cumulative_rap_total', label:'Общая выручка', isMoney:true}],
|
||||||
|
},
|
||||||
|
'fd-orders': {
|
||||||
|
formula: 'Годовой план FD = Накоплено заказов / Годовая цель (12 000) × 100%',
|
||||||
|
description: 'Учитываются успешно закрытые заказы CRM по core-услугам из канала продаж <b>«Мобильное приложение B2C»</b>. Учитывается накопительный итог с начала года.',
|
||||||
|
qlik: 'https://app-qlik-ss03.cdn.telecom.kz/sense/app/203416cd-f1e2-44dd-8b73-7afeb0f8037e/sheet/XZANwR/state/analysis',
|
||||||
|
charts: [{field:'fd_orders', label:'FD заказы (мес.)'}, {field:'cum_fd_orders', label:'FD заказы (накоп.)'}],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
// ═══════════════════ FORMATTING ═══════════════════
|
// ═══════════════════ FORMATTING ═══════════════════
|
||||||
const fmtPct = (v, d=1) => (v*100).toFixed(d)+'%';
|
const fmtPct = (v, d=1) => (v*100).toFixed(d)+'%';
|
||||||
const fmtInt = n => new Intl.NumberFormat('ru-RU').format(Math.round(n));
|
const fmtInt = n => new Intl.NumberFormat('ru-RU').format(Math.round(n));
|
||||||
@ -797,7 +873,7 @@ function renderSummaryBar() {
|
|||||||
<div class="kpi-card-meta"><span>Цель: ${kpi.targetLabel}</span><span class="kpi-delta ${val>=kpi.target?'positive':'negative'}">${delta}</span></div>
|
<div class="kpi-card-meta"><span>Цель: ${kpi.targetLabel}</span><span class="kpi-delta ${val>=kpi.target?'positive':'negative'}">${delta}</span></div>
|
||||||
<div class="kpi-risk-row">${riskText}</div>
|
<div class="kpi-risk-row">${riskText}</div>
|
||||||
<canvas class="sparkline" id="spark-${kpi.id}" width="100" height="28"></canvas>`;
|
<canvas class="sparkline" id="spark-${kpi.id}" width="100" height="28"></canvas>`;
|
||||||
card.addEventListener('click',()=>document.getElementById(`section-kpi-${kpi.id}`).scrollIntoView({behavior:'smooth',block:'start'}));
|
card.addEventListener('click',()=>openKpiModal(kpi.id));
|
||||||
bar.appendChild(card);
|
bar.appendChild(card);
|
||||||
|
|
||||||
const sparkColor={green:'#10B981',orange:'#F97316',yellow:'#F59E0B',red:'#EF4444'}[status];
|
const sparkColor={green:'#10B981',orange:'#F97316',yellow:'#F59E0B',red:'#EF4444'}[status];
|
||||||
@ -1177,7 +1253,7 @@ async function runAiAnalysis() {
|
|||||||
method:'POST', signal:controller.signal,
|
method:'POST', signal:controller.signal,
|
||||||
headers:{'Content-Type':'application/json','Authorization':'Bearer '+apiKey},
|
headers:{'Content-Type':'application/json','Authorization':'Bearer '+apiKey},
|
||||||
body:JSON.stringify({
|
body:JSON.stringify({
|
||||||
model:'deepseek-chat', max_tokens:1800,
|
model:'deepseek-chat', max_tokens:4000,
|
||||||
messages:[
|
messages:[
|
||||||
{role:'system',content:'Ты опытный аналитик данных. Отвечай структурированно, конкретно, на русском языке.'},
|
{role:'system',content:'Ты опытный аналитик данных. Отвечай структурированно, конкретно, на русском языке.'},
|
||||||
{role:'user', content:buildPrompt(AppState.snapshots)},
|
{role:'user', content:buildPrompt(AppState.snapshots)},
|
||||||
@ -1347,6 +1423,105 @@ document.getElementById('btn-ai-copy').addEventListener('click',()=>{
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// ═══════════════════ KPI MODAL ═══════════════════
|
||||||
|
let modalCharts = [];
|
||||||
|
|
||||||
|
function openKpiModal(kpiId) {
|
||||||
|
const kpi = KPI_CONFIG.find(k=>k.id===kpiId);
|
||||||
|
const detail = KPI_DETAIL[kpiId];
|
||||||
|
const last = AppState.snapshots[AppState.snapshots.length-1];
|
||||||
|
const val = last[kpi.field];
|
||||||
|
|
||||||
|
document.getElementById('modal-title').innerHTML = `${kpi.icon} ${kpi.name}`;
|
||||||
|
document.getElementById('modal-info').innerHTML = detail.description;
|
||||||
|
document.getElementById('modal-formula').innerHTML =
|
||||||
|
`${detail.formula} = <span class="formula-val">${fmtPct(val)}</span>`;
|
||||||
|
const linkEl = document.getElementById('modal-link');
|
||||||
|
linkEl.href = detail.qlik;
|
||||||
|
linkEl.style.display = detail.qlik ? 'inline-flex' : 'none';
|
||||||
|
|
||||||
|
document.getElementById('kpi-modal-overlay').classList.add('active');
|
||||||
|
document.body.style.overflow = 'hidden';
|
||||||
|
|
||||||
|
// Render charts after modal is visible
|
||||||
|
setTimeout(() => renderModalCharts(kpiId, detail), 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
function closeKpiModal(e) {
|
||||||
|
if (e && e.target !== document.getElementById('kpi-modal-overlay')) return;
|
||||||
|
document.getElementById('kpi-modal-overlay').classList.remove('active');
|
||||||
|
document.body.style.overflow = '';
|
||||||
|
modalCharts.forEach(c => c.destroy());
|
||||||
|
modalCharts = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
function getMauMaxPerMonth() {
|
||||||
|
return AppState.snapshots.map((s, i) => {
|
||||||
|
const pid = s.report_period_id;
|
||||||
|
const days = AppState.dailySeries[pid] || [];
|
||||||
|
if (days.length === 0) return s.mau_daily;
|
||||||
|
return Math.max(...days.map(d => d.mau_daily));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderModalCharts(kpiId, detail) {
|
||||||
|
modalCharts.forEach(c => c.destroy());
|
||||||
|
modalCharts = [];
|
||||||
|
const labels = AppState.snapshots.map(s => periodLabel(s.report_period_id));
|
||||||
|
const colors = ['#0052CC', '#F59E0B'];
|
||||||
|
|
||||||
|
detail.charts.forEach((ch, idx) => {
|
||||||
|
let data;
|
||||||
|
if (ch.field === 'mau_max') {
|
||||||
|
data = getMauMaxPerMonth();
|
||||||
|
} else {
|
||||||
|
data = AppState.snapshots.map(s => s[ch.field]);
|
||||||
|
}
|
||||||
|
const canvasId = `modal-chart${idx+1}`;
|
||||||
|
|
||||||
|
document.getElementById(`modal-chart${idx+1}-label`).textContent = ch.label;
|
||||||
|
|
||||||
|
const dataset = {
|
||||||
|
label: ch.label,
|
||||||
|
data,
|
||||||
|
backgroundColor: colors[idx]+'20',
|
||||||
|
borderColor: colors[idx],
|
||||||
|
borderWidth: 2,
|
||||||
|
pointRadius: 4,
|
||||||
|
pointBackgroundColor: colors[idx],
|
||||||
|
tension: 0.3,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (ch.isPct) {
|
||||||
|
dataset.data = data.map(v => v !== null ? +(v*100).toFixed(2) : null);
|
||||||
|
}
|
||||||
|
|
||||||
|
const yOpts = {};
|
||||||
|
if (ch.isMoney) {
|
||||||
|
yOpts.ticks = {callback: v => fmtMoney(v)};
|
||||||
|
} else if (ch.isPct) {
|
||||||
|
yOpts.ticks = {callback: v => v+'%'};
|
||||||
|
} else if (data.some(v => v > 10000)) {
|
||||||
|
yOpts.ticks = {callback: v => fmtInt(v)};
|
||||||
|
}
|
||||||
|
|
||||||
|
const ctx = document.getElementById(canvasId).getContext('2d');
|
||||||
|
const chart = new Chart(ctx, {
|
||||||
|
type: 'line',
|
||||||
|
data: {labels, datasets: [dataset]},
|
||||||
|
options: {
|
||||||
|
responsive: true, maintainAspectRatio: false,
|
||||||
|
plugins: {legend: {display: false}},
|
||||||
|
scales: {
|
||||||
|
y: {...yOpts, beginAtZero: false},
|
||||||
|
x: {ticks: {font: {size: 10}}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
modalCharts.push(chart);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// ═══════════════════ LOGIN ═══════════════════
|
// ═══════════════════ LOGIN ═══════════════════
|
||||||
const LOGIN_PASSWORD = 'KTdash1';
|
const LOGIN_PASSWORD = 'KTdash1';
|
||||||
|
|
||||||
|
|||||||
116
updater/README.md
Normal file
116
updater/README.md
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
# KPI Updater — ежедневное обновление CSV из Impala
|
||||||
|
|
||||||
|
Скрипт запускается на рабочем компьютере с доступом к корпоративной сети (VPN):
|
||||||
|
выгружает свежие KPI из Impala, перезаписывает `../drb_iliyas_kpi_2026.csv`
|
||||||
|
и пушит его в ветку `pages`. Сайт ([Gitea Pages]) при открытии делает
|
||||||
|
`fetch('drb_iliyas_kpi_2026.csv')`, поэтому из внешней сети видны свежие данные.
|
||||||
|
|
||||||
|
```
|
||||||
|
updater/
|
||||||
|
├─ update_kpi.py # основной скрипт
|
||||||
|
├─ requirements.txt # зависимости (impyla и пр.)
|
||||||
|
├─ config.example.yaml # шаблон конфига -> скопировать в config.yaml
|
||||||
|
├─ run_update.bat # обёртка для Планировщика задач
|
||||||
|
└─ update.log # лог (создаётся при запуске, в git не коммитится)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Установка (один раз)
|
||||||
|
|
||||||
|
> ⚠️ **Версия Python.** `impyla`/`thrift`/`thrift-sasl` стабильно ставятся на
|
||||||
|
> **Python 3.10–3.12**. На системном Python 3.14 колёс может не быть и сборка
|
||||||
|
> упадёт. Установите отдельный Python 3.12 и создавайте venv именно им.
|
||||||
|
|
||||||
|
В папке `updater/`:
|
||||||
|
|
||||||
|
```bat
|
||||||
|
REM создать виртуальное окружение (укажите путь к python 3.12, если нужно)
|
||||||
|
python -m venv venv
|
||||||
|
venv\Scripts\activate
|
||||||
|
|
||||||
|
pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
Создать конфиг и заполнить логин/пароль Impala + git-токен:
|
||||||
|
|
||||||
|
```bat
|
||||||
|
copy config.example.yaml config.yaml
|
||||||
|
notepad config.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
`config.yaml` уже в `.gitignore` — он **не попадёт в git**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Аутентификация для пуша
|
||||||
|
|
||||||
|
Пуш по расписанию должен идти без ручного ввода пароля. Два варианта:
|
||||||
|
|
||||||
|
**A. Токен (рекомендуется).**
|
||||||
|
В Gitea: *Settings → Applications → Generate New Token*, право
|
||||||
|
`write:repository`. Вставьте его в `config.yaml` → `git.token`.
|
||||||
|
Скрипт использует токен только в команде пуша, в git-конфиг он не сохраняется,
|
||||||
|
а в логах маскируется.
|
||||||
|
|
||||||
|
**B. Git Credential Manager.**
|
||||||
|
Оставьте `git.token` пустым и один раз выполните вручную
|
||||||
|
`git push origin pages`, сохранив логин/пароль в системном хранилище Windows.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Проверка вручную
|
||||||
|
|
||||||
|
Подключитесь к VPN, затем:
|
||||||
|
|
||||||
|
```bat
|
||||||
|
cd /d "путь\к\kpi-dashboard\updater"
|
||||||
|
run_update.bat
|
||||||
|
```
|
||||||
|
|
||||||
|
Ожидаемо: в `update.log` появятся строки подключения, число строк, и при
|
||||||
|
изменении данных — коммит и `Пуш выполнен успешно`. Если данные не менялись —
|
||||||
|
`Данные не изменились`, коммита не будет.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Расписание (раз в сутки)
|
||||||
|
|
||||||
|
Создать задачу в Планировщике Windows (запуск каждый день в 06:30).
|
||||||
|
Выполнить **в PowerShell от администратора**, поправив путь:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$bat = "C:\Users\1\Desktop\QC\Vibecode\Project 1\kpi-dashboard\updater\run_update.bat"
|
||||||
|
schtasks /Create /TN "KPI Dashboard Update" /TR "`"$bat`"" /SC DAILY /ST 06:30 /RL LIMITED /F
|
||||||
|
```
|
||||||
|
|
||||||
|
Проверить / запустить вручную / удалить:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
schtasks /Query /TN "KPI Dashboard Update" /V /FO LIST
|
||||||
|
schtasks /Run /TN "KPI Dashboard Update"
|
||||||
|
schtasks /Delete /TN "KPI Dashboard Update" /F
|
||||||
|
```
|
||||||
|
|
||||||
|
> Задача выполнится, только когда компьютер включён и (для успешной выгрузки)
|
||||||
|
> поднят VPN. Если в момент запуска VPN не подключён, скрипт залогирует ошибку
|
||||||
|
> подключения и завершится с ненулевым кодом — данные останутся прежними.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Логика скрипта (кратко)
|
||||||
|
|
||||||
|
1. Читает `config.yaml`.
|
||||||
|
2. Применяет SSL monkey-patch (старые cipher suites сервера, см. `../Impala_connection.md`).
|
||||||
|
3. Подключается к `host`, при ошибке — к `fallback_host`.
|
||||||
|
4. Выполняет SQL (зашит в `update_kpi.py`, константа `SQL_QUERY`).
|
||||||
|
5. Формирует CSV **в точном формате исходника**: разделитель `;`, строки в
|
||||||
|
кавычках, точка как десятичный разделитель, CRLF, сортировка по убыванию
|
||||||
|
`report_period_id`, затем `entry_date`.
|
||||||
|
6. Если содержимое не изменилось — выходит без коммита.
|
||||||
|
7. Иначе: `git add` только CSV → commit → `fetch + rebase + push` в `pages`
|
||||||
|
(с авто-rebase и повтором, т.к. веб-приложение тоже пушит `ai-cache.json`).
|
||||||
|
|
||||||
|
Пустой результат запроса (0 строк) НЕ перезаписывает CSV — защита от стирания данных.
|
||||||
|
|
||||||
|
[Gitea Pages]: https://git.vibe42.kz/kyrykbaev/kpi-dashboard/src/branch/pages
|
||||||
21
updater/config.example.yaml
Normal file
21
updater/config.example.yaml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# Скопируйте этот файл в config.yaml и заполните реальными значениями.
|
||||||
|
# config.yaml в git НЕ коммитится (см. .gitignore).
|
||||||
|
|
||||||
|
impala:
|
||||||
|
host: bdas-worker-08.bdpak.telecom.kz # основной хост
|
||||||
|
fallback_host: bdas-utility-01.bdpak.telecom.kz # резервный хост (можно убрать)
|
||||||
|
port: 21050
|
||||||
|
database: drb
|
||||||
|
user: "ВАШ_ЛОГИН"
|
||||||
|
password: "ВАШ_ПАРОЛЬ"
|
||||||
|
timeout: 60
|
||||||
|
|
||||||
|
git:
|
||||||
|
remote: origin
|
||||||
|
branch: pages
|
||||||
|
# Personal Access Token из Gitea (Settings -> Applications -> Generate Token,
|
||||||
|
# право write:repository). Нужен для НЕинтерактивного пуша по расписанию.
|
||||||
|
# Если оставить пустым, пуш пойдёт через системный Git Credential Manager
|
||||||
|
# (нужно один раз вручную выполнить git push и сохранить логин/пароль).
|
||||||
|
username: "kyrykbaev"
|
||||||
|
token: ""
|
||||||
5
updater/requirements.txt
Normal file
5
updater/requirements.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
impyla==0.19.0
|
||||||
|
thrift==0.16.0
|
||||||
|
thrift-sasl==0.4.3
|
||||||
|
pure-sasl>=0.6.2
|
||||||
|
PyYAML>=6.0
|
||||||
28
updater/run_update.bat
Normal file
28
updater/run_update.bat
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
@echo off
|
||||||
|
REM ─────────────────────────────────────────────────────────────
|
||||||
|
REM Запуск ежедневного обновления KPI.
|
||||||
|
REM Этот .bat вызывается Планировщиком задач Windows раз в сутки.
|
||||||
|
REM ─────────────────────────────────────────────────────────────
|
||||||
|
setlocal
|
||||||
|
cd /d "%~dp0"
|
||||||
|
|
||||||
|
REM Активируем venv, если он есть; иначе используем системный python.
|
||||||
|
if exist "venv\Scripts\python.exe" (
|
||||||
|
set "PYEXE=venv\Scripts\python.exe"
|
||||||
|
) else (
|
||||||
|
set "PYEXE=python"
|
||||||
|
)
|
||||||
|
|
||||||
|
REM 1) KPI dashboard (drb_iliyas_kpi_2026.csv)
|
||||||
|
"%PYEXE%" "%~dp0update_kpi.py"
|
||||||
|
set "RC_KPI=%ERRORLEVEL%"
|
||||||
|
|
||||||
|
REM 2) Метрики МП (app_stats/app_metrics.json)
|
||||||
|
"%PYEXE%" "%~dp0update_app_metrics.py"
|
||||||
|
set "RC_APP=%ERRORLEVEL%"
|
||||||
|
|
||||||
|
echo KPI exit code: %RC_KPI% App-metrics exit code: %RC_APP%
|
||||||
|
|
||||||
|
REM Ненулевой код, если упал хотя бы один
|
||||||
|
set /a RC=%RC_KPI%+%RC_APP%
|
||||||
|
exit /b %RC%
|
||||||
421
updater/update_app_metrics.py
Normal file
421
updater/update_app_metrics.py
Normal file
@ -0,0 +1,421 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
Ежедневное обновление статистики «Метрики МП» из Impala.
|
||||||
|
|
||||||
|
Модель данных:
|
||||||
|
• Грузим помесячно (группировка по report_period_id = YYYYmm), начиная с января
|
||||||
|
прошлого года и до текущего месяца текущего года.
|
||||||
|
• Текущий (незавершённый) месяц обрезаем по entry_date до ВЧЕРАШНЕГО дня —
|
||||||
|
симметрично для обоих лет (например, на 16 июня берём данные по 15 июня
|
||||||
|
включительно и в 2026, и в 2025), чтобы сравнение было «равный период».
|
||||||
|
• Внутри каждого года считаем нарастающий итог (кумулятив) по месяцам; на старте
|
||||||
|
нового года накопление сбрасывается.
|
||||||
|
• Сравнение в карточке = кумулятив-на-дату текущего года vs прошлого года.
|
||||||
|
|
||||||
|
Результат пишется в ../app_stats/app_metrics.json и пушится в ветку pages.
|
||||||
|
Подключение к Impala, конфиг и git-push переиспользуются из update_kpi.py.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import json
|
||||||
|
import datetime as dt
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import update_kpi as base # общие функции: load_config, connect_impala, git_commit_push, ...
|
||||||
|
|
||||||
|
log = base.log
|
||||||
|
REPO_DIR = base.REPO_DIR
|
||||||
|
OUT_PATH = REPO_DIR / "app_stats" / "app_metrics.json"
|
||||||
|
OUT_REL = "app_stats/app_metrics.json"
|
||||||
|
|
||||||
|
# ─── Метрики: ключ в SQL → человекочитаемое название (в порядке SELECT) ───
|
||||||
|
METRICS = [
|
||||||
|
("my_services", "Мои услуги"),
|
||||||
|
("traffic", "Детализация трафика"),
|
||||||
|
("payments", "Платежи"),
|
||||||
|
("orders", "Заявки"),
|
||||||
|
("loyalty", "Лояльность"),
|
||||||
|
("pay", "Оплата"),
|
||||||
|
("billing_detail", "Детали счета"),
|
||||||
|
("viktorina", "Викторина KT Club"),
|
||||||
|
("partners", "Акции партнеров"),
|
||||||
|
("tv_plus", "TV+"),
|
||||||
|
("boosters", "Бустеры"),
|
||||||
|
("roaming", "Роуминг"),
|
||||||
|
("pereoform", "Переоформление"),
|
||||||
|
("aitu_music", "Aitu Music"),
|
||||||
|
("online_booking", "Онлайн очередь"),
|
||||||
|
("my_docs", "Мои документы"),
|
||||||
|
("dz_statement", "Справка о ДЗ"),
|
||||||
|
("new_boosters_roaming_kcell", "Новая линейка бустеров и роумингов Кселл"),
|
||||||
|
("adsl", "ADSL отключение услуги"),
|
||||||
|
("law_and_order", "Закон и порядок"),
|
||||||
|
("acs", "ACS"),
|
||||||
|
("kaspi_freedom_pay", "Прием платежей через Freedom и Kaspi"),
|
||||||
|
("csat", "CSAT"),
|
||||||
|
("multicustomer", "Мультикастомер"),
|
||||||
|
("tv_plus_setup", "Настройка TV+"),
|
||||||
|
("static_ip", "Статический IP"),
|
||||||
|
("turbo_button", "Turbo кнопка"),
|
||||||
|
("real_estate_docs", "Справка о недвижимости"),
|
||||||
|
]
|
||||||
|
METRIC_KEYS = [k for k, _ in METRICS]
|
||||||
|
|
||||||
|
_MONTHS_RU_GEN = ["", "января", "февраля", "марта", "апреля", "мая", "июня",
|
||||||
|
"июля", "августа", "сентября", "октября", "ноября", "декабря"]
|
||||||
|
_MONTHS_RU_SHORT = ["", "Янв", "Фев", "Мар", "Апр", "Май", "Июн",
|
||||||
|
"Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"]
|
||||||
|
|
||||||
|
|
||||||
|
def date_bounds(today: dt.date | None = None):
|
||||||
|
"""Границы выборки. Текущий месяц обрезается по вчерашнему дню (симметрично по годам)."""
|
||||||
|
today = today or dt.date.today()
|
||||||
|
end_cur = today - dt.timedelta(days=1) # вчера
|
||||||
|
cur_year = today.year
|
||||||
|
prev_year = cur_year - 1
|
||||||
|
cap_month, cap_day = end_cur.month, end_cur.day
|
||||||
|
|
||||||
|
start_cur = dt.date(cur_year, 1, 1)
|
||||||
|
start_prev = dt.date(prev_year, 1, 1)
|
||||||
|
try:
|
||||||
|
end_prev = dt.date(prev_year, cap_month, cap_day)
|
||||||
|
except ValueError: # 29 февраля в невисокосный год
|
||||||
|
end_prev = dt.date(prev_year, cap_month, 28)
|
||||||
|
return {
|
||||||
|
"cur_year": cur_year, "prev_year": prev_year,
|
||||||
|
"cap_month": cap_month, "cap_day": cap_day,
|
||||||
|
"start_cur": start_cur, "end_cur": end_cur,
|
||||||
|
"start_prev": start_prev, "end_prev": end_prev,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def build_sql(b: dict) -> str:
|
||||||
|
# created_at — timestamp, поэтому верхнюю границу берём как «< следующий день»
|
||||||
|
cur_end_excl = b["end_cur"] + dt.timedelta(days=1)
|
||||||
|
prev_end_excl = b["end_prev"] + dt.timedelta(days=1)
|
||||||
|
return f"""
|
||||||
|
with t as (
|
||||||
|
select report_period_id,
|
||||||
|
count(case when event_type = 'OPENWSCREENMYSERVICES' then 1 end) as my_services,
|
||||||
|
count(case when event_type = 'OPENWINDOWDETALIZTION' then 1 end) as traffic,
|
||||||
|
count(case when event_type = 'OPENWINDOWPAYMENT' then 1 end) as payments,
|
||||||
|
count(case when event_type = 'OPENSCREENAPPEALS' then 1 end) as orders,
|
||||||
|
count(case when event_type in ('banner_auth', 'banner_unauth', 'loyalty_banner_slider_auth', 'loyalty_banner_slider_unauth', 'get_bonus_opened', 'bonus_opened','promo_partners_opened','company_promo_opened') then 1 end) as loyalty,
|
||||||
|
count(case when event_type = 'WINDOWPAYMENT' then 1 end) as pay,
|
||||||
|
count(case when event_type = 'OPENWINDOWBILLING' then 1 end) as billing_detail,
|
||||||
|
count(case when event_type = 'game_page' then 1 end) as viktorina,
|
||||||
|
count(case when event_type = 'promo_partners_opened' then 1 end) as partners,
|
||||||
|
count(case when event_type = 'OPENWINDOWTVPLUS' then 1 end) as tv_plus,
|
||||||
|
count(case when event_type = 'MOBCONNECTIONOPENWINDOWADDITIONALTRAFFIC' then 1 end) as boosters,
|
||||||
|
count(case when event_type = 'OPENWINDOWROAMING' then 1 end) as roaming,
|
||||||
|
count(case when event_type = 'reregistration_comm_start' then 1 end) as pereoform,
|
||||||
|
count(case when event_type = 'aitu_music_banner_clicked' then 1 end) as aitu_music,
|
||||||
|
count(case when event_type = 'ONLINE_BOOKING_SERVICES' then 1 end) as online_booking,
|
||||||
|
count(case when event_type in ('EMPTYLISTDOCS', 'HASLISTDOCS') then 1 end) as my_docs,
|
||||||
|
count(case when event_type = 'PDFSTATEMENT' then 1 end) as dz_statement,
|
||||||
|
count(case when event_type in ('booster_success_screen_kcell', 'ROAMINGPACKAGEMOBILEKCELL') then 1 end) as new_boosters_roaming_kcell,
|
||||||
|
count(case when event_type = 'law_and_order_service_clicked' then 1 end) as law_and_order,
|
||||||
|
count(case when event_type = 'ACS_DEVICE_SELECTION_OPEN' then 1 end) as acs,
|
||||||
|
count(case when event_type in ('PAYMENTWASSUCCESSFULFREEDOM', 'PAYWITHKASPI') then 1 end) as kaspi_freedom_pay,
|
||||||
|
count(case when event_type = 'csat_screen_sent' then 1 end) as csat,
|
||||||
|
count(case when event_type = 'multicustomer_completed_screen_viewed' then 1 end) as multicustomer,
|
||||||
|
count(case when event_type = 'tv_plus_setup_success_viewed' then 1 end) as tv_plus_setup,
|
||||||
|
count(case when event_type = 'static_ip_connect_success_viewed' then 1 end) as static_ip,
|
||||||
|
count(case when event_type = 'turbo_activation_success_viewed' then 1 end) as turbo_button,
|
||||||
|
count(case when event_type = 'real_estate_docs_screen_shown' then 1 end) as real_estate_docs
|
||||||
|
from drb.drb_iliyas_amplitude_metrics_full
|
||||||
|
where entry_date between '{b['start_cur']:%Y-%m-%d}' and '{b['end_cur']:%Y-%m-%d}'
|
||||||
|
or entry_date between '{b['start_prev']:%Y-%m-%d}' and '{b['end_prev']:%Y-%m-%d}'
|
||||||
|
group by report_period_id
|
||||||
|
)
|
||||||
|
, a as (
|
||||||
|
select (year(created_at) * 100 + month(created_at)) as report_period_id,
|
||||||
|
count(order_id) as adsl
|
||||||
|
from telecomkz.telecomkz_retention_service_prod_tariff_change_validations
|
||||||
|
where (created_at >= '{b['start_cur']:%Y-%m-%d}' and created_at < '{cur_end_excl:%Y-%m-%d}')
|
||||||
|
or (created_at >= '{b['start_prev']:%Y-%m-%d}' and created_at < '{prev_end_excl:%Y-%m-%d}')
|
||||||
|
group by 1
|
||||||
|
)
|
||||||
|
select t.report_period_id, my_services, traffic, payments, orders, loyalty, pay, billing_detail, viktorina, partners, tv_plus, boosters, roaming, pereoform, aitu_music, online_booking, my_docs, dz_statement, new_boosters_roaming_kcell, adsl, law_and_order, acs, kaspi_freedom_pay, csat, multicustomer,
|
||||||
|
tv_plus_setup, static_ip, turbo_button, real_estate_docs
|
||||||
|
from t
|
||||||
|
left join a on t.report_period_id = a.report_period_id
|
||||||
|
order by t.report_period_id
|
||||||
|
""".strip()
|
||||||
|
|
||||||
|
|
||||||
|
# ─── Верхние KPI: регистрации / скачивания / MAU / DAU ───
|
||||||
|
TOP_SQL = """
|
||||||
|
with t as (
|
||||||
|
select report_period_id, entry_date, sum(registered) over (order by entry_date) as registered_total, sum(ios_installs) over (order by entry_date) as ios_installs, sum(android_installs) over (order by entry_date) as android_installs,
|
||||||
|
sum(ios_installs+android_installs) over (order by entry_date) as sum_installs
|
||||||
|
from drb.drb_iliyas_telecomkz_daily_info
|
||||||
|
)
|
||||||
|
, t1 as (
|
||||||
|
select period as report_period_id,
|
||||||
|
cast(date_add(DATE '1970-01-01', entry_date) as date) AS entry_date,
|
||||||
|
dau_wo_none_plat as dau, mau_wo_none_plat as mau
|
||||||
|
from drb.drb_iliyas_telecomkz_mau_stats
|
||||||
|
where cast(date_add(DATE '1970-01-01', entry_date) as date) < cast(now() as date)
|
||||||
|
)
|
||||||
|
select t.report_period_id, t.entry_date, t.registered_total, t.ios_installs, t.android_installs, t.sum_installs, t1.mau, t1.dau
|
||||||
|
from t
|
||||||
|
left join t1 on t.entry_date = t1.entry_date
|
||||||
|
""".strip()
|
||||||
|
|
||||||
|
TOP_TREND_MONTHS = 13 # сколько последних месяцев показывать в месячном тренде
|
||||||
|
TOP_DAILY_DAYS = 540 # сколько последних дней отдавать в дневной график (со скроллом)
|
||||||
|
|
||||||
|
|
||||||
|
def fetch_top(conn):
|
||||||
|
cur = conn.cursor()
|
||||||
|
log.info("Выполнение запроса верхних KPI...")
|
||||||
|
cur.execute(TOP_SQL)
|
||||||
|
rows = cur.fetchall()
|
||||||
|
names = [d[0].lower() for d in cur.description]
|
||||||
|
cur.close()
|
||||||
|
idx = {n: i for i, n in enumerate(names)}
|
||||||
|
|
||||||
|
def g(r, name):
|
||||||
|
v = r[idx[name]] if name in idx else None
|
||||||
|
return v
|
||||||
|
|
||||||
|
recs = []
|
||||||
|
for r in rows:
|
||||||
|
recs.append({
|
||||||
|
"rpid": int(g(r, "report_period_id")) if g(r, "report_period_id") is not None else None,
|
||||||
|
"date": str(g(r, "entry_date")),
|
||||||
|
"registered_total": g(r, "registered_total"),
|
||||||
|
"ios_installs": g(r, "ios_installs"),
|
||||||
|
"android_installs": g(r, "android_installs"),
|
||||||
|
"sum_installs": g(r, "sum_installs"),
|
||||||
|
"mau": g(r, "mau"),
|
||||||
|
"dau": g(r, "dau"),
|
||||||
|
})
|
||||||
|
recs.sort(key=lambda x: x["date"])
|
||||||
|
log.info("Верхние KPI: дней %d, по %s", len(recs), recs[-1]["date"] if recs else "—")
|
||||||
|
return recs
|
||||||
|
|
||||||
|
|
||||||
|
def build_top(recs):
|
||||||
|
if not recs:
|
||||||
|
return None
|
||||||
|
last = recs[-1]
|
||||||
|
|
||||||
|
def _i(v):
|
||||||
|
return int(v) if v is not None else 0
|
||||||
|
|
||||||
|
def last_nonnull(field):
|
||||||
|
for r in reversed(recs):
|
||||||
|
if r[field] is not None:
|
||||||
|
return int(r[field])
|
||||||
|
return 0
|
||||||
|
|
||||||
|
# помесячная агрегация:
|
||||||
|
# registered/installs — month-end (последнее значение нарастающего итога в месяце)
|
||||||
|
# MAU — МАКСИМУМ за месяц; DAU — СРЕДНЕЕ за месяц
|
||||||
|
months = {} # rpid -> aggregate
|
||||||
|
for r in recs:
|
||||||
|
m = months.setdefault(r["rpid"], {
|
||||||
|
"last_date": "", "registered_total": 0, "sum_installs": 0, "ios": 0, "android": 0,
|
||||||
|
"mau_max": 0, "dau_sum": 0, "dau_cnt": 0,
|
||||||
|
})
|
||||||
|
if r["date"] >= m["last_date"]:
|
||||||
|
m["last_date"] = r["date"]
|
||||||
|
m["registered_total"] = _i(r["registered_total"])
|
||||||
|
m["sum_installs"] = _i(r["sum_installs"])
|
||||||
|
m["ios"] = _i(r["ios_installs"])
|
||||||
|
m["android"] = _i(r["android_installs"])
|
||||||
|
if r["mau"] is not None:
|
||||||
|
m["mau_max"] = max(m["mau_max"], int(r["mau"]))
|
||||||
|
if r["dau"] is not None:
|
||||||
|
m["dau_sum"] += int(r["dau"]); m["dau_cnt"] += 1
|
||||||
|
|
||||||
|
ordered = sorted(months)[-TOP_TREND_MONTHS:]
|
||||||
|
labels, reg_s, inst_s, ios_s, andr_s, mau_s, dau_s = [], [], [], [], [], [], []
|
||||||
|
for rpid in ordered:
|
||||||
|
a = months[rpid]
|
||||||
|
y, mo = rpid // 100, rpid % 100
|
||||||
|
labels.append(f"{_MONTHS_RU_SHORT[mo]} {y % 100:02d}")
|
||||||
|
reg_s.append(a["registered_total"])
|
||||||
|
inst_s.append(a["sum_installs"])
|
||||||
|
ios_s.append(a["ios"])
|
||||||
|
andr_s.append(a["android"])
|
||||||
|
mau_s.append(a["mau_max"])
|
||||||
|
dau_s.append(round(a["dau_sum"] / a["dau_cnt"]) if a["dau_cnt"] else 0)
|
||||||
|
|
||||||
|
# MAU в карточке — максимум за текущий (последний) месяц; DAU — последнее дневное значение
|
||||||
|
cur_month_max_mau = months[last["rpid"]]["mau_max"]
|
||||||
|
mau_headline = cur_month_max_mau if cur_month_max_mau else last_nonnull("mau")
|
||||||
|
dau_headline = last_nonnull("dau")
|
||||||
|
|
||||||
|
# дневные ряды (последние N дней) для графика со скроллом
|
||||||
|
daily_recs = recs[-TOP_DAILY_DAYS:]
|
||||||
|
daily = {
|
||||||
|
"labels": [r["date"] for r in daily_recs],
|
||||||
|
"registered": [_i(r["registered_total"]) for r in daily_recs],
|
||||||
|
"installs": [_i(r["sum_installs"]) for r in daily_recs],
|
||||||
|
"installs_ios": [_i(r["ios_installs"]) for r in daily_recs],
|
||||||
|
"installs_android": [_i(r["android_installs"]) for r in daily_recs],
|
||||||
|
"mau": [int(r["mau"]) if r["mau"] is not None else None for r in daily_recs],
|
||||||
|
"dau": [int(r["dau"]) if r["dau"] is not None else None for r in daily_recs],
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
"as_of": last["date"],
|
||||||
|
"registered_total": _i(last["registered_total"]),
|
||||||
|
"installs_total": _i(last["sum_installs"]),
|
||||||
|
"installs_ios": _i(last["ios_installs"]),
|
||||||
|
"installs_android": _i(last["android_installs"]),
|
||||||
|
"mau": mau_headline,
|
||||||
|
"dau": dau_headline,
|
||||||
|
"trend_labels": labels,
|
||||||
|
"registered_series": reg_s,
|
||||||
|
"installs_series": inst_s,
|
||||||
|
"installs_ios_series": ios_s,
|
||||||
|
"installs_android_series": andr_s,
|
||||||
|
"mau_series": mau_s,
|
||||||
|
"dau_series": dau_s,
|
||||||
|
"daily": daily,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def fetch_monthly(conn, sql):
|
||||||
|
cur = conn.cursor()
|
||||||
|
log.info("Выполнение запроса метрик МП (помесячно)...")
|
||||||
|
cur.execute(sql)
|
||||||
|
rows = cur.fetchall()
|
||||||
|
names = [d[0].lower() for d in cur.description]
|
||||||
|
cur.close()
|
||||||
|
idx = {n: i for i, n in enumerate(names)}
|
||||||
|
out = []
|
||||||
|
for r in rows:
|
||||||
|
rec = {"report_period_id": int(r[idx["report_period_id"]])}
|
||||||
|
for key in METRIC_KEYS:
|
||||||
|
v = r[idx[key]] if key in idx else None
|
||||||
|
rec[key] = int(v) if v is not None else 0
|
||||||
|
out.append(rec)
|
||||||
|
log.info("Получено помесячных строк: %d (периоды: %s)",
|
||||||
|
len(out), ", ".join(str(x["report_period_id"]) for x in out))
|
||||||
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
def _cumsum(arr):
|
||||||
|
acc, out = 0, []
|
||||||
|
for v in arr:
|
||||||
|
acc += v
|
||||||
|
out.append(acc)
|
||||||
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
def build_payload(rows, b: dict):
|
||||||
|
cur_year, prev_year, cap_month = b["cur_year"], b["prev_year"], b["cap_month"]
|
||||||
|
months = list(range(1, cap_month + 1))
|
||||||
|
month_labels = [_MONTHS_RU_SHORT[m] for m in months]
|
||||||
|
|
||||||
|
# key -> {year -> [monthly values по месяцам months]}
|
||||||
|
monthly = {k: {cur_year: [0] * len(months), prev_year: [0] * len(months)} for k in METRIC_KEYS}
|
||||||
|
for rec in rows:
|
||||||
|
rpid = rec["report_period_id"]
|
||||||
|
y, m = rpid // 100, rpid % 100
|
||||||
|
if y not in (cur_year, prev_year) or m not in months:
|
||||||
|
continue
|
||||||
|
i = months.index(m)
|
||||||
|
for k in METRIC_KEYS:
|
||||||
|
monthly[k][y][i] = rec[k]
|
||||||
|
|
||||||
|
metrics = []
|
||||||
|
for key, label in METRICS:
|
||||||
|
cur_cum = _cumsum(monthly[key][cur_year])
|
||||||
|
prev_cum = _cumsum(monthly[key][prev_year])
|
||||||
|
cur_v = cur_cum[-1] if cur_cum else 0
|
||||||
|
prev_v = prev_cum[-1] if prev_cum else 0
|
||||||
|
is_new = prev_v == 0
|
||||||
|
growth = None if is_new else (cur_v - prev_v) / prev_v
|
||||||
|
metrics.append({
|
||||||
|
"key": key, "label": label,
|
||||||
|
"cur": cur_v, "prev": prev_v,
|
||||||
|
"growth": growth, "is_new": is_new,
|
||||||
|
"cur_cum": cur_cum, "prev_cum": prev_cum,
|
||||||
|
})
|
||||||
|
|
||||||
|
end_cur = b["end_cur"]
|
||||||
|
period_label = f"с 1 января по {end_cur.day} {_MONTHS_RU_GEN[end_cur.month]}"
|
||||||
|
return {
|
||||||
|
"generated_at": dt.datetime.now().isoformat(timespec="seconds"),
|
||||||
|
"cur_year": cur_year,
|
||||||
|
"prev_year": prev_year,
|
||||||
|
"period_label": period_label,
|
||||||
|
"range": {"start": f"{b['start_cur']:%Y-%m-%d}", "end": f"{end_cur:%Y-%m-%d}"},
|
||||||
|
"months": months,
|
||||||
|
"month_labels": month_labels,
|
||||||
|
"cumulative": True,
|
||||||
|
"metrics": metrics,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def write_if_changed(payload) -> bool:
|
||||||
|
text = json.dumps(payload, ensure_ascii=False, indent=2) + "\n"
|
||||||
|
old = OUT_PATH.read_text(encoding="utf-8") if OUT_PATH.exists() else ""
|
||||||
|
|
||||||
|
def strip_ts(s):
|
||||||
|
try:
|
||||||
|
d = json.loads(s)
|
||||||
|
d.pop("generated_at", None)
|
||||||
|
return json.dumps(d, ensure_ascii=False, sort_keys=True)
|
||||||
|
except Exception:
|
||||||
|
return s
|
||||||
|
|
||||||
|
if strip_ts(old) == strip_ts(text):
|
||||||
|
log.info("Метрики МП не изменились — коммит не требуется.")
|
||||||
|
return False
|
||||||
|
|
||||||
|
OUT_PATH.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
OUT_PATH.write_text(text, encoding="utf-8")
|
||||||
|
log.info("app_metrics.json обновлён (%d метрик, %d мес.).",
|
||||||
|
len(payload["metrics"]), len(payload["months"]))
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> int:
|
||||||
|
log.info("=" * 60)
|
||||||
|
log.info("Старт обновления Метрик МП")
|
||||||
|
cfg = base.load_config()
|
||||||
|
|
||||||
|
b = date_bounds()
|
||||||
|
log.info("Период (тек.): %s..%s | (пред.): %s..%s | месяцев: %d",
|
||||||
|
b["start_cur"], b["end_cur"], b["start_prev"], b["end_prev"], b["cap_month"])
|
||||||
|
sql = build_sql(b)
|
||||||
|
|
||||||
|
base.patch_thrift_ssl()
|
||||||
|
conn = base.connect_impala(cfg)
|
||||||
|
try:
|
||||||
|
rows = fetch_monthly(conn, sql)
|
||||||
|
top = build_top(fetch_top(conn))
|
||||||
|
finally:
|
||||||
|
try:
|
||||||
|
conn.close()
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
cur_year = b["cur_year"]
|
||||||
|
if not any(r["report_period_id"] // 100 == cur_year for r in rows):
|
||||||
|
log.error("В ответе нет данных за %s — JSON НЕ перезаписан.", cur_year)
|
||||||
|
return 1
|
||||||
|
|
||||||
|
payload = build_payload(rows, b)
|
||||||
|
payload["top"] = top
|
||||||
|
if write_if_changed(payload):
|
||||||
|
base.git_commit_push(cfg, [OUT_REL],
|
||||||
|
f"data: update app metrics {dt.date.today():%Y-%m-%d}")
|
||||||
|
log.info("Готово (Метрики МП).")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
try:
|
||||||
|
sys.exit(main())
|
||||||
|
except Exception as e: # noqa: BLE001
|
||||||
|
log.exception("ОШИБКА (Метрики МП): %s", e)
|
||||||
|
sys.exit(1)
|
||||||
315
updater/update_kpi.py
Normal file
315
updater/update_kpi.py
Normal file
@ -0,0 +1,315 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
Ежедневное обновление drb_iliyas_kpi_2026.csv из Impala и пуш в Gitea (ветка pages).
|
||||||
|
|
||||||
|
Что делает скрипт:
|
||||||
|
1. Подключается к корпоративному Impala (см. Impala_connection.md).
|
||||||
|
2. Выполняет SQL-запрос KPI.
|
||||||
|
3. Перезаписывает ../drb_iliyas_kpi_2026.csv в точно том же формате,
|
||||||
|
что и исходный файл (разделитель «;», строки в кавычках, CRLF, точка как
|
||||||
|
десятичный разделитель, сортировка по убыванию периода/даты).
|
||||||
|
4. Если данные изменились — коммитит и пушит CSV в ветку pages.
|
||||||
|
|
||||||
|
Настройки подключения и git-токен берутся из config.yaml (не коммитится).
|
||||||
|
Запускается раз в сутки через Планировщик задач Windows (см. README.md).
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import io
|
||||||
|
import ssl
|
||||||
|
import logging
|
||||||
|
import subprocess
|
||||||
|
from pathlib import Path
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
# ─────────────────────────── Пути ───────────────────────────
|
||||||
|
SCRIPT_DIR = Path(__file__).resolve().parent
|
||||||
|
REPO_DIR = SCRIPT_DIR.parent
|
||||||
|
CSV_PATH = REPO_DIR / "drb_iliyas_kpi_2026.csv"
|
||||||
|
CONFIG_PATH = SCRIPT_DIR / "config.yaml"
|
||||||
|
LOG_PATH = SCRIPT_DIR / "update.log"
|
||||||
|
|
||||||
|
# ──────────────────────── SQL-запрос ────────────────────────
|
||||||
|
SQL_QUERY = """
|
||||||
|
select report_period_id, entry_date, abons, registered_total2 as registered_total,
|
||||||
|
registered_pct2 as registered_pct, mau_daily3 as mau_daily,
|
||||||
|
mau_per_registered3 as mau_per_registered,
|
||||||
|
comms_pct as traditional_comms_pct,
|
||||||
|
comms_pct_prev as prev_yesr_traditional_comms_pct,
|
||||||
|
traditional_comms_pct as traditional_comms_decrease_pct,
|
||||||
|
cumulative_digital_rap_total, cumulative_rap_total, fd_rap_pct,
|
||||||
|
fd_orders, fd_orders_goal, fd_pct as fd_orders_pct,
|
||||||
|
cum_fd_orders, cum_fd_orders_goal, cum_fd_pct as cum_fd_orders_pct
|
||||||
|
from drb.drb_iliyas_kpi_2025
|
||||||
|
where report_period_id > 202600
|
||||||
|
""".strip()
|
||||||
|
|
||||||
|
# ─── Колонки CSV в нужном порядке и их тип для форматирования ───
|
||||||
|
# str → значение в двойных кавычках
|
||||||
|
# int → целое без кавычек
|
||||||
|
# float → число с точкой, полная точность (repr), без кавычек
|
||||||
|
COLUMNS = [
|
||||||
|
("report_period_id", "int"),
|
||||||
|
("entry_date", "str"),
|
||||||
|
("abons", "int"),
|
||||||
|
("registered_total", "int"),
|
||||||
|
("registered_pct", "float"),
|
||||||
|
("mau_daily", "int"),
|
||||||
|
("mau_per_registered", "float"),
|
||||||
|
("traditional_comms_pct", "float"),
|
||||||
|
("prev_yesr_traditional_comms_pct", "float"),
|
||||||
|
("traditional_comms_decrease_pct", "float"),
|
||||||
|
("cumulative_digital_rap_total", "float"),
|
||||||
|
("cumulative_rap_total", "float"),
|
||||||
|
("fd_rap_pct", "float"),
|
||||||
|
("fd_orders", "int"),
|
||||||
|
("fd_orders_goal", "int"),
|
||||||
|
("fd_orders_pct", "float"),
|
||||||
|
("cum_fd_orders", "int"),
|
||||||
|
("cum_fd_orders_goal", "int"),
|
||||||
|
("cum_fd_orders_pct", "float"),
|
||||||
|
]
|
||||||
|
|
||||||
|
# ─────────────────────── Логирование ────────────────────────
|
||||||
|
logging.basicConfig(
|
||||||
|
level=logging.INFO,
|
||||||
|
format="%(asctime)s %(levelname)-7s %(message)s",
|
||||||
|
handlers=[
|
||||||
|
logging.FileHandler(LOG_PATH, encoding="utf-8"),
|
||||||
|
logging.StreamHandler(sys.stdout),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
log = logging.getLogger("kpi-updater")
|
||||||
|
|
||||||
|
|
||||||
|
# ═══════════════════════ Конфигурация ════════════════════════
|
||||||
|
def load_config() -> dict:
|
||||||
|
if not CONFIG_PATH.exists():
|
||||||
|
log.error("Не найден %s. Скопируйте config.example.yaml -> config.yaml и заполните.", CONFIG_PATH)
|
||||||
|
sys.exit(2)
|
||||||
|
with open(CONFIG_PATH, "r", encoding="utf-8") as f:
|
||||||
|
return yaml.safe_load(f)
|
||||||
|
|
||||||
|
|
||||||
|
# ═══════════════════════ SSL monkey-patch ════════════════════
|
||||||
|
def patch_thrift_ssl() -> None:
|
||||||
|
"""Разрешает устаревшие cipher suites сервера Impala (см. Impala_connection.md)."""
|
||||||
|
import thrift.transport.TSSLSocket as _mod
|
||||||
|
|
||||||
|
_orig = _mod.TSSLSocket.__init__
|
||||||
|
|
||||||
|
def _patched(self, *a, **kw):
|
||||||
|
_orig(self, *a, **kw)
|
||||||
|
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
|
||||||
|
ctx.check_hostname = False
|
||||||
|
ctx.verify_mode = ssl.CERT_NONE
|
||||||
|
ctx.set_ciphers("DEFAULT:@SECLEVEL=0")
|
||||||
|
self._context = ctx
|
||||||
|
|
||||||
|
_mod.TSSLSocket.__init__ = _patched
|
||||||
|
|
||||||
|
|
||||||
|
# ═══════════════════════ Impala ══════════════════════════════
|
||||||
|
def connect_impala(cfg: dict):
|
||||||
|
from impala.dbapi import connect
|
||||||
|
|
||||||
|
imp = cfg["impala"]
|
||||||
|
hosts = [imp["host"]]
|
||||||
|
if imp.get("fallback_host"):
|
||||||
|
hosts.append(imp["fallback_host"])
|
||||||
|
|
||||||
|
last_err = None
|
||||||
|
for host in hosts:
|
||||||
|
try:
|
||||||
|
log.info("Подключение к Impala: %s:%s", host, imp.get("port", 21050))
|
||||||
|
conn = connect(
|
||||||
|
host=host,
|
||||||
|
port=int(imp.get("port", 21050)),
|
||||||
|
database=imp.get("database", "drb"),
|
||||||
|
user=imp["user"],
|
||||||
|
password=imp["password"],
|
||||||
|
use_ssl=True,
|
||||||
|
auth_mechanism="PLAIN",
|
||||||
|
timeout=int(imp.get("timeout", 60)),
|
||||||
|
)
|
||||||
|
log.info("Подключение установлено (%s)", host)
|
||||||
|
return conn
|
||||||
|
except Exception as e: # noqa: BLE001
|
||||||
|
last_err = e
|
||||||
|
log.warning("Не удалось подключиться к %s: %s", host, e)
|
||||||
|
|
||||||
|
log.error("Не удалось подключиться ни к одному хосту Impala.")
|
||||||
|
raise last_err
|
||||||
|
|
||||||
|
|
||||||
|
def fetch_rows(conn):
|
||||||
|
cur = conn.cursor()
|
||||||
|
log.info("Выполнение запроса...")
|
||||||
|
cur.execute(SQL_QUERY)
|
||||||
|
rows = cur.fetchall()
|
||||||
|
col_names = [d[0].lower() for d in cur.description]
|
||||||
|
cur.close()
|
||||||
|
log.info("Получено строк: %d", len(rows))
|
||||||
|
# name -> index, чтобы не зависеть от порядка колонок в ответе
|
||||||
|
idx = {name: i for i, name in enumerate(col_names)}
|
||||||
|
missing = [c for c, _ in COLUMNS if c.lower() not in idx]
|
||||||
|
if missing:
|
||||||
|
raise RuntimeError(f"В ответе Impala нет колонок: {missing}")
|
||||||
|
return rows, idx
|
||||||
|
|
||||||
|
|
||||||
|
# ═══════════════════════ Форматирование CSV ══════════════════
|
||||||
|
def _fmt(value, kind: str) -> str:
|
||||||
|
if value is None:
|
||||||
|
return "" # пустое поле без кавычек
|
||||||
|
if kind == "str":
|
||||||
|
return '"' + str(value).replace('"', '""') + '"'
|
||||||
|
if kind == "int":
|
||||||
|
return str(int(value))
|
||||||
|
if kind == "float":
|
||||||
|
return repr(float(value)) # полная точность round-trip, как в исходнике
|
||||||
|
raise ValueError(kind)
|
||||||
|
|
||||||
|
|
||||||
|
def build_csv_text(rows, idx) -> str:
|
||||||
|
# Сортировка: период по убыванию, затем дата по убыванию (как в исходном файле)
|
||||||
|
pid_i = idx["report_period_id"]
|
||||||
|
date_i = idx["entry_date"]
|
||||||
|
rows_sorted = sorted(
|
||||||
|
rows,
|
||||||
|
key=lambda r: (r[pid_i] if r[pid_i] is not None else -1,
|
||||||
|
str(r[date_i]) if r[date_i] is not None else ""),
|
||||||
|
reverse=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
buf = io.StringIO()
|
||||||
|
header = ";".join('"' + name + '"' for name, _ in COLUMNS)
|
||||||
|
buf.write(header + "\r\n")
|
||||||
|
for r in rows_sorted:
|
||||||
|
cells = [_fmt(r[idx[name]], kind) for name, kind in COLUMNS]
|
||||||
|
buf.write(";".join(cells) + "\r\n")
|
||||||
|
return buf.getvalue()
|
||||||
|
|
||||||
|
|
||||||
|
def write_csv_if_changed(text: str) -> bool:
|
||||||
|
old = ""
|
||||||
|
if CSV_PATH.exists():
|
||||||
|
with open(CSV_PATH, "r", encoding="utf-8", newline="") as f:
|
||||||
|
old = f.read()
|
||||||
|
if old == text:
|
||||||
|
log.info("Данные не изменились — запись и коммит не требуются.")
|
||||||
|
return False
|
||||||
|
with open(CSV_PATH, "w", encoding="utf-8", newline="") as f:
|
||||||
|
f.write(text)
|
||||||
|
log.info("CSV перезаписан (%d байт).", len(text.encode("utf-8")))
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
# ═══════════════════════ Git ═════════════════════════════════
|
||||||
|
def _run_git(args, check=True, mask=None):
|
||||||
|
cmd = ["git", "-C", str(REPO_DIR)] + args
|
||||||
|
printable = " ".join(cmd)
|
||||||
|
if mask:
|
||||||
|
printable = printable.replace(mask, "***")
|
||||||
|
log.info("$ %s", printable)
|
||||||
|
res = subprocess.run(cmd, capture_output=True, text=True)
|
||||||
|
out = (res.stdout or "") + (res.stderr or "")
|
||||||
|
if mask:
|
||||||
|
out = out.replace(mask, "***")
|
||||||
|
if out.strip():
|
||||||
|
log.info(out.strip())
|
||||||
|
if check and res.returncode != 0:
|
||||||
|
raise RuntimeError(f"git {' '.join(args)} -> код {res.returncode}")
|
||||||
|
return res.returncode, out
|
||||||
|
|
||||||
|
|
||||||
|
def push_url(cfg: dict, mask_token: str):
|
||||||
|
"""Возвращает URL для fetch/push с токеном (если задан), иначе имя remote 'origin'."""
|
||||||
|
git = cfg.get("git", {}) or {}
|
||||||
|
token = git.get("token")
|
||||||
|
rc, out = _run_git(["remote", "get-url", git.get("remote", "origin")], check=True)
|
||||||
|
url = out.strip().splitlines()[-1].strip()
|
||||||
|
if token:
|
||||||
|
user = git.get("username", "git")
|
||||||
|
# https://host/path -> https://user:token@host/path
|
||||||
|
if url.startswith("https://"):
|
||||||
|
rest = url[len("https://"):]
|
||||||
|
return f"https://{user}:{token}@{rest}"
|
||||||
|
return url
|
||||||
|
|
||||||
|
|
||||||
|
def git_commit_push(cfg: dict, rel_paths, message: str):
|
||||||
|
"""Коммитит указанные файлы (пути относительно корня репо) и пушит в ветку.
|
||||||
|
|
||||||
|
Переиспользуется и для KPI, и для метрик МП. Если изменений нет — выходит молча.
|
||||||
|
"""
|
||||||
|
git = cfg.get("git", {}) or {}
|
||||||
|
branch = git.get("branch", "pages")
|
||||||
|
token = (git.get("token") or "")
|
||||||
|
url = push_url(cfg, token)
|
||||||
|
|
||||||
|
_run_git(["add", "--", *rel_paths])
|
||||||
|
|
||||||
|
rc, out = _run_git(["status", "--porcelain", "--", *rel_paths], check=True)
|
||||||
|
if not out.strip():
|
||||||
|
log.info("Нет изменений (%s) для коммита.", ", ".join(rel_paths))
|
||||||
|
return
|
||||||
|
|
||||||
|
_run_git(["commit", "-m", message])
|
||||||
|
|
||||||
|
# Пуш с автоматическим rebase при гонке (веб-приложение тоже пушит ai-cache.json через API)
|
||||||
|
for attempt in range(1, 4):
|
||||||
|
_run_git(["fetch", url, branch], check=True, mask=token or None)
|
||||||
|
# --autostash: не падать, если в дереве есть посторонние незакоммиченные правки
|
||||||
|
_run_git(["rebase", "--autostash", "FETCH_HEAD"], check=True)
|
||||||
|
rc, out = _run_git(["push", url, f"HEAD:{branch}"], check=False, mask=token or None)
|
||||||
|
if rc == 0:
|
||||||
|
log.info("Пуш выполнен успешно (попытка %d).", attempt)
|
||||||
|
return
|
||||||
|
log.warning("Пуш отклонён (попытка %d), повтор после rebase...", attempt)
|
||||||
|
raise RuntimeError("Не удалось запушить изменения после 3 попыток.")
|
||||||
|
|
||||||
|
|
||||||
|
def commit_and_push(cfg: dict):
|
||||||
|
# Коммитим только CSV — daily-диффы остаются чистыми.
|
||||||
|
git_commit_push(cfg, [CSV_PATH.name], f"data: update KPI {datetime.now():%Y-%m-%d}")
|
||||||
|
|
||||||
|
|
||||||
|
# ═══════════════════════ main ════════════════════════════════
|
||||||
|
def main() -> int:
|
||||||
|
log.info("=" * 60)
|
||||||
|
log.info("Старт обновления KPI")
|
||||||
|
cfg = load_config()
|
||||||
|
|
||||||
|
patch_thrift_ssl()
|
||||||
|
conn = connect_impala(cfg)
|
||||||
|
try:
|
||||||
|
rows, idx = fetch_rows(conn)
|
||||||
|
finally:
|
||||||
|
try:
|
||||||
|
conn.close()
|
||||||
|
except Exception: # noqa: BLE001
|
||||||
|
pass
|
||||||
|
|
||||||
|
if not rows:
|
||||||
|
log.error("Запрос вернул 0 строк — CSV НЕ перезаписан (защита от пустых данных).")
|
||||||
|
return 1
|
||||||
|
|
||||||
|
text = build_csv_text(rows, idx)
|
||||||
|
changed = write_csv_if_changed(text)
|
||||||
|
|
||||||
|
if changed:
|
||||||
|
commit_and_push(cfg)
|
||||||
|
log.info("Готово.")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
try:
|
||||||
|
sys.exit(main())
|
||||||
|
except Exception as e: # noqa: BLE001
|
||||||
|
log.exception("ОШИБКА: %s", e)
|
||||||
|
sys.exit(1)
|
||||||
Loading…
Reference in New Issue
Block a user