Spaces:
Running
Running
Commit History
9 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
-
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
-
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
-
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: 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
-
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 -
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
-
Recurso 'Todos los recursos (construcción)': unión sin doble conteo
Suma todas las formas de atacar (sin tiro de fuera del área): intentos totales, peligro total, goles de jugadas con al menos un recurso. Nota explica por qué no coincide con la suma de filas (doble conteo de jugadas con recursos combinados). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>c72c8e6 -
Tablas bloque bajo: color en todas las difs, difs para conteos, inversión en defensiva
- (±x) también en intentos, evento clave y goles (media simple entre equipos) - Verde/rojo en todas las columnas con dif; en la tabla defensiva se invierte: conceder más que la liga = rojo Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>34a5455 -
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 -
Tiro fuera del área: sin evento clave (el tiro realiza el peligro, no lo agrega) + rename
El gol tiene pvAdded nulo y el tiro errado negativo → el propio tiro nunca puede ser el argmax de su secuencia; mostrar el conteo era engañoso (goles > eventos clave). Label preciso: 'Tiro desde fuera del área'. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>281bc09 -
Bloque bajo: métricas 'peligro por jugada exitosa' y 'evento clave'
- pv_jugada_exitosa: pvAdded medio solo sobre intentos exitosos - evento_clave: nº de ataques donde el recurso fue LA acción que más peligro agregó a la secuencia (argmax de pvAdded por jugada) Disponibles en el scatter (selector de métrica) y como columnas en las tablas. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>a259cb8 -
Bloque bajo: % en tooltips/ejes, ocultar métricas engañosas, nota explicativa
- Tooltip y ticks del scatter muestran '%' cuando la métrica es porcentaje - tiro_lejano sin pv/jugada (el pv castiga contablemente todo tiro errado) y rompe-líneas sin % éxito (el proveedor solo marca los completados) - Nota bajo las tablas: pv negativo = los intentos pierden valor en promedio Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>035183f
-
Fix desync de selects de eje (sección 4) + buscador de equipo para marcar (sección 5)
Los selects de Eje X/Y quedaban mostrando una opción distinta al modelo (race de Alpine al renderizar options tras fijar el valor) → el gráfico ploteaba otra variable que la elegida. Re-sync tras $nextTick. En bloque bajo: input con datalist para buscar y fijar equipos en el scatter + botón limpiar marcas. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>909816d -
Recursos bloque bajo con las 28 ligas + renombres en Equipos y variables
- Artefacto completo: 483 equipos, 9.677 filas (equipo×lado×recurso×métricas) - Renombres: '2. Top equipos en…', '3.5 Equipos similares a este equipo', ejes ahora '4' con Ataque/Defensa y métrica 'Uso (z vs liga)', bloque bajo '5' Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>5f546c6 -
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 -
Prints de diagnóstico en el boot (Space colgado en APP_STARTING)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>aaec6a5
-
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
-
Post-partido: si la orientación elegida no se jugó, caer a la inversa
Orden estricto primero (desambigua cuando el cruce tiene las dos orientaciones en la temporada). Si el par elegido no se jugó como local/visitante pedido (p.ej. Boca vs River en 26 se jugó con River local), usa la orientación real jugada en vez de decir 'no existe'. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>3f110a2
-
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 -
Post-partido: acepta el partido sin importar local/visitante elegido
El resolve devuelve el partido con su orientación real; el frontend exigía que el local fuese exactamente el elegido y no encontraba p.ej. Racing vs Almería (jugado con Almería de local). Ahora matchea el par en cualquier orden y usa el local/ visitante reales del partido. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>7680fde
-
Variables negativas (menos=mejor): "mejor de la liga" = z más bajo + radar invertido
48 variables marcadas como negativas (rival/en contra/concedidas + errores/pérdidas/ tarjetas/ppda), revisadas una por una (excluye _rival neutrales de estilo y las buenas para nosotros como rojas del rival / faltas sufridas). En el diccionario se agrega el flag "negativa". - team_profile: para negativas, "mejor de la liga" = MÍNIMO (z más bajo). Item trae negativa. - radar: best=mín en negativas y usa lower_is_better de mplsoccer → "más afuera = mejor" en todos los ejes (los negativos se invierten). - Frontend: badge "↓" en las variables negativas del perfil. - variables_info expone negativa. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>cf1e649 -
Equipos y variables: botones de tipo como toggle (agregar/quitar) + resaltado
Tocar un tipo (Defensiva, Ofensiva, etc.) agrega todas sus variables; tocarlo de nuevo (cuando ya están todas) las quita. Aplica en búsqueda y en perfil. El botón se resalta cuando todas las variables de ese tipo están seleccionadas. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>71cf2d1 -
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