Skip to content

Commit 997739a

Browse files
Feat(Analytics): Implement Game Context multidimensional filtering for Top 6 simulation
1 parent cd42510 commit 997739a

4 files changed

Lines changed: 440 additions & 209 deletions

File tree

app.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,11 @@
6464
st.markdown("**🎛️ Filtros Globales**")
6565
sel_pos = st.selectbox("Posición Táctica", ["Todos"] + sorted(df["pos"].unique().tolist()))
6666
min_apps = st.slider("Partidos Mínimos Jugados", 0, 32, 15)
67-
focus_player = st.selectbox("Jugador en Foco (Radares)", ["Todos"] + df["player"].tolist())
67+
focus_player = st.selectbox("Jugador en Foco (Radares)", ["Todos"] + df["player"].unique().tolist())
68+
69+
st.markdown("---")
70+
st.markdown("**⚔️ Contexto Opositor (Filtro Senior)**")
71+
sel_context = st.radio("Nivel de Presión Rival", ["Resto PL", "Top 6 (Alta Presión)"], help="Audita qué jugador 'infla' sus estadísticas frente a equipos de baja tabal y quién sobrevive a la presión asfixiante de la élite de Inglaterra.")
6872

6973
st.markdown("---")
7074
st.markdown("**📌 Métrica de Enfoque Principal**")
@@ -78,6 +82,11 @@
7882

7983
# ─────────────────────────────── FILTER ───────────────────────────────
8084
df_f = df.copy()
85+
86+
# 1. Filtro Contextual (Crucial para el análisis Senior)
87+
target_tier = sel_context.replace(" (Alta Presión)", "")
88+
df_f = df_f[df_f["opponent_tier"] == target_tier]
89+
8190
if sel_pos != "Todos":
8291
df_f = df_f[df_f["pos"] == sel_pos]
8392
df_f = df_f[df_f["apps"] >= min_apps]
@@ -126,7 +135,7 @@
126135
st.markdown("<div class='section-text'>El fútbol no se juega en una hoja de Excel, sino en el césped. Aisla a un jugador para observar empíricamente en qué zonas específicas del campo ejecuta sus entregas de balón (izquierda) y en qué cuadrantes genera el mayor grado de amenaza xT contra el arco rival (derecha).</div>", unsafe_allow_html=True)
127136

128137
col_sel, _ = st.columns([2, 5])
129-
hm_player = col_sel.selectbox("Filtrar jugador para los mapas de calor tácticos", df_f["player"].tolist(), key="hm_player")
138+
hm_player = col_sel.selectbox("Filtrar jugador para los mapas de calor tácticos", df_f["player"].unique().tolist(), key="hm_player")
130139
player_row = df_f[df_f["player"] == hm_player].iloc[0]
131140

132141
h1, h2 = st.columns(2)

data/raw/passing_players.csv

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1-
player,pos,apps,age,pass_acc,prog_passes,key_passes,vert_idx,xA,losses,deep_prog,xT_gen
2-
B. Fernandes,CAM,32,30,88.4,5.1,2.8,0.78,8.2,1.9,3.1,0.42
3-
C. Eriksen,CM,24,32,91.2,4.8,1.9,0.85,4.1,1.1,2.7,0.31
4-
K. Mainoo,CM,28,19,85.7,4.0,1.6,0.64,3.2,2.4,1.9,0.24
5-
T. Højlund,ST,20,22,83.1,3.5,1.2,0.58,2.0,2.8,1.5,0.18
6-
M. Mount,CM,18,25,82.8,2.9,1.0,0.52,1.8,3.1,1.2,0.14
7-
Casemiro,CDM,26,32,86.5,3.2,0.8,0.45,1.5,2.2,0.9,0.11
1+
player,pos,apps,age,pass_acc,prog_passes,key_passes,vert_idx,xA,losses,deep_prog,xT_gen,opponent_tier
2+
B. Fernandes,CAM,32,30,90.4,5.1,2.8,0.78,8.2,1.4,3.1,0.48299999999999993,Resto PL
3+
C. Eriksen,CM,24,32,93.2,4.8,1.9,0.85,4.1,0.6000000000000001,2.7,0.3565,Resto PL
4+
K. Mainoo,CM,28,19,87.7,4.0,1.6,0.64,3.2,1.9,1.9,0.27599999999999997,Resto PL
5+
T. Højlund,ST,20,22,85.1,3.5,1.2,0.58,2.0,2.3,1.5,0.207,Resto PL
6+
M. Mount,CM,18,25,84.8,2.9,1.0,0.52,1.8,2.6,1.2,0.161,Resto PL
7+
Casemiro,CDM,26,32,88.5,3.2,0.8,0.45,1.5,1.7000000000000002,0.9,0.1265,Resto PL
8+
B. Fernandes,CAM,32,30,86.4,5.1,2.8,0.78,8.2,2.5,3.1,0.38639999999999997,Top 6
9+
C. Eriksen,CM,24,32,87.2,4.8,1.9,0.85,4.1,2.3000000000000003,2.7,0.26039999999999996,Top 6
10+
K. Mainoo,CM,28,19,85.2,4.0,1.6,0.64,3.2,2.55,1.9,0.2352,Top 6
11+
T. Højlund,ST,20,22,80.1,3.5,1.2,0.58,2.0,3.7,1.5,0.15839999999999999,Top 6
12+
M. Mount,CM,18,25,79.3,2.9,1.0,0.52,1.8,4.15,1.2,0.12040000000000001,Top 6
13+
Casemiro,CDM,26,32,80.5,3.2,0.8,0.45,1.5,4.0,0.9,0.0836,Top 6

0 commit comments

Comments
 (0)