Skip to content

feat: add high-pace leagues KBL, LNB-DR, BSN, WNBA (2025/2026) - #11

Merged
Manimall merged 2 commits into
mainfrom
feature/high-pace-leagues-integration
Jul 1, 2026
Merged

feat: add high-pace leagues KBL, LNB-DR, BSN, WNBA (2025/2026)#11
Manimall merged 2 commits into
mainfrom
feature/high-pace-leagues-integration

Conversation

@Manimall

@Manimall Manimall commented Jul 1, 2026

Copy link
Copy Markdown
Owner

Что сделано

Добавлены 4 высокотемповые лиги (сезон 2025/2026) в пайплайн сбора + Sofascore-каталог, попутно починена глобальная регрессия скрейпера, собраны данные и проведена честная валидация V6.

1. Новые лиги (collector_config.py + catalog.py)

Лига tournament_name Flashscore slug Sofascore tid / season
KBL (Ю.Корея, муж.) KBL /basketball/south-korea/kbl/ 1540 / 78467 (25/26)
LNB (Доминикана) LNB_DR /basketball/dominican-republic/lnb/ 14089 / 92524 (2026)
BSN (Пуэрто-Рико) BSN /basketball/puerto-rico/bsn/ 17374 / 91302 (2026)
WNBA (США, жен.) WNBA /basketball/usa/wnba/ 486 / 89004 (2026)

TypedDict-паттерн, сезон 25/26 REGULAR. Доминикана — ключ LNB_DR (не затеняет Францию LNB/156). Sofascore-ID добыты через Playwright и подтверждены заказчиком (BSN/WNBA).

2. 🐛 Фикс глобальной регрессии Flashscore

При боевом сборе вскрылось: Flashscore в DOM-рефреше 2026 переименовал узел даты .event__time.event__stageTime. Коллектор доставал пустую дату → match_dt=Noneскипал КАЖДЫЙ матч во ВСЕХ лигах (не только новых). Фикс — селектор .event__stageTime с фолбэком на старый класс. Одна строка, чинит весь скрейпер.

3. Собранные данные (в БД, не в git)

758 матчей, все с Q1–Q4, 100% покрытие реальными линиями (odds-бэкфилл):

Лига Матчей Q1–4 total_line Диапазон дат
KBL 288 288/288 2025-10-03 → 2026-05-13
LNB_DR 108 107/108 2026-04-15 → 2026-06-30
BSN 204 204/204 2026-03-22 → 2026-06-30
WNBA 158 158/158 2026-04-25 → 2026-07-01

KBL-переход года 2025→2026 подтверждён на боевых данных (регресс-тест стережёт).

4. Валидация V6 (Full Time тоталы, honest 80/20 chrono, CI95, порог 0.54)

Лига Тип Test AUC ROI @0.54 CI95 n ставок
KBL зимняя 0.401 −17.1% [−41.3%; +7.1%] 55
WNBA летняя 0.397 −20.3% [−51.0%; +10.3%] 31
BSN летняя 0.550 −0.3% [−28.8%; +28.3%] 40
LNB_DR ⚠️ летняя 0.509 −14.5% [−52.5%; +23.5%] 20

⚠️ LNB_DR форсирован (train=86<100), under-powered. Летним лигам сезонные веса выключены.

Вывод: статзначимого эджа нет ни на одной лиге. Все CI95 накрывают ноль; WNBA/KBL AUC ниже монетки. Дисперсия летнего баскетбола + малый объём (20–55 ставок) не поддаются V6 — та же «стена V6». Чистый отрицательный результат.

Отложено (Вариант C) — поквартальный box-score

Реверс-инжиниринг Sofascore: per-quarter (1Q–4Q) box-score физически есть только у WNBA (fill_rate 100%), у KBL/LNB/BSN — 0% (ALL only). Плюс рынка 1H/1Q O/U у букмекеров не существует. Кросс-стек рефактор четвертей осознанно отложен; box-score остаётся match-level.

Код-ревью по кодексу — пройдено

SOLID/DRY/KISS ✓ · все файлы ≤250 строк (max 241) · строгая типизация (TypedDict) ✓ · без print() ✓ · без магических чисел (внешние ID задокументированы) ✓ · zero hardcode (лиги/слаги/ID в конфигах) ✓ · data models — TypedDict ✓.

Гейт: 192 pytest · go vet + go test OK · mypy 0 (111 файлов) · ruff чисто.

Изменённые файлы (5)

  • collector_config.py, catalog.py — +4 лиги.
  • collector_page.py — фикс селектора даты.
  • tests/test_collector_parse.py — KBL year-crossing.
  • tests/test_league_configs.py — инварианты реестров (новый).

🤖 Generated with Claude Code

Manimall and others added 2 commits July 1, 2026 11:45
Register four new leagues for scraping + Sofascore enrichment:
  - KBL  (South Korea, men)        FS /basketball/south-korea/kbl/        sofa 1540 / s78467
  - LNB_DR (Dominican Republic)    FS /basketball/dominican-republic/lnb/ sofa 14089 / s92524
  - BSN  (Puerto Rico)             FS /basketball/puerto-rico/bsn/        sofa 17374 / s91302
  - WNBA (USA, women)              FS /basketball/usa/wnba/               sofa 486  / s89004

collector_config.py + catalog.py entries follow the existing TypedDict pattern
(season 2025/2026, REGULAR). The Dominican league is keyed LNB_DR to avoid
shadowing France's LNB (tournament 156).

No Go changes needed: mapper.go already returns an error (never panics) on a
missing "ALL" period or incomplete box score, and enrich.go treats that as a
soft skip — regional leagues without Sofascore box score keep their Flashscore
quarter breakdown. Date parsing already handles KBL's 2025→2026 boundary via
full-date parsing + a 540-day look-back.

Tests: KBL year-crossing regression in test_collector_parse; new
test_league_configs locks registry invariants (key/tournament_name match,
no duplicate Sofascore ids, LNB≠LNB_DR). 192 pytest green, go test green,
mypy/ruff clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Flashscore's 2026 DOM refresh renamed the results-row date element, so the
collector scraped an empty time string and skipped EVERY match (match_dt=None)
across ALL leagues, not just the new ones. Select .event__stageTime with a
.event__time fallback. Verified: KBL/LNB_DR/BSN/WNBA collected 758 matches
(0 skips) with full Q1-Q4 breakdown; KBL's 2025->2026 season boundary parses
correctly (2025-10-03 .. 2026-05-13).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@Manimall
Manimall merged commit 7210dff into main Jul 1, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant