Spaces:
Running
Running
Commit History
13 days ago
-
Pre-partido: 'qué cambia cuando ganan' con 1 partido de cada lado alcanza
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>8f4bc41 -
Pre-partido: 'qué cambia cuando ganan' con pocos partidos
Exigía 3 victorias y 3 derrotas en la temporada pedida; en el arranque de temporada o en una liga nueva casi ningún equipo llega y salía 'Sin suficientes datos W/L'. Ahora compara gana vs no gana / no pierde vs pierde si hace falta, y si ni así alcanza suma la temporada anterior real del equipo (solo para ese gráfico). Si no hay forma, muestra los partidos ganados/empatados/perdidos. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>c3663ca
-
Fallback: reetiquetar el partido completo, no solo el equipo
La 'defensa' y la 'presión recibida' se calculan con las filas de los rivales en los partidos del equipo (df_league filtrado por matchId). Al reetiquetar solo las filas del equipo, esos gráficos quedaban vacíos. Ahora se reetiqueta el partido completo (equipo + rivales de esos partidos) de la temporada anterior. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>df1848f -
Previo: fallback a temporada anterior para equipos con muestra chica
Si un equipo jugó ≤2 partidos en la temporada pedida (típico de un recién ascendido: Racing en La Liga 26-27), sus datos salen de su temporada REAL anterior (Segunda 25-26), en las 3 partes del previo: - táctico (zonas/presión): filas de zone-features de la temp. anterior reetiquetadas a la liga/temp mostrada. - ejes previo: la norma del equipo sale de la temp. anterior; predictor y escala z siguen siendo los de la liga mostrada (mismas unidades de eje). - predicción del modelo (NN + LightGBM de cruce): idem, reetiquetando el historial de modelado / features. Resolver en web_meta.effective_league_season (usa matches_catalog, cuenta partidos jugados, cae a la temp. más reciente < actual, cualquier liga). Umbral 3 partidos. Se aplica solo a previos (no a post-partido). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>5f7844b -
Reportes de partido para cualquier liga/temporada en curso
- runner: resolver team IDs desde el preprocessed cuando el dataset del modelo no cubre la temporada (p.ej. La Liga 26-27, donde juega Racing). - pre_match: si falta historial de modelado (temporada en curso) con NN habilitado, degradar la cancha de predicción a placeholder en vez de romper el previo entero — el previo táctico igual se genera. - ejes previo: normas separadas por localía (local vs visitante). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>e149eb4
-
Reportes de equipo: filtro por condición (ganando/empatando/perdiendo)
Nuevo selector de condición por equipo (junto a local/visitante) que filtra los eventos por `estado equipo` (condición del equipo en posesión) en Bloques, Multi-Tag/Centros y Recuperaciones. Se cablea igual que venue: schema state_a/state_b → routes → runner → cada reporte. El label de cada figura muestra la condición. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>d1dbbf2
-
Ejes de ataque: reportes pre/post partido + scatter equipos + artefactos 28 ligas
- reports/ejes.py: ejes_pre (predicción por eje vs norma, gen propia × concesión rival) y ejes_post (firma del partido: ejes vs norma, esperado-vs-real del modelo, variables que más se movieron) - ejes_data.py: acceso a artefactos (dev dir → bundle vendor/data/ejes → Azure) - API /api/ejes/{options,profiles} + sección 5 'Ejes ataque/defensa' (scatter SVG interactivo) en Equipos y variables - artefactos bundleados: 28 ligas 25-26, modelo global AUC 0.98, validación predictor: acierto direccional 58% (63.8% en flechas grandes) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>a798829
-
Zone-features: etiquetar con la liga/temporada reales (no la constante Segunda)
El build de zone-features seteaba league/season desde las constantes del script (Spanish Segunda Division / 25-26), así que para otras ligas las features quedaban mal etiquetadas y el reporte pro no encontraba a los equipos. patch_helper_paths ahora acepta league/season y sobreescribe gen.LEAGUE/gen.SEASON. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>fd8ce11 -
Pre-match: descargar el preprocessed de Azure (sync) para las zone-features
El pre-match no bajaba el preprocessed (prepare_vendor solo lo hace para post/multitag), así que el rebuild de zone-features fallaba con 'no cacheado'. Ahora usa sync_preprocessed (descarga de Azure si falta), habilitando el pre-match en todas las ligas con preprocessed disponible en Azure. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>52019ff -
Surfacear la causa real cuando falla el pre-partido por zone-features
El rebuild de zone-features se captura (no aborta) y, si el pre-match luego falla, se adjunta la causa (preprocessed no disponible / build fallido) al error en vez del genérico 'No hay datos suficientes'. Para diagnosticar por qué falla en ligas nuevas. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>e55298e
-
Pre/post: reconstruir zone-features del preprocessed para todas las ligas
El head-to-head pro lee team_match_zone_features.parquet, que en el bundle es solo Segunda -> pre-match fallaba para otras ligas ('No hay datos suficientes'). Ahora el runner lo reconstruye del preprocessed antes de generar (una vez), así vale para todas las ligas del modelo. Se quita el rebuild duplicado del post-partido. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>976402e -
IDs de equipo por liga (no solo Segunda) para pre/post-partido
_team_ids ahora combina el JSON de Segunda con el mapa nombre→teamId del dataset del modelo (trae teamId + opponent_team_id), así resuelve equipos de todas las ligas del modelo (p.ej. Boca Juniors). Antes fallaba salvo Segunda. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>aca54bb
-
Post-partido: resolver partidos recientes ausentes del dataset del modelo
El resolve usaba el dataset del modelo (cortado en marzo) y no encontraba partidos posteriores aunque estén en el catálogo (p.ej. Racing vs Almería del 12/04, Racing local). Ahora: - web_meta.matches(): para ligas del modelo suma los partidos del catálogo (cubre hasta la última fecha); esos van sin matchId. - runner + MatchIndex.find_by_teams(): cuando no hay matchId, se resuelve del preprocessed en vivo por local/visitante(+fecha). - Se mantiene el ORDEN (primer equipo local, segundo visitante) que se había roto. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>ebd7ac3
-
Multitag/centros: bloque desde label_after_rules; recuperaciones: ✕ en recuperación
Multitag (triple_multitag.py): - Bloque defensivo por secuencia desde label_after_rules (Opta+modelo+reglas), con fallback a phaseLabel; runner pasa el labeled (require_labeled) y se normalizan sufijos _x/_y del merge. - "Situación tras Error" y "Juego Directo" exigen was_attack (x≥75, tiro o xT≥0.02). - "Build Up Exitoso" = build up/progressive que progresó. - "Presión Alta" mira la posesión rival previa corta (<6s); transiciones excluyen reinicios de ABP; "Transición — Bloque Bajo" solo tras defender en bloque bajo. - "Falta / Set Piece" gateada por fase Set Piece. - Centros: ya no se exige terminar en franja central (solo endX≥83). Recuperaciones (recuperaciones.py): - Marcadores ~30% más chicos. - La ✕ de error se ubica en la recuperación posterior (marco del que recupera), no en el punto del error. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>5b14b74
-
Web: Racing por defecto, condición por equipo y UI de Equipo B más limpia
- loadTeams fija Equipo A en Racing tras $nextTick (antes mostraba el 1º alfabético). - Saca textos: "datos del modelo hasta X", "(solo con modelo)", "Hay un solo partido por liga-temporada". - Equipo B: botón "+ Comparar con otro equipo" + tarjeta con "✕ quitar" (reemplaza el checkbox). - Condición por equipo: cada uno elige Todos/Local/Visitante (venue_a/venue_b). Backend corre el análisis por condición distinta y arma A con la suya y B con la suya en bloques, multi-tag, centros y recuperaciones. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>9056455 -
Filtros (desde-hasta, local/visitante, gráfico individual) en 4 reportes
Bloques, Multi-Tag, Centros y Recuperaciones ahora soportan: - Desde/Hasta (filtro de fecha sobre los eventos). - Local/Visitante (venue): filtra a los partidos del equipo en ese rol; en los z-score, ofensivo usa el venue pedido y defensivo el opuesto (coherente con baseline de liga). - Gráfico individual: picker de figuras por card (display via onlyFigure). Barra de Filtros global en la web (desde/hasta/venue) que aplica a los 4. Backend: routes_reports pasa filters genéricos; runner los propaga; cada generate filtra. _aggregate aplica máscaras por venue (acting_home). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>5f3cff9 -
Nuevo reporte: Recuperaciones (mapa de cancha, of/def)
Reconstruido desde los ejemplos de "Pre partido gráficos" (la doc no especifica el gráfico). Mapa de recuperaciones por ubicación: forma=tipo (BallRecovery/Blocked, Interception, Tackle, Error rival), color=outcome (verde gol / rojo tiro / gris nada), tamaño≈xG. Histograma por banda de X, panel de stats por tipo y Top-10 jugadores (Rec/UltP/Tiro/Gol). 4 figuras (cada equipo of+def), nivel temporada. Franja "Zona de análisis" fija. Registrado en runner/catalogs/routes/datastore + card en la web. Asunciones (tamaño, UltP, x de la franja) a afinar. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>64a7749 -
Separar Centros del Multi-Tag en reportes independientes
triple_multitag vuelve a 4 figuras (solo multitag) y se agrega triple_centros como reporte propio (4 figuras, 2 paneles c/u). Cards separadas en la web, registros en runner/catalogs/routes/datastore. _build_report compartido. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>46cefb3
-
Nuevo reporte: Triple Análisis Multi-Tag (z-scores vs liga)
Reimplementación (desde LOGICA_NEGOCIO_ANALISIS.md §12.4) del gráfico de z-scores multi-tag: por cada categoría táctica (23 tags: transiciones, presión, build-up, centros, profundidad, ABP) muestra 3 métricas — xG, tiros y acciones — vs la distribución de la liga. 4 figuras por partido: cada equipo ofensivo + defensivo. - reports/triple_multitag.py: analizador vectorizado por posesión (~25s liga completa, no minutos) + figura estilo ejemplo + generate() -> ReportBundle. - Registrado en runner/catalogs/routes/datastore(prepare_vendor) + card en home.html. - No requiere NN; usa el preprocessed cacheado en RAM como bloques/post. - Tests del analizador, la figura y el registro. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>10f1622
-
Fix post-partido: orden de descarga + orientación real del partido
- Runner resuelve home/away/fecha vía web_meta.find_match (dataset bundleado), no vía match_index (que leía el preprocessed ANTES de descargarlo -> "No existe preprocessed cacheado"). Además usa el local/visitante REAL del partido. - Frontend: el post-partido busca el partido entre A y B en cualquier orientación (prefiere A=local si se jugó así; si no, usa la orientación real). "No existe" solo si no se jugó ninguna. Arregla casos como Racing vs Almería (se jugó con Almería de local). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>7d5bb88 -
Post-partido: predicción point-in-time + genérico para cualquier liga/temporada
- Predicción as-of: _future_history_features/_build_future_match_row/ _predict_single_team_future aceptan as_of_date y usan SOLO partidos previos a la fecha del partido (arregla el data leakage del post-partido). Verificado contra las predicciones de test guardadas (maxdiff <0.003) en 5 ligas. - build_post_match_report.build_match_section genérico: usa home/away reales y liga/temporada/fecha derivadas del dataset; sin hardcode Racing/Segunda/25-26. - runner + adapter pasan season al post-partido. - E2E validado: Deportivo 0-2 Granada (no-Racing), 7 figuras, sin mención a Racing. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>e54caf0
-
Deploy MVP: API JSON + SPA + bundle/cache de artifacts CORE
Sprint 1 + 2: - API JSON (/api/health, /api/leagues, /api/teams, /api/matches, /api/reports/{type}/{catalog,run}, /api/jobs/{id} + figure/table/html/zip). - ReportBundle: figuras como PNG+SVG y tablas como CSV, individuales. - SPA en / (Tailwind + Alpine, sin build) que consume /api/. - HTML legacy disponible en /legacy. - block_zscore con fallback a phaseLabel cuando no hay labeled CSV en Azure. - pre_match con predicciones NN deshabilitadas (placeholder) cuando los .pt no estan disponibles. Reactivable con RR_ENABLE_NN_PREDICTIONS=1. - post_match deshabilitado en MVP (depende del NN). Reactivable junto al flag. - Artifacts CORE (match_features + team_match_zone_features, ~4 MB) bundleados en vendor/data/ para no requerir upload manual a Azure.e58615a