Spaces:
Running
Running
Commit History
7 days ago
-
Referencia regenerada con los nombres nuevos (vs/tras, centro área/temprano) Running
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>8d7d08d
11 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
25 days ago
-
Multitag: build-up vuelve a ser solo la definición propia
Se descarta sumar las secuencias con etiqueta 'Build Up against X Block' del proveedor: el modelo de bloques se la pone a toda secuencia de >=3 pases, así que 'Build Up vs Presión Alta' pasaba a ser cualquier jugada contra bloque alto. La etiqueta queda solo para saber qué bloque había. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>80e3236 -
Multitag: build-up = definición propia O etiqueta de build-up del proveedor
Pedido: sumar a la definición propia (primeros 30 m, >=5 pases, llega a campo rival sin longball) las secuencias que el proveedor etiqueta 'Build Up against X Block' (Opta + modelo + herencia de secuencias cortas). Sin pelota parada. Con esto 'Build Up vs Presión Alta' en defensa coincide con 'bloque alto' del reporte de bloques (Osasuna: 8 tiros, 2.61 xG). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>9c1fd75 -
Filtros de localía y marcador invertidos en la parte DEFENSIVA de los reportes
Los filtros miran al equipo que tiene la pelota; en defensa es el rival. El reporte de bloques mostraba en 'X de local, defensa' los goles recibidos de VISITANTE (Osasuna: 4 de 10 en vez de 3 de 3), y 'X ganando' en defensa eran los momentos en que X perdía. Bloques: la defensa recibe sus propios eventos (venue y estado opuestos). Multitag/centros y recuperaciones: el marcador se invierte en defensa (la localía ya estaba bien). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>1ddd05b -
Bloque: heredar solo si recupera en <=5 s (o <=10 s con la altura rival coincidente)
Reemplaza la herencia automática dentro de la posesión. La secuencia sin bloque (no ABP, contragolpe ni recuperación) toma el bloque de la última con bloque del mismo equipo, aunque sea otra posesión (segunda jugada), si empieza <=5 s después o <=10 s con la altura media de la última línea rival en la banda de ese bloque. La Liga 26-27: 106 goles contra bloque. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>f9af9df -
Bloque por secuencia: las secuencias cortas heredan el bloque de la anterior de su posesión
El modelo de bloques solo etiqueta secuencias de >=3 pases y el proveedor corta la secuencia con cualquier toque del rival: el gol tras un rebote quedaba sin bloque. racing_reports/bloques.py corrige phaseLabel al cargar (data_cache) para todos los reportes del Space (bloques, multitag, recuperaciones). La Liga 26-27: 76 -> 93 goles contra bloque. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>3efec69
-
Top equipos: variables por lado, y "Defensa" se fusiona en "Defensiva"
El selector era una fila plana de 23 chips de grupo, con "Defensa" y "Defensiva" compitiendo por el mismo concepto. Ahora: - "Defensa" y "Defensa (rival)" se fusionan en "Defensiva" (21 grupos, era 23). scripts/style_clash/build_clusters.py pasa a usar el nombre nuevo. - var_dict expone `lado` (propia / rival). La regla es el sufijo `_rival` / `_against`, con cuatro excepciones revisadas: recuperaciones_campo_rival, altura_media_recuperacion_campo_rival, su desviación y faltas_a_favor_rival ("Faltas Cometidas"), donde "rival" nombra la mitad de cancha, no al que actúa. Quedan 164 propias y 98 del rival. - El picker son dos desplegables —propias y del rival— con los temas adentro. Los grupos "X (rival)" dejan de ser un grupo aparte: son la cara rival del mismo tema. Heatmap de Top equipos: hasta 50 equipos, scroll libre con encabezado y equipo fijos, y una columna # con la posición en el puntaje general que NO se mueve al ordenar por una variable. clasica.html no cambia: …307ee85
-
Integrar el diccionario de variables del club
El club manda su diccionario con cuatro columnas (Categoría, Categoria_2, Nombre, Nombre Columna). La versión de septiembre nombra las 262 variables de team_stats_agg; la que leíamos hasta ahora tenía 174, y por eso 95 nombres vivían a mano en var_labels_extra.json y 56 variables quedaban sin categoría. - scripts/sync_club_dictionary.py: integra el xlsx y es re-corrible. Agrega, nunca borra: suma las categorías del club a feature_groups.json sin tocar nuestros grupos propios (Centros, Presión, Verticalidad, Rotura de líneas), escribe feature_subgroups.json con el segundo nivel y poda var_labels_extra.json. - 0 variables sin grupo (eran 56) y grupo nuevo Disciplina / Control. Build-up 30→50, Defensiva 42→63, Defensiva–Presión 20→43, Ofensiva–Creación 45→67. - Subcategoría (Categoria_2, 19 valores) como segundo nivel: columna nueva en variables.csv, cuadro por subcategoría en los .md y fila en la ficha de la referencia. - build_var_dict.py lee el xlsx del repo y expone subgrup…31157f4
-
Las features de train, listadas de verdad en cada modelo
Los cuadros de "Features" decían solo "self_* (forma del equipo)". Ahora traen la lista completa, leída de los artefactos reales: - cruce: las 328 de matchup_feat_cols.json, separadas por prefijo — self_ (53), opp_ (157), selfH_ (52) y selfA_ (52) que son el split local/visitante, y 14 de contexto (elo, is_*, form*) - ptiro: las 72 de datasets_variables.json - los dos GNN: leídas del bundle .pt (global_bundle.global_feature_columns) De paso, los .pt traen el summary con los tamaños reales del split, que estaban sin documentar: ataque 8.506/962/1.108 (validación desde el 16-nov-2025, 5 semillas) y peligro 7.395/842/981 (desde el 17-nov-2025). CORRECCIÓN: pv_distribution_gnn NO poda features — usa las 1.069 globales, mientras que el de ataque se queda con 200. Estaba documentado como si compartieran el criterio. Con el mismo dataset (~10.900 filas) eso le deja una proporción features/filas mucho más exigente; queda anotado como candidato a aplicarle la misma poda y medir. Co-Auth…6a437ee -
La referencia muestra la ficha completa, y "?" en todos los reportes
Al tocar el "?" ahora se ve toda la documentación del gráfico o modelo, no solo el resumen: cómo se entrena, con qué datos, qué variables usa, qué devuelve y cuánto le saca al baseline. - gen_referencia.py convierte el .md entero a HTML (headings, tablas, listas, citas, código) y lo embebe como "La ficha completa" de cada sección - "?" también en los reportes por equipo del Space (bloques, multi-tag, centros, recuperaciones), armado desde rep.id - pv_distribution_gnn estaba documentado apenas como "el complemento del otro"; ahora tiene su ficha propia leída del código: arquitectura de grafo sobre las 10 zonas, cabezas gate+delta (aprende la corrección sobre un baseline, no el valor directo), split temporal, estandarización solo sobre train, 260 épocas con early stopping Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>f387940 -
Referencia de la documentación dentro del Space (/referencia)
Suma al Space la misma página de referencia que ya sirve la app de Vercel: qué usa cada gráfico y de dónde sale cada variable, navegable como las apps (app → sección → categoría → variable) y con buscador sobre las 418. - ruta GET /referencia, detrás del mismo candado que / (_password_ok) - el HTML vive en web/templates/ porque es lo único que el Dockerfile copia; lo genera scripts/gen_referencia.py, que ahora escribe las dos copias (webapp-static/site/ para Vercel y templates/ para el Space) - en el home, un "?" al lado de cada sección de Equipos y variables y de cada reporte de partido, que abre /referencia#hf/<seccion> en otra pestaña La página no tiene contenido propio: se genera de las mismas fuentes que los .md y .csv de docs/diccionarios, así que no puede quedar desincronizada. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>aa117d6
-
Limpiar datos rotos de ejes y tracking (outliers falsos tipo Osasuna)
Dos datos rotos hacían que un equipo con muestra chica apareciera como outlier extremo en los gráficos, y de paso aplastaran al resto: - ejes_data: el valor de un eje se calcula sobre n_alto (secuencias). Con muy pocas, explota (|g| hasta 70; visto elaboración=41.7 contra ±0.1 del resto de su liga) o queda acotado pero sin sentido (n_alto=0). Además infla el desvío de la liga y aplasta el z de los demás contra el origen. Se anulan esas celdas (n_alto<3 o |g|>3) y se recomputa el z dentro de (liga, temporada, lado, eje). El z guardado ya era el z-score de g dentro de la liga (corr 0.997), así que recomputarlo es consistente. - team_vars: las métricas de tracking (distancia al centroide, ancho robusto, ancho por posesión, velocidad de progresión, y sus _rival) vienen en 0 cuando no hay datos ópticos. Un 0 es imposible en un partido jugado, así que 0 → NaN. No se tocan conteos ni xG: ahí 0 es válido. La limpieza vive en la librería compartida, así la usan tanto el Spa…c4b9973
-
Centros: agregar 'Alto Recto' (Der/Izq) para centros altos sin comba
Los centros chip sin qualifier de inswinger/outswinger (~4% del total, casi todos pelotazos altos desde la banda al área) no caían en ningún tag → quedaban invisibles en el desglose. Se agregan como grupo 'Alto Recto' (Der/Izq). Cobertura: sin-tag pasó de 375 a 2 (solo 2 rasos de borde). Detalle 18→20, grupos 9→10. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>45ed3e2 -
Multitag: contar tiros al palo + excluir goles en contra explícito
Auditoría de conteos del triple multi-tag. is_shot exigía xg>0, lo que: - dejaba afuera los tiros al palo (ShotOnPost, xG=0 en Opta) → se contaban de menos como tiros (~156 en La Liga 25-26). - tapaba por casualidad los goles en contra (isOwnGoal, xG=0). Ahora is_shot = SHOT_EVENTS & NOT isOwnGoal: suma los tiros al palo y excluye los goles en contra explícito. xG no cambia (palo/gol en contra aportan 0). Penales y demás tags sin cambios. Se agrega isOwnGoal a NEEDED_COLS. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>74fd814 -
Recuperaciones interactivo: histograma/pasillos/Top-10 DENTRO del gráfico
Replica el layout del estático en el Plotly: histograma xG por zona (franjas X) arriba, barras por pasillo a la izquierda, Top-10 jugadores / stats por tipo a la derecha, y leyenda de formas — todo en la misma cancha clickeable (antes quedaban como tablas sueltas abajo). Fix: el click handler ignora puntos sin customdata (leyenda dummy) en vez de romper. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>772234c -
Recuperaciones interactivo: restaurar Top-10 / xG por zona bajo la cancha
La versión interactiva ahora incluye, debajo de la cancha, las mismas tablas del estático: xG por zona (franjas X 40-100) + xG por pasillo (5 corredores), y Top-10 jugadores (ofensivo) o estadísticas por tipo (defensivo). El detalle por click sigue igual. (Último pase estaba OK: solo aplica a recuperaciones que terminan en tiro con pase previo — 88% de los puntos son 'sin tiro'.) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>8e03ab9 -
Recuperaciones: versión interactiva (Plotly) con click → detalle del partido
Cada punto de la cancha ahora es clickeable: abajo aparece partido (rival+fecha), minuto, tipo de acción, jugador que la hizo, equipo, resultado (tiro/gol + xG), tirador y último pase. Se agrega como html_path (igual que multitag), sin tocar el PNG estático. Se cargan matchId/fecha/minuto/equipo/rival por evento (antes se descartaban). Fix: 'nan' → '—' cuando no hay tirador/pase. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>f1c3317 -
Multitag: invertir colores en defensivo (y en tags negativos)
El borde verde/rojo del z-score indicaba 'arriba/abajo de la media' sin tener en cuenta si más es mejor o peor. Ahora: - Paneles DEFENSIVOS: se invierte siempre (z alto = concedés más = rojo). - Tags negativos en ofensivo (NEGATIVE_TAGS, hoy vacío): se invierten. Aplica a matplotlib y plotly, multitag y centros. Neutral (|z|<0.5) sin cambios. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>f4fc4ad -
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
-
Penalty en multitag: contar solo penales ejecutados (tiro) + nota de cobertura en bloques
Multitag (triple_multitag): - El tag Penalty contaba TODO evento con qualifier 'Penalty' (incluía faltas concedidas, penales recibidos y atajadas del arquero) → sobrecontaba (6 vs 4). Ahora cuenta solo el penal EJECUTADO por el equipo (tiro con qualifier Penalty). - Los tiros del penal daban 0 porque el shot_kind 'abp' cuenta tiros DESPUÉS del evento ABP, y el penal ES el tiro (mismo timestamp). Nuevo shot_kind 'pen' cuenta el propio tiro de penal. Getafe La Liga 25-26: acc 4, tiros 4, xG 3.06 (antes 6/0/0). Reporte de bloques (build_block_zscore_report): - Nota de cobertura: goles vs bloque que se ven vs goles totales del equipo (p.ej. 'Getafe: 7 de 33 goles'), aclarando que balón parado/penal/transición/ jugada directa no tienen etiqueta de bloque. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>3dc64f6 -
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
-
Normalizar nombres de liga (unifica variantes por-país)
Unifica variantes de la misma competencia (Italy/Italian Serie A, Spain/Spanish La Liga, Europa/UEFA Europa League, etc.) al nombre de la temporada más tardía. Módulo compartido league_names.py; aplicado en team_vars y lowblock_data. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>196acdd
-
Data del proveedor fuera del repo: se baja en runtime de un dataset privado
- vendor_env.ensure_data(): snapshot_download de RR_DATA_REPO (dataset privado) a vendor/data al bootear, usando HF_TOKEN (secreto del Space) - app.main() la llama antes de servir; sin RR_DATA_REPO (dev) usa vendor/data local - Dockerfile: vendor/data escribible (uid 1000) para el sync en runtime - .gitignore: se ignora vendor/data entero; 193 archivos de data desvinculados del repo - Permite volver el Space a público sin exponer la data del proveedor Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>5042eb5
-
Jugadas CSV: formato europeo (locale español)
Excel/Numbers en español leía "0.113" como 113 (punto = miles). Ahora el CSV usa separador ';' + coma decimal + BOM UTF-8, así los decimales y acentos salen bien. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>679738d -
Jugadas: ordenar por eje del gráfico 4 + swap estético Burbuja/Z-score
- plays.parquet: agrega sequenceId y eje_* (valor por-secuencia de los 7 ejes, z-score por liga-temporada join por matchId+sequenceId, 100% match) - Ordenar por en Ejes: suma los ejes elegidos en X/Y (ej "Por Verticalidad") y el CSV muestra la columna del eje usado - Gráfico 4: Z-score contra pasa a la fila de ajustes; Burbuja baja a la del pool Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>297d241 -
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 -
Variables 'menos es mejor': color invertido en Perfil + default 'bajo' en Top equipos
- var_dict: +24 variables marcadas negativa (xG/amenaza concedida del rival por bloque/ situación/centro/transición, secuencias con tiro del rival, NFBC del rival). Curado: se excluyen área de ataque, offsides provocados, rojas del rival, faltas sufridas y métricas de estilo del rival. - Perfil (sección 3): el color ahora va por "bondad" — verde cuando la variable negativa está baja, rojo cuando está alta (antes coloreaba por z crudo). - Top equipos (sección 2): al elegir una variable negativa, la dirección se defaultea a "bajo" (mapa tvNeg label->negativa). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>1bdff3c
-
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: arreglar display de los selects; sección 6: pool de ligas
- Los <select> de componentes de eje mostraban siempre la primera opción (bug de timing de x-model/:value con opciones dinámicas anidadas): ahora usan :selected por opción, así reflejan el eje real (X=Elaboración, no "Verticalidad"). - Sección 6 (Variables): agregado "Pool: sumar liga" (además de sumar equipo), como en Recursos; vsDraw maneja pool de ligas + equipos. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>ebbb798 -
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 -
Ejes: redefinir verticalidad y robo alto, fusionar rotura+profundidad (7 ejes)
- Verticalidad: + indice_verticalidad (recta inicio→fin ÷ camino real) y pct_prog_rival (% pases completados ≥10m hacia el arco desde campo rival); − pct_largos. - Robo alto: + PPDA (pases rival en su 60% ÷ acciones defensivas del equipo en zona alta), con z invertido (menos PPDA = más presión = más eje). - Fusión rotura_lineas + profundidad_espalda → "Rotura de líneas / profundidad". - Conducciones progresivas descartadas (sin evento de carry en los datos). - Artefactos regenerados para las 28 ligas (pipeline + build_artifacts) y labels/UI actualizados. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>4e8b295 -
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 -
Recuperaciones: alinear histograma con la cancha y arreglar filtro de fecha
- El histograma superior (celeste) ahora comparte xlim Y ancho/posición físicos con la cancha (mplsoccer la encoge por aspect igual), así cada cuadradito cae sobre su franja de cancha. Altura = cantidad de recuperaciones, texto = cantidad + xG. - Filtro de fecha: `fecha` viene como '2025-08-18Z' y pd.to_datetime la dejaba en NaT (borraba todo). Limpiamos la Z y parseamos con formato fijo en recuperaciones y triple_multitag (block_zscore ya lo hacía). Sin esto, filtrar por fecha rompía los reportes de La Liga y otras ligas. - _plot de recuperaciones ya no crashea si un equipo no tiene recuperaciones en el rango. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>9a48583
-
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 -
Fix arranque en HF: import de goalkicks opcional (feature WIP no commiteada) + re-aplicar p=2 y plegables
El deploy fallaba (ModuleNotFoundError: routes_goalkicks) porque app.py importaba la feature de goalkicks (en desarrollo local, sin commitear). Ahora el import es opcional. Se re-aplican similitud p=2 y los plegables de perfil/similares. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>77bf160 -
Revertir team_vars(p=2) y home(plegables) a 1931f95 para aislar el RUNTIME_ERROR
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>ffe78f2 -
Revertir cambio de logging de uvicorn (rompía el arranque en HF Spaces)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>be1ccd3 -
Similitud p=2, perfil+similares plegables, menos logs (HF drawer)
- Similitud = 100·2^(-(d/dbar)²) (p=2): el más parecido ~84% (antes ~71%). - Perfil de equipo y Equipos similares ahora plegables con flechita (como top equipos). - uvicorn access_log=False + log_level warning: en HF cada request a stdout abría el drawer de logs; ahora solo se loguean errores. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>6cf2e5a -
Equipos y variables: similitud calibrada 2^(-d/dbar), default 10, resultados plegables
- Similitud = 100·2^(-d/dbar), dbar = distancia media entre todos los pares del pool (50% = equipo promedio; cada dbar, se divide por dos). Más interpretable. - 'Mostrar' arranca en 10 y devuelve 10 (binding por string). - Sección Top equipos (lista + radar) plegable con flechita. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>1931f95
-
Equipos y variables: similitud gaussiana + limpiar pool + variables plegables
- Similitud = 100·exp(-rms²/2) (kernel gaussiano) en vez de exp(-rms): el más parecido queda ~85-92% (antes ~65%), más intuitivo. - Pools (Top y Similares): botón 'Limpiar todas' además de quitar una por una. - Secciones 2 y 3: lista de variables plegable ('Variables elegidas (N) ▾'); al colapsar muestra chips compactos. Sección 3 también valida variables. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>a7f1436 -
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
-
Ejes X/Y y Burbuja en una sola fila (grid 3 columnas en pantallas anchas)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>13a151b -
Burbuja (tamaño) como tercera dimensión en secciones 4 y 5
- Sección 4: selector 'Burbuja' con cualquier eje (usa el mismo lado/métrica/escala del gráfico); (ninguna) = tamaño fijo - Sección 5: panel Burbuja con lado+recurso+métrica propios y checkbox de activación - Radio min-max 4-15px; tooltip muestra el valor de la burbuja Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>02fede0 -
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