Spaces:
Running
Running
Commit History
-
Defaults en toda la app: Spanish La Liga · 26-27 · Racing
HF Space: _default_league_season y el SPA (tabs Reportes por equipo/partido y Equipos y variables) arrancan en Spanish La Liga → 26-27 → Racing de Santander (fallback a Segunda / temporada más nueva si no están). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>0d8f152
-
Descarga de jugadas: columna 'recursos' (por qué está ahí) + orden configurable
- plays.parquet: agrega gol y pv_acumulado (sum de pvAdded, consistente con el resto del repo) - CSV suma columna 'recursos' = flags rec_* que disparó la jugada (ej "Centro raso · Rompe líneas") - nuevo filtro Ordenar por: Todos / Por xG / Por pv / Si tuvo gol / Si tuvo tiro (Ejes y Recursos) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>140dee5
-
Descargar jugadas (CSV) en Ejes y Recursos — Segunda (resto de ligas pendiente)
- Nueva tabla per-secuencia vendor/data/plays/<liga>/<temp>/plays.parquet: partido, local/visitante, equipo/rival, fecha, resultado final del partido, min:seg inicio/fin, cantidad de pases, si tuvo tiro, xG acumulado, tipo de jugada (origen → desenlace, ej "Corner → Gol"), bloque y flags de recurso. Se arma con scripts/build_plays_table.py. - Endpoints /api/plays/ejes (todas las secuencias del equipo) y /api/plays/recursos (filtra por lado/recurso/bloques) que devuelven CSV. plays_data.py + routes_plays.py. - Botones "Descargar jugadas (CSV)" en Ejes (sección 4) y Recursos (sección 5). El 6 no lleva (es a nivel partido). Por ahora solo Segunda tiene datos. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>021b03d
-
Pool de ligas por categoría (Ponderación Ligas) en secciones 2, 3.5, 4, 5, 6
Nueva tabla vendor/data/league_categories.json (categoría→ligas, de la columna Categoria de Ponderación Ligas). El endpoint /api/team-vars/options la expone; el front la ofrece como opción en cada input de pool de ligas: al elegir p.ej. "Ligas TOP" se agregan todas sus ligas (∩ las disponibles en esa sección). En 2/3.5 (pool liga-temporada) expande a todos los pares liga-temporada de esas ligas. Ignora la ponderación numérica por ahora. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>c54a6f2 -
Ejes con pesos + nueva sección 6 "Variables (scatter libre)"
- Reporte 4 (Ejes): cada eje (X/Y) se arma con varios ejes × peso (ej. 1×Elaboración + 3×Aéreo + 2×Individual); el valor es el promedio ponderado de los z-scores. - Nueva sección 6 "Variables (scatter libre)": scatter estilo Recursos pero eligiendo cualquiera de las 225 variables por eje + toggle "más/menos es mejor" (orienta lo bueno arriba/derecha). Escalas abs/z-liga/z-todas, burbuja, marcar equipos. Endpoint nuevo /api/team-vars/scatter. Saques de puerta pasa a sección 7. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>04168cd -
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
-
Recursos: filtro por bloque (bajo/medio/alto), intentos/90 y equipo-temporada-liga
- Extractor y build clasifican cada secuencia de build-up en bajo/medio/alto (phaseLabel + fallback def_h, umbrales 23/37) y guardan sumas crudas por bloque + partidos jugados para el per-90. - API reagrega por los bloques elegidos y recalcula tasas; scatter por equipo-temporada. - Sección renombrada a "Recursos"; "gambeta" -> "1 vs 1". Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>46dd349
-
Equipos y variables: pool por liga-temporada, similitud %, autocompletar variables
- Top equipos: pool por liga-temporada (chips) + selector de N (5/10/20/30). - Similares: mismo pool por liga-temporada; el score ahora es similitud 0-100% (exp(-dist/sqrt(#vars))) en vez de distancia. - Variables: validación al escribir — solo permite variables existentes, autocompleta a la más parecida o limpia con aviso. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>8433548
-
Top equipos: tarjetas colapsables + radar comparativo del top
- Cada equipo del top ahora muestra solo el header; se despliega la tabla al tocar (y se colapsa de nuevo), con chevron. - Radar (mplsoccer) que compara los top-N equipos en las variables elegidas (z-score sobre el pool), un polígono por equipo. Se devuelve en /team-vars/search. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>dc37fa3
-
3.5 similares con pool de ligas y escala de z + marcado automático de equipos del pool
- 3.5: chips de ligas para buscar similares en una selección de ligas (todas sus temporadas) + z_mode: la selección / todas las ligas / cada equipo vs su liga (rol relativo). Compatibilidad intacta con los scopes actuales. - Secciones 4 y 5: 'Sumar y marcar equipo' — los equipos agregados al pool quedan siempre marcados (verde + etiqueta); eliminado el buscador 'Marcar equipo' de la 5 (redundante; el click-para-fijar sigue). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>171687e -
Pool multi-liga + equipos extra + escala de z (secciones 4 y 5)
- Pool: chips de ligas y de equipos sueltos de cualquier liga (ej: Racing y Málaga vs Premier + Serie A); el selector de Liga queda ignorado con pool activo - Escala del z elegible: cada equipo vs su liga / vs todas las ligas / vs la selección (sección 5 suma 'valor absoluto', su default) - Artefacto de ejes con mix_global (variables re-normalizadas globalmente) para las escalas entre ligas; /api/ejes/profiles?league=__all__ (636 equipos) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>1184e04
-
Tablas bloque bajo: diferencia (±x) vs media de liga-temporada + selector de temporada
- Artefacto con columna temporada; medias ponderadas por intentos por liga-temporada - Cada métrica muestra (±x) vs esa media (pv coloreado); columna 'media liga' retirada - Selector de temporada junto a liga y equipo Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>bf4531b
-
Sección 'Recursos bloque bajo': scatter interactivo + tablas por equipo
Scatter con liga (opción todas), ejes configurables (lado of/def × recurso × métrica: pv/jugada, tiros/jugada, xG acum/por jugada/por exitosa, goles, %goles, %éxito, intentos), hover con equipo, click fija etiqueta. Abajo: tablas ofensiva y defensiva por equipo con media de liga. Artefacto vendor/data/lowblock/ (mín 10 intentos por celda en scatter). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>b3df273
-
Reportes de partido para las 28 ligas con ejes (ligas del modelo intactas)
- Selector de partidos = ligas del modelo ∪ ligas con artefactos de ejes; equipos y temporadas de ligas nuevas via /api/ejes/teams (endpoint aditivo, nada existente cambia — verificado contra baseline: /api/leagues?model_only, seasons y teams idénticos). - Gating por reporte: previo/post NN solo ligas del modelo (con aviso); ejes pre/firma para las 28. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>c79fec9
-
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
-
Partidos: no dejar ligas del modelo sin temporadas por la intersección con Azure
La intersección dataset ∩ Azure descartaba ligas cuando el formato de temporada no coincidía (p.ej. Argentina '24'/'25'/'26'), dejando solo Segunda seleccionable en pre/post. Ahora el fallback es POR LIGA: si la intersección queda vacía, se ofrecen las temporadas del dataset igual. La generación resuelve la disponibilidad real. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>51075f2
-
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
-
Perfil de equipo: opciones tickeables para media y mejor de la liga (barras + radar)
Checkboxes "Media de la liga" y "Mejor de su liga" en el panel de perfil: - z-scores (barras): marcan un tick (media) y un diamante ámbar (mejor=máximo de la liga) por variable, además del punto del equipo. Mini-leyenda. - radar (mplsoccer): superpone la media (línea blanca) y el mejor (línea ámbar punteada) de la liga-temporada del equipo como contornos, con leyenda. team_profile devuelve media_liga_(z|valor) y mejor_liga_(z|valor) por variable; radar_png acepta include_mean/include_best; /profile pasa los flags. La media/mejor son de la liga-temporada del equipo, expresadas en el z del pool elegido. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>d5c9126 -
Equipos y variables: nombres lindos del diccionario + selección por tipo
- Diccionario (diccionario_variables.xlsx → vendor/data/var_dict.json vía scripts/build_var_dict.py): mapea columna → nombre legible + tipo. Si una columna no está en el diccionario, se deja su nombre crudo (tipo "Otras"). - Las variables se muestran/buscan por su nombre lindo (datalist por label); el front mapea label→columna al enviar. Resultados de búsqueda/perfil y labels del radar usan el nombre lindo. - Selección rápida por TIPO: botones (Ofensiva, Defensiva, Build-up/Posesión, Balón Parado, Transiciones, Disciplina/Control, Estrategia) que agregan todas las variables de ese tipo, tanto en la búsqueda como en el perfil. - /options ahora devuelve variables [{name,label,tipo}] y types {tipo:[cols]}. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>e672925
-
Equipos y variables: radar (mplsoccer) del perfil + buscador de equipos similares
- Radar: con ≥3 variables, el perfil genera un radar estilo football (mplsoccer, ejes con escala propia = mín/máx del pool) como PNG embebido en la respuesta. - Equipos similares: nueva sección que usa el equipo y variables del perfil y encuentra los más parecidos por DISTANCIA EUCLÍDEA en el espacio de z-scores, con scope "todas las ligas/temporadas" (default) o "su liga-temporada". - team_vars: similar_teams(), radar_png(), _zmatrix(); rutas /similar y radar_b64 en /profile. Frontend: radar + tabla de similares. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>e6c8e11 -
Equipos y variables: panel de perfil de equipo (z-score por variable)
Debajo de la búsqueda, un panel para elegir un equipo (liga+temporada), variables y contra qué comparar (su liga-temporada o todas las ligas/temporadas), que muestra el z-score del equipo en cada variable como gráfico de barras centradas en 0 (banda ±1 sombreada, verde/rojo según signo). - team_vars.teams() + team_vars.team_profile(); rutas /api/team-vars/teams y /profile. - home.html: sección "3. Perfil de un equipo" con selección de equipo/scope/variables (input con datalist) y el gráfico de z en CSS (sin libs extra). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>f0e6f0b
-
Nueva sección "Equipos y variables": buscar equipos por z-score de variables
Sobre team_stats_all_leagues.csv (stats por partido/equipo de Azure), agregado a un perfil por (liga, temporada, equipo) = promedio por partido. El usuario elige variables y dirección (alto/medio/bajo); se calcula un z-score por variable dentro del pool (liga+temporada, mín. 5 partidos) y un puntaje: alto → z ; bajo → -z ; medio → -|z|. Suma por equipo → top 5 con desglose por variable (valor, z, puntaje). - scripts/build_team_stats_agg.py: baja el CSV (~870 MB), filtra estado "90 mins" (total del partido) + dedup por matchid, agrega → vendor/data/team_stats_agg.parquet (3.8 MB, bundleado; regenerable como matches_catalog). - team_vars.py: carga el agregado + scoring; routes_team_vars.py: /api/team-vars/{options,search}. - home.html: tab "Equipos y variables" (selección de variables + dirección + top 5). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>d1858cc
-
Z-score multitag/centros: versión interactiva (Plotly) descargable
Junto al PNG/SVG, cada figura de z-score (triple_multitag y triple_centros) genera un HTML autocontenido con Plotly: al pasar el mouse por un punto muestra el equipo, el valor de la métrica (xG/tiros/acciones) y el z-score. Incluye los puntos de todos los equipos (fondo) y el equipo analizado resaltado. - bundle.FigureArtifact: nuevo campo html_path. - triple_multitag: builders plotly_triple/plotly_centros + _save_plotly_html (include_plotlyjs=True → offline). Falla suave: si no se puede, warning y sigue. - routes_jobs: interactive_url, lookup html, ruta /figure/{name}.interactive.html, y se agrega al ZIP. - schemas.FigureSummary.interactive_url; home.html: link "Interactivo". - pyproject: plotly>=5.18 (el Space lo instala vía pip install -e .). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>b2931bb
-
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 -
Web: 2 pestañas (Reportes por equipo / por partido) + Equipo A = Racing
- Pestaña "Reportes por equipo": Bloques, Multi-Tag, Centros, Recuperaciones. Todas las ligas. Equipo A (default Racing de Santander) + Equipo B opcional (checkbox "comparar"). Filtros desde/hasta/condición (local/visit/todos). 1 equipo -> 2 figuras; 2 equipos -> 4. Gráfico individual por card. - Pestaña "Reportes por partido": previo + post-partido. Solo ligas del modelo. Local + visitante (un partido por liga-temporada). Sin filtros. - Backend: leagues?model_only; generate de equipo soporta away vacío (1 equipo); block_zscore 1 equipo -> 2 figuras; validación team_b solo para pre/post. - Equipo A default = Racing de Santander en ambas pestañas. Versión anterior (página única) preservada en branch ui-pagina-unica. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>2a5b45f -
Todas las ligas Opta en los selectores + default Spanish Segunda
- build_matches_catalog.py: arma un catálogo (liga/temporada/fecha/local/visitante) desde los NOMBRES de los xlsx en Azure (listar es barato, no descarga). Cubre 27 ligas Opta. Bundleado en vendor/data/matches_catalog.parquet (60KB). - web_meta usa el catálogo para ligas/temporadas/equipos/partidos (todas las ligas) y el dataset del modelo solo para el matchId real (post-partido / 9 ligas). - routes_meta: leagues() pone Spanish Segunda Division primero; el resto sale del catálogo ∩ preprocessed disponible -> 26 ligas. Default = SSD 25-26. - Los reportes descriptivos (bloques/multitag/centros/recuperaciones) andan para cualquier liga con preprocessed; post-partido+predicción siguen en las del modelo. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>5012a96 -
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
-
Web: selector de liga/temporada (data completa) + post-partido funcional
- routes_meta dataset-driven: ligas/temporadas/equipos/partidos salen del dataset bundleado, intersecados con lo que tiene preprocessed en Azure ("data completa", auto-configurable). datastore.available_league_seasons() lista Azure. - web_meta.py: provee teams/matches/resolve por liga-temporada desde el bundle (subset ahora incluye is_home para armar home/away). - home.html: dropdowns de liga/temporada que recargan equipos y partidos; card de post-partido funcional (elegís un partido JUGADO -> genera). Solo se ofrecen partidos reales => no se puede generar uno inexistente. - post_match habilitado en el endpoint /run (gateado por NN + match_id requerido); post_match.generate devuelve ReportBundle para verse en la UI moderna. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>5409901
-
Cachear preprocessed en RAM + cartel dinámico de cold/warm
5708b1b -
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