Методология
обновлено: апрель 2026Методология kartracers.ru
Единое навигационное дерево методологических документов. Данные обновляются ежедневно в 01:00 MSK через
scripts/data/build_metrics.py.
Что такое KRP
KRP v2 — композитный рейтинг 5 осей радара (скорость, стабильность, результативность, опыт, дисциплина) с байесовским сглаживанием для малоопытных пилотов (C=15).
Подробнее: krp.md
Что такое Дисциплина
Дисциплина — ось скаутинг-радара, показывающая частоту штрафных инцидентов пилота. 100 = ноль нарушений. Пересиды и компенсации не влияют на рейтинг дисциплины.
Полная формула, таблица весов и политика покрытия картодромов: discipline.md
Как часто пересчитывается
Все метрики пересчитываются ежедневно в 01:00 MSK через scripts/data/build_metrics.py.
Источники данных:
- Racemann (АМКС, МИКС, и другие серии)
- KartChrono (31 картодром)
Прокаты, тренировки и арендные заезды исключаются из всех расчётов.
Разделы
- krp.md — KRP v2 (bayesian, C=15) и KRP v2d (diversity bonus)
- krp-v3-per-race.md — Per-race вклад в KRP: 5 осей в раскрывающей панели на карточке пилота (якорь #krp-v3-per-race)
- discipline.md — Ось дисциплины: canonical definition, веса, покрытие картодромов
- scouting-axes.md — 5 осей peer-pool (карточка стинта / venue)
Note: peer-pool axes используют другой scaling (×10, не ×1000). Канонические веса дисциплины — в
discipline.md. - analytics-blocks.md — Блоки аналитики профиля пилота
- manager-rating.md — Рейтинг менеджера (0–5 звёзд, bayesian K=5)
Архитектура источников данных
Racemann / KartChrono
↓
etl.events (penalty_kind classifier)
etl.race_penalty_summary (per-race aggregates)
↓
build_metrics.py (ежедневно 01:00 MSK)
↓
etl.pilot_krp_detail (krp_v2, krp_v2d, discipline, ...)
etl.pilot_metrics (scouting axes)
etl.manager_scouting (manager rating)
↓
Next.js App Router (SELECT only, no runtime computation)
Ось Дисциплина — Канонический источник
Версия: v6 (2026-04-24). Этот файл — единственный источник правды для оси «Дисциплина» в KRP-радаре. Не дублировать формулу в
app/methodology/page.tsxили в других markdown-файлах.
Формула
effective_penalty_sec = Σ_k W_k × penalty_seconds_k
discipline_raw = 100 − (effective_penalty_sec / total_laps) × 1000
discipline = clamp(discipline_raw, 0, 100)
k— вид инцидента (penalty_kind в БД)W_k— вес вида (из таблицы ниже)total_laps— суммарное количество кругов пилота на картодромах сhas_penalty_feed = TRUEclamp(x, 0, 100)— значение ограничено диапазоном [0, 100]
Min-laps guard: если total_laps < 100, дисциплина = NULL (недостаточно данных).
Таблица весов
| event_type (Racemann) | penalty_kind (DB) | weight | rationale |
|---|---|---|---|
ШТРАФ (без ПЕРЕСИД в detail) |
violation |
1.0 | Judge-awarded rule violation (пример: "Грубая езда", "Выезд на красный"). |
ПРЕДУПР |
warn (синтезируется из warn_count × warn_sec_per_event) |
0.3 | Предупреждение — считается, но меньше настоящего нарушения. |
КОМПЕНСАЦИЯ |
compensation |
0.0 | Виртуальный круг вернулся пилоту — не нарушение. |
ШТРАФ с detail ILIKE '%ПЕРЕСИД%' |
strategy |
0.0 | Пересид = командная тактика, не дисциплина пилота. |
Веса хранятся в private.config_discipline_weights и могут быть изменены через SQL UPDATE без деплоя кода.
Почему 0.3 для предупреждений?
- Правило Racemann "три warns = 10 s ШТРАФ" уже конвертирует хронических нарушителей — вес 0.3 добавляет сигнал без двойного счёта.
- Более пологое затухание дисциплины по сравнению с полным нарушением.
- Значение в конфиге — меняется через
SQL UPDATEбез deploy.
Покрытие картодромов
Дисциплина считается только по гонкам на картодромах с has_penalty_feed = TRUE.
| Покрытие | Картодромы | Политика |
|---|---|---|
| > 80 % | miks, v-karting, v-karting-sev |
TRUE |
| 30–80 % | lonato, raceplace, academy, mosrace |
TRUE |
| 5–30 % | extreme39, mayak, karthall, dozari |
TRUE (v6: частичный сигнал информативен) |
| < 5 % | firsanovka, lemans, pitstop_drive и др. |
FALSE |
Если после фильтрации у пилота остаётся total_laps < 100, дисциплина = NULL с UI-меткой «нет данных о штрафах».
Отличие от других осей: нет rescale по перцентилю
Оси скорость, стабильность, результат, опыт рескейлируются по перцентилю платформы (0–100 = процентиль). Дисциплина отображается как абсолютный raw score (0–100), без перцентильного пересчёта.
Обоснование: при per-kind весах raw score сам по себе дифференцирует пилотов. Перцентиль поверх raw сжимает 85 % пилотов в одну точку (57.4 на 2026-04-24), убирая сигнал.
Реализация
- Вычисляется в
scripts/data/metrics/aggregates.pyфункцияcompute_discipline_for_pilot() - Источник данных:
etl.race_penalty_summary(агрегаты per race_id + pilot_id) - Результат записывается в
etl.pilot_krp_detail.discipline - Ребилд:
scripts/data/build_metrics.pyежедневно в 01:00 MSK
Связанные документы
scouting-axes.md— peer-pool axes (карточка стинта), используют другой scaling (× 10, не× 1000)krp.md— формула KRP v2/v2dindex.md— обзор методологии
KRP — Karting Rating Points
Версия: v3 axes + v2 composite + v2d (2026-04-25). Этот файл — единственный источник правды для формулы KRP v2, KRP v2d и подсигналов осей KRP v3 (Speed
kart_pace_delta, Experiencebreadth_premium
- decay τ + learning_rate, Discipline per-category taxonomy).
Что такое KRP
KRP — итоговый рейтинг пилота от 0 до 100. Композитный: агрегирует все 5 осей радара (скорость, стабильность, результативность, опыт, дисциплина) с байесовским сглаживанием для малоопытных пилотов.
Компоненты (5 осей радара)
| Ось | Диапазон | Окно | Что показывает |
|---|---|---|---|
| Скорость | 0–100 | 12 мес. | Перцентиль лучшего/среднего круга vs соперники + handicap по весу + kart-удача ±5 pt (v3) |
| Стабильность | 0–100 | 24 мес. | σ круга как % от best lap |
| Результативность | 0–100 | 12 мес. | Нормализованная позиция (n−pos)/(n−1) · 100 |
| Опыт | 0–100 | всё время + decay τ=24 мес. (v3) | races × 0.37 + karts × 0.21 + class × 0.20 + breadth × 0.12 + learning_rate × 0.10 |
| Дисциплина | 0–100 | всё время | 100 − (per-category штрафы / круги) · 1000 (v3 taxonomy: contact / start_v / technical / other) |
Детали осей — в scouting-axes.md и discipline.md.
KRP v3 — подсигналы осей (раскатано 2026-04-25)
Скорость · kart_pace_delta (±5 pt)
Дополнительный коррекционный нудж к перцентилю Скорости после
phys-handicap. Считается по etl.pilot_car_analysis:
drov_avg— насколько пилот выгрызал результат на медленных картах (slow karts); +0.8 с → +4 pt к Скорости.rocket_avg— выжимал ли пилот преимущество из быстрых картов (rockets); плохой rocket (0.4 с) → −2 pt.- Шкала: clamp(±5 pt). NULL по обоим сигналам → 0 (нет данных).
Применяется только когда rental-share ≥ 0.5 (большинство стинтов на rental-классах).
Для sport-only пилотов (Sport, SuperSport, Rotax, CIK — registry в
scripts/data/metrics/rules.py:ROTATING_CHASSIS_TECH_CLASSES) шасси
выдаётся случайно — peer-pool car-luck семантика ломается, нудж = 0.0.
Хранится в etl.pilot_krp_detail.kart_pace_delta_pts.
Опыт · breadth_premium (12% веса)
Линейная "широта": сколько уникальных картодромов посетил пилот за всё время / всего активных картодромов на платформе (≈ 36 на 2026-04-25).
breadth = min(100, (visited / total) × 100)
НЕ применяется decay — "когда-то побывал" сохраняется навсегда. Хранится в
etl.pilot_krp_detail.breadth_premium_pts.
Опыт · learning_rate (10% веса)
Медианный наклон OLS по первой сессии на каждом новом картодроме (мс/круг). Отрицательный наклон = пилот быстро адаптируется. NULL (нет данных, < 5 первых сессий ≥ 10 кругов; порог поднят с 3 до 5 в Fix C5 §3.E для подавления шумных коротких выборок) → 50 pt нейтрально (не штрафуется за отсутствие данных).
Маппинг в pts: −400 мс/круг (экстремальный фаст-лернер) → 100 pt;
0 мс/круг → 50 pt; +100 мс/круг → 25 pt. Хранится в
etl.pilot_krp_detail.learning_rate_ms_per_lap (raw мс/круг, маппинг в pts
происходит при чтении).
Текущий статус: SQL-helper для first-session laps пока deferred —
learning_rate_ms_per_lap = NULLдля всех пилотов; маппинг возвращает 50 pt нейтрально. Обещано в follow-up отдельным PR.
Опыт · decay τ=24 мес. (заменяет 24m hard cutoff)
В v2 каждый стинт старше 24 месяцев игнорировался полностью. В v3 —
непрерывное затухание вес_гонки = exp(−мес_назад / τ), τ=24 мес. Это
значит:
- Сегодняшняя гонка: вес 1.0
- Гонка год назад: вес ≈ 0.61
- Гонка 24 мес. назад: вес ≈ 0.37 (1/e)
- Гонка 4 года назад: вес ≈ 0.14
Применяется к race_count, kart_count, class_count. Не применяется
к breadth_premium (см. выше). Cap min(1.0, w) per-картодром предотвращает
взрывной рост от пилотов, гонявших 5+ раз на одном картодроме за неделю.
τ tunable per-build через env KRP_V3_EXPERIENCE_DECAY_TAU без deploy кода.
Используемое значение хранится в etl.pilot_krp_detail.experience_decay_tau_months
для аудита.
Калибровочный гейт (§3.6 спеки)
Перед swap новой etl.pilot_krp_detail build_metrics проверяет 13 диагностических
анкеров (Сугробов 98.0, Зейликман 26.3, Титкова 89.2 и т.д. — см.
scripts/data/metrics/aggregates.py:KRP_V3_CALIBRATION_ANCHORS). Если у любого
анкера фактический Experience отклоняется > 20% от предсказанного (по симуляции
§4 спеки) — swap блокируется, build выходит с кодом 75 (retryable), Telegram
алерт на KARTRACERS_TG_ALERT_CHAT_ID. Override: KRP_V3_FORCE_CALIBRATION=1
(LOG + alert + продолжаем swap; используется только владельцем после ручной
проверки).
Дисциплина · per-category taxonomy (v3)
Классификатор scripts/data/metrics/discipline_weights.py:classify_penalty()
раскладывает событие etl.events.detail на категории:
| Категория | Регекс / Override | Вес | Примеры |
|---|---|---|---|
contact |
груб[ао]|опасн|втиск|ударов | 1.0 | "ГРУБАЯ ЕЗДА", "ОПАСНЫЙ ВЫЕЗД" |
start_violation |
флаг|линия|трек лимит | 1.5 | "НЕПОДЧИНЕНИЕ ФЛАГУ", "10с КРАСНЫЙ" |
technical |
сбой|поломк|компенс | 0.3 | "+1кр СБОЙ ОБОРУДОВАНИЯ" |
strategy |
penalty_kind=strategy ИЛИ regex пересид |
0.0 (skipped) | "10с ПЕРЕСИД", "Пересид 10с" |
other |
кноп|две педали|маркер | 0.7 | "10с КНОПКА", "5с Маркер" |
unclassified |
fallback (нет регекс-матча) | 0.7 | новые / неизвестные тексты |
Strategy override (2026-04-30 fix #discipline-peresid-weight-fix): пересиды
(driver swaps в марафонах) — это стратегия, не нарушение. Override в
classify_penalty срабатывает ПЕРЕД основным regex и возвращает категорию
strategy, которая полностью пропускается в PASS 2 compute_krp_detail
(не аккумулируется в pilot_penalty_taxonomy, не учитывается в eff_pen).
Следовательно: пересиды НЕ влияют на discipline и НЕ входят в
pilot_metrics.penalty_count / penalty_rate. См. memory
feedback_penalties_пересиды.md.
Хранится в etl.pilot_penalty_taxonomy.{contact_sec, start_v_sec, technical_sec, other_sec, unclassified_sec} (категория strategy НЕ имеет своих колонок —
полностью skip). Веса в private.config_discipline_weights.w_*
(per-environment override). Полный регекс — в исходниках, последняя версия
покрывает 97.96% событий на проде (3.04% уходит в unclassified, ниже 3%-гейта).
KRP v2 — композитная формула
mean_axes = среднее 5 осей (NULL-оси пропускаются)
μ = медиана mean_axes по всем пилотам (≈ 51 на 2026-04-25)
C = 15 (порог уверенности)
n = количество засчитанных гонок
KRP_v2 = clamp( (n · mean_axes + C · μ) / (n + C), 0, 100 )
n = 0:KRP_v2 = μ(полностью тянется к платформенной медиане)n = 15(= C):KRP_v2 = (mean_axes + μ) / 2n ≥ 50: влияние μ минимально (<5%)- Если все 5 осей NULL (экзотический случай):
KRP_v2 = NULL → хранится как 0
Почему композит. До 2026-04-25 krp_v2 считался только по времени кругов
(перцентили best/avg lap в peer-pool). Это создавало расхождение с радаром:
пилот с сильными осями (результативность, стабильность, опыт) мог получить
низкий krp_v2, если его абсолютное время круга объективно среднее (тяжёлый
класс, женский зачёт, non-sport техника). Новая формула — прямое среднее
всех 5 осей с тем же байесовским сглаживанием (C=15, динамический μ).
KRP v2d — бонус за разнообразие
KRP_v2d = clamp( KRP_v2 · (1 + 0.05 · min(tracks − 1, 4)), 0, 100 )
Максимум +20% за 5+ разных картодромов. Применяется только в контекстных
таблицах чемпионатов; не используется для глобального # ранга (см. ниже).
Роли полей v2 vs v2d в UI
| Место | Поле |
|---|---|
| Карточка пилота (бар, хед) | krp_v2 |
# колонка поиска / списка |
krp_v2 |
| Сортировка /pilots по умолчанию | krp_v2 |
| Live tablo, builder | krp_v2 |
| Контекстные таблицы чемпионатов | krp_v2d |
Почему: использовать krp_v2d для глобального # давало
ping-pong (#190 → #5081 → #4393 в одном результате поиска) — бар показывал
v2, ранг считался по v2d, v2d поднимал пилотов с 5+ картами над пилотами с
одним картом на той же v2. Разрешено в разборе prod-blockers v3.
Реализация
- Функция:
scripts/data/metrics/aggregates.py:compute_krp_composite() - Вызов: после
compute_krp_detail()вscripts/data/build_metrics.py - Запись:
etl.pilot_metrics.krp_v2,etl.pilot_metrics.krp_v2d - Ребилд:
scripts/data/build_metrics.pyежедневно в 01:00 MSK - Снимок перед деплоем:
etl.pilot_metrics_krp_backup_20260425
Что осталось лап-тайм-базовым
Эти поля всё ещё считаются только по времени кругов (legacy v1):
etl.pilot_metrics.krp(старый v1, для диагностики)etl.pilot_metrics.krp_amateur,krp_sport(per-category)etl.pilot_kartodrom_krp.krp(per-kartodrom)etl.pilot_metrics.season_krp(JSON per-season)
Эти поля будут унифицированы в отдельной фазе (tech-debt, backlog anchor
#krp-per-category-per-kartodrom-composite).
Связанные документы
discipline.md— ось дисциплиныscouting-axes.md— 5 осей скаутингаkrp-v3-per-race.md— per-race вклад в KRP (раскрывающая панель карточки пилота)index.md— обзор методологии
Per-race вклад в KRP v3
Версия: PR-B5, май 2026 (
docs/superpowers/specs/2026-05-04-per-race-krp-contribution.md). Этот раздел описывает раскрывающую панель на карточке пилота, которая показывает, как каждая отдельная гонка влияет на 5 осей рейтинга KRP v3 (скорость, стабильность, результативность, опыт, дисциплина).
Раскрывающая панель под каждой строкой результатов показывает, на сколько пунктов
эта конкретная гонка сдвинула пилота относительно его собственного среднего за
последние 24 месяца. Все числа предвычислены в Python (scripts/data/build_metrics.py)
и попадают в браузер уже готовыми — фронтенд только форматирует и красит.
Каждая ось показывает четыре поля:
- Per-race value — измерение в этой гонке (например,
gap_pct = 1.84). - Pilot mean / std — среднее и стандартное отклонение пилота по 24-месячному окну.
- Contribution в баллах — сдвиг от среднего, нормированный на оси.
- Indicator —
up/down/neutral/no-data. Цвет: зелёный / красный / серый / серый. Считается в Python по z-score с порогом ±1σ (см. Пороги «выше/ниже/нейтрально»).
Базовые таблицы данных:
etl.pilot_race_gap_pct,
etl.pilot_form,
etl.pilot_discipline_per_race.
Скорость per-race
Композитная оценка скорости пилота в гонке относительно соперников из этой же гонки.
speed_per_race = 0.20 · best_score
+ 0.20 · best_norm
+ 0.30 · avg_score
+ 0.30 · avg_norm
best_score,avg_score— перцентили лучшего и среднего круга в peer-pool гонки.best_norm,avg_norm— нормализованные(value − min) / (max − min) × 100в той же peer-pool.- Источник:
scripts/data/metrics/aggregates.py:compute_krp_detail, колонкаetl.pilot_form.speed_per_race. - Гонки с менее чем 3 участниками исключаются (peer-pool слишком мал — перцентиль теряет смысл).
- Indicator считаем относительно
pilot_mean/pilot_stdпилота за 24-месячное окно (см. Пороги).
Подробнее про ось «Скорость» в целом — раздел «KRP — Karting Rating Points».
Стабильность per-race
Насколько ровно пилот ехал в этой конкретной гонке. Меньше = стабильнее.
gap_pct = (avg_lap / best_lap − 1) × 100
best_lap— лучший круг пилота в гонке (включая стинты, исключая outliers).avg_lap— средний круг пилота в гонке (по всем кругам стинтов).- Источник:
etl.pilot_race_gap_pct.gap_pct. - Eligibility:
best_lap_ms > 0 AND avg_lap_ms > 0 AND laps >= 10— иначе строка не пишется. - Indicator:
upеслиgap_pct < pilot_mean − pilot_std(стабильнее обычного),downеслиgap_pct > pilot_mean + pilot_std(нестабильнее).
Подробнее про ось «Стабильность» в целом — раздел scouting-axes.md.
Результативность per-race
Нормированная финишная позиция, чтобы 1-е из 30 ценилось выше, чем 1-е из 5.
result_per_race = (total_teams − position) / (total_teams − 1) × 100
total_teams— количество команд (или пилотов в личных гонках) в финишном протоколе.position— финишная позиция пилота.- Источник:
etl.pilot_form.result_per_race. - Гонки с одним участником (
total_teams = 1) →NULL(деление на ноль), indicatorno-data. - Indicator считаем относительно
pilot_mean/pilot_stdза 24-месячное окно.
Это та же формула, что использует основная ось «Результативность», но применённая к одной гонке вместо агрегата за окно.
Опыт-decay per-race
В отличие от других осей, для «Опыта» мы не сравниваем гонку со средним пилота (это функция времени, а не события). Вместо этого мы показываем вес гонки в композите Опыта — насколько эта гонка ещё «считается» при пересчёте оси.
weight = exp(−months_ago / τ) где τ = 24 месяца
months_ago— снимок на моментmetrics_built_at(timestamp ETL-rebuild, одинаковый для всех строк одного пересчёта).τ— характерное время затухания, по умолчанию 24 месяца. Tunable через envKRP_V3_EXPERIENCE_DECAY_TAUбез deploy кода.- Источник:
etl.pilot_form.experience_decay_weight,experience_months_ago.
| Когда была гонка | months_ago | weight |
|---|---|---|
| Сегодня | 0 | 1.00 |
| 6 месяцев назад | 6 | 0.78 |
| 12 месяцев назад | 12 | 0.61 |
| 24 месяца назад | 24 | 0.37 |
| 36 месяцев назад | 36 | 0.22 |
| 4 года назад | 48 | 0.14 |
Свежая гонка имеет вес ≈ 1.0 и полностью учитывается. Гонка двухлетней давности учитывается на ~37%. Эта строка показывается без стрелки-индикатора — здесь нет понятия «выше/ниже среднего».
Подробнее про ось «Опыт» в целом — раздел «KRP — Karting Rating Points».
Дисциплина per-race
Количество секунд штрафа на круг, наложенных именно на этого пилота в этой гонке.
violation_per_lap = violation_sec / laps
violation_sec— сумма «настоящих» штрафов изetl.pilot_discipline_per_race(только penalties с явно указаннымpilot_id, см. ниже).laps— количество кругов пилота в этой гонке.- Источник:
etl.pilot_discipline_per_race.violation_per_lap. - Indicator инвертирован:
up(зелёный) = меньше штрафов, чем обычно;down(красный) = больше.
Категории штрафов и веса (taxonomy contact / start_violation / technical /
other / unclassified) — см. discipline.md. Пересиды в
марафонах — это стратегия, а не штраф; они не входят в violation_sec
(см. memory feedback_penalties_пересиды.md).
Пороги «выше/ниже/нейтрально»
Все индикаторы считаем по z-score относительно собственного среднего пилота за
24-месячное окно (KRP_V3_DECAY_TAU_MONTHS_BASELINE — то же окно, что используется
для decay τ оси «Опыт»).
z = (value − pilot_mean) / pilot_std
| Условие | Indicator | Пример (Стабильность) |
|---|---|---|
z < −1 |
up |
gap_pct < mean − 1σ |
−1 ≤ z ≤ +1 |
neutral |
в пределах ±1σ от mean |
z > +1 |
down |
gap_pct > mean + 1σ |
pilot_std = 0 или N < 3 |
no-data |
недостаточно данных или нулевая дисперсия |
Знак для дисциплины и стабильности инвертирован: для них меньше = лучше,
поэтому value < mean − 1σ означает «лучше обычного» (зелёный up).
Все эти числа precomputed в Python (compute_pilot_mean_std_py) и записаны в
etl.pilot_form.*_pilot_mean / *_pilot_std / *_indicator. Браузер не считает.
Важно: UI-фильтры (чемпионат, возраст, картодром) не пересчитывают среднее — оно зашито в БД на момент ETL и относится ко всему 24-месячному окну гонок пилота. Это сознательный trade-off за zero runtime metrics.
Команда оштрафована за технику — не влияет на пилота
В Racemann штраф можно наложить либо на пилота (pilot_id IS NOT NULL), либо
на команду (pilot_id IS NULL). Технические штрафы (компенсации, нарушения
регламента карта) обычно идут «на команду» — конкретного виновника нет.
etl.pilot_discipline_per_race агрегирует только штрафы с заполненным
pilot_id. Команда могла получить штраф (он попадёт в командную статистику),
но per-race discipline для пилотов этой команды останется чистой:
violation_sec = 0, violation_count = 0.
Это значит, что командные штрафы не отражаются в персональной discipline-row пилота — они видны только в карточке команды.
Связанные документы
krp.md— KRP v3 axes + composite формулы (агрегаты, не per-race).discipline.md— taxonomy штрафов (contact / start_violation / technical / other / unclassified) и веса.scouting-axes.md— peer-pool скейлинг скорости и стабильности.index.md— обзор методологии и полный список разделов.
// EFA — EFFICIENCY FACTOR AMKC
EFA — рейтинг пилота внутри серии АМКС. Показывает, какой процент участников серии пилот опережает по KRP.
// BREAKTHROUGH — ПРОРЫВ
Прорыв (Breakthrough) — среднее количество позиций, которое пилот отыгрывает (или теряет) от стартовой до финишной позиции.
// TREND — ТРЕНД ФОРМЫ
Тренд (Trend) показывает, как меняется KRP пилота за последние гонки. Сравнивается средний KRP за последние 5 гонок с предыдущими 5.
// TEAM EFFICIENCY — ЭФФЕКТИВНОСТЬ КОМАНДЫ
Командная эффективность (Team Efficiency) — метрика, показывающая насколько хорошо команда реализует свой потенциал по результатам гонок.
max — максимально возможные очки, если бы все пилоты команды финишировали первыми.
100% = идеальная реализация, все пилоты на подиуме. 50% = средний результат.
// КЛАССЫ ТЕХНИКИ
На одном картодроме используется разная техника. Сравнение времён между классами некорректно.
Рейтинг Менеджера
Версия: v2 (2026-04-24). Менеджер — стратег пит-стены: выбор машин, тайминг смен, управление пилотами. Рейтинг оценивает результаты команды под управлением менеджера по шкале от 0 до 5 звёзд.
Компоненты рейтинга
| Компонент | Вес | Описание |
|---|---|---|
| Перцентиль позиции | Основа | Финишная позиция команды нормализуется: (pos − 1) / (N − 1). 0 = победа, 1 = последнее место. |
| Вес длительности | √кругов | Длинные гонки весят больше. Вес = √(кругов команды). 200-круговой марафон важнее 30-круговой серии. |
| Bayesian-сглаживание | K = 5 | При малом числе гонок рейтинг тянется к глобальному среднему. Защита от случайного успеха. |
| Уровень доверия | 0–100 % | < 3 гонок = 0 % (нет рейтинга). 3–10 гонок = 70–100 %. 10+ = полное доверие. |
Формула расчёта
Шаг 1. Взвешенное среднее перцентиля
avg = Σ(percentile_i × √laps_i) / Σ√laps_i
Каждая гонка взвешивается корнем из количества кругов команды.
Шаг 2. Байесовское сглаживание
bayesian = (n × avg + K × μ) / (n + K)
n= число гонокK = 5μ= глобальный средний перцентиль всех менеджеров
Шаг 3. Маппинг в звёзды
rating = (1 − bayesian) × 5 × confidence
Меньше перцентиль = лучше результат = больше звёзд.
Уровень доверия (Confidence)
| Гонок | Статус | Confidence |
|---|---|---|
| < 3 | Нет рейтинга | 0 % |
| 3–9 | Предварительный | 70–97 % |
| 10+ | Полный рейтинг | 100 % |
Тренд (динамика)
Сравниваются последние 5 гонок с предыдущими 5.
- Если средний перцентиль улучшился на > 10 % — тренд ↑ (вверх)
- Ухудшился на > 10 % — ↓ (вниз)
- Иначе — стабильно
При менее 10 гонках тренд = «новый» (недостаточно данных).
Что учитывается
- Командные гонки — менеджер учитывается только в гонках с ≥ 2 командами.
- Размер сетки — перцентиль нормализует позицию по количеству участников. 3-е из 12 команд лучше, чем 3-е из 4.
- Количество кругов — длинные марафоны (100+ кругов) весят значительно больше коротких серий.
- Количество гонок — через Bayesian-сглаживание: больше гонок = рейтинг ближе к реальному результату менеджера.
- Количество команд в карьере — отображается в профиле для контекста, но не влияет на рейтинг напрямую.
- Фильтрация — прокаты, тренировки и арендные заезды исключены.
Менеджер-пилот = человек, который и управляет командой, и ездит в ней. Отмечается бейджем «пилот».
Декомпозиция метрик менеджера
Помимо общего рейтинга, каждый менеджер оценивается по трём ключевым параметрам, измеряемым в секундах. Отрицательное значение = менеджер помог команде. Положительное = навредил.
Выбор техники
Для каждой гонки все карты ранжируются по лучшему кругу. Топ-25 % = ракеты, 25–50 % = быстрые, 50–75 % = средние, 75–100 % = медленные. Метрика показывает % стинтов менеджера на ракетах. Дополнительно считается дельта в секундах: (лучший круг выбранного карта − лучший круг медианного карта) × количество кругов на этом карте.
Штраф за кнопку
Штраф (10с, 15с, 20с) за пропуск кнопки на пит-лейне. Прямая ответственность менеджера — он должен напомнить пилоту нажать кнопку по рации. Считается: сумма секунд штрафов за кнопку / количество гонок.
Штраф за пересид
Штраф (10с, 20с, 30с, 40с) за превышение времени стинта. Менеджер засекает время и командует замену. Пересид = менеджер зазевался. Считается: сумма секунд штрафов за пересид / количество гонок.
Итого (влияние менеджера)
итого = карт_секунды + штраф_кнопка + штраф_пересид (сек/гонку)
Положительное значение = менеджер теряет команде секунды. Отрицательное = экономит. При сравнении менеджеров: чем ниже итого, тем лучше.
Стабильность
stability = σ(percentile) = стандартное отклонение перцентиля позиции
| Значение | Интерпретация |
|---|---|
| < 0.20 | Стабильный — результаты предсказуемы |
| 0.20–0.35 | Средний |
| > 0.35 | Нестабильный — разброс: то победа, то последнее место |
Реализация
- Вычисляется в
scripts/data/build_manager_scouting.py - Результат:
etl.manager_scouting.* - Ребилд:
scripts/data/build_metrics.pyежедневно в 01:00 MSK
Связанные документы
// ВСЕ ДОСТИЖЕНИЯ
38 бейджей в 6 категориях. Каждый бейдж можно заработать — выполнив условие.
// ДОСТИЖЕНИЯ
38/38100%





































// ГЛОССАРИЙ МЕТРИК
Полный глоссарий терминов картинга — 60 терминов