pablogrois Claude Opus 5 commited on
Commit
6a437ee
·
1 Parent(s): f387940

Las features de train, listadas de verdad en cada modelo

Browse files

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-Authored-By: Claude Opus 5 <noreply@anthropic.com>

docs/diccionarios/_referencia_db.json CHANGED
The diff for this file is too large to render. See raw diff
 
docs/diccionarios/_reportes_categorias.json CHANGED
@@ -113,18 +113,6 @@
113
  "Target": [
114
  "target_shot (la jugada termina en tiro)"
115
  ],
116
- "Features - métricas de secuencia (65)": [
117
- "todas las numéricas de sequences.parquet"
118
- ],
119
- "Features - ejes z global (7)": [
120
- "ejeg_verticalidad",
121
- "ejeg_elaboracion",
122
- "ejeg_individual",
123
- "ejeg_rotura_profundidad",
124
- "ejeg_amplitud_centro",
125
- "ejeg_robo_alto",
126
- "ejeg_aereo_segunda"
127
- ],
128
  "Excluidas - metadatos": [
129
  "liga",
130
  "temporada",
@@ -145,6 +133,80 @@
145
  ],
146
  "Test": [
147
  "predicción out-of-fold (AUC ~ 0.980)"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
148
  ]
149
  },
150
  "modelos/cruce": {
@@ -207,20 +269,352 @@
207
  "xt_lane_Centro",
208
  "xt_lane_Der"
209
  ],
210
- "Features - equipo": [
211
- "self_* (forma a-la-fecha del equipo)"
212
- ],
213
- "Features - rival": [
214
- "opp_* (forma a-la-fecha del rival)"
215
- ],
216
  "Train": [
217
- "80% aleatorio",
218
  "12% del train como eval_set",
219
  "early stopping paciencia 50"
220
  ],
221
  "Test": [
222
  "20% aleatorio",
223
  "MAE vs baseline (self_* normalizada)"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
224
  ]
225
  },
226
  "analisis/choque-de-estilos": {
@@ -351,15 +745,6 @@
351
  "Cut_Back__Der_ (int der área)",
352
  "Cross__Der_ (ext der área)"
353
  ],
354
- "Features - globales": [
355
- "200 columnas podadas desde ~950 candidatas (mf__* y rolling)",
356
- "filtro 1: descarta >60% NaN (NAN_FRAC_MAX=0.60)",
357
- "filtro 2: descarta varianza <=1e-9 (VAR_EPS)",
358
- "filtro 3: descarta |corr|>0.97 con una ya elegida (CORR_PRUNE_THRESHOLD)",
359
- "filtro 4: top 200 por señal (DEFAULT_TOP_K)",
360
- "señal = max |corr| de la feature contra los 10 targets",
361
- "TODO calculado solo sobre filas de train (evita fuga al test)"
362
- ],
363
  "Features - de nodo": [
364
  "ataque y PV propios por zona",
365
  "concedidos por zona",
@@ -371,16 +756,218 @@
371
  ],
372
  "Train": [
373
  "split TEMPORAL",
374
- "validación = fechas más recientes del train",
375
- "early stopping",
376
- "weight decay + dropout",
377
- "ensemble de semillas"
378
  ],
379
  "Test": [
380
- "split temporal aparte",
381
- "MAE vs 2 baselines",
382
  "intervalos bootstrap",
383
  "mejora ~3.6%"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
384
  ]
385
  },
386
  "modelos/pv_distribution_gnn": {
@@ -417,13 +1004,1085 @@
417
  ],
418
  "Train": [
419
  "split TEMPORAL",
420
- "estandarizacion y medianas calculadas solo sobre train",
421
- "hasta 260 epocas con early stopping",
 
422
  "RANDOM_SEED=42"
423
  ],
424
  "Test": [
425
- "split temporal aparte",
426
  "MAE contra los dos baselines"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
427
  ]
428
  }
429
  }
 
113
  "Target": [
114
  "target_shot (la jugada termina en tiro)"
115
  ],
 
 
 
 
 
 
 
 
 
 
 
 
116
  "Excluidas - metadatos": [
117
  "liga",
118
  "temporada",
 
133
  ],
134
  "Test": [
135
  "predicción out-of-fold (AUC ~ 0.980)"
136
+ ],
137
+ "Features (72)": [
138
+ "start_x",
139
+ "max_x",
140
+ "n_events",
141
+ "n_passes",
142
+ "duration_s",
143
+ "ball_distance",
144
+ "pct_largos",
145
+ "pct_medios",
146
+ "pct_cortos",
147
+ "ratio_largo_corto",
148
+ "ratio_medio_corto",
149
+ "verticalidad_media",
150
+ "pct_verticales",
151
+ "pct_afuera",
152
+ "pct_adentro",
153
+ "pct_through",
154
+ "pct_headpass",
155
+ "pct_layoff",
156
+ "pct_launch",
157
+ "pct_switch",
158
+ "n_centros",
159
+ "cross_pvadded_max",
160
+ "press_media",
161
+ "press_max",
162
+ "press_own",
163
+ "press_mid",
164
+ "press_final",
165
+ "fast_break",
166
+ "hold_mean",
167
+ "hold_max",
168
+ "hold_min",
169
+ "def_h",
170
+ "def_w",
171
+ "def_l",
172
+ "atk_w",
173
+ "atk_l",
174
+ "atk_h",
175
+ "n_involved",
176
+ "dang_runs",
177
+ "line_breaks",
178
+ "pass_options_mean",
179
+ "opt_quality_mean",
180
+ "n_takeons",
181
+ "takeons_ok",
182
+ "dribbles_last_third",
183
+ "dribbles_box",
184
+ "paredes",
185
+ "broke_last_line",
186
+ "broke_second_last",
187
+ "passes_behind_line",
188
+ "behind_line_ok",
189
+ "pelotazos_espalda",
190
+ "deep_completions",
191
+ "starts_from_dispossess",
192
+ "cross_inswinger",
193
+ "cross_outswinger",
194
+ "cross_floatedcross",
195
+ "cross_drivencross",
196
+ "cross_pullback",
197
+ "prog_x",
198
+ "transition_speed",
199
+ "tempo",
200
+ "indice_verticalidad",
201
+ "pct_prog_rival",
202
+ "ppda",
203
+ "ejeg_verticalidad",
204
+ "ejeg_elaboracion",
205
+ "ejeg_individual",
206
+ "ejeg_rotura_profundidad",
207
+ "ejeg_amplitud_centro",
208
+ "ejeg_robo_alto",
209
+ "ejeg_aereo_segunda"
210
  ]
211
  },
212
  "modelos/cruce": {
 
269
  "xt_lane_Centro",
270
  "xt_lane_Der"
271
  ],
 
 
 
 
 
 
272
  "Train": [
273
+ "80% aleatorio (RNG.permutation)",
274
  "12% del train como eval_set",
275
  "early stopping paciencia 50"
276
  ],
277
  "Test": [
278
  "20% aleatorio",
279
  "MAE vs baseline (self_* normalizada)"
280
+ ],
281
+ "Features - equipo (self_*)": [
282
+ "self_elo",
283
+ "self_def_H",
284
+ "self_def_M",
285
+ "self_def_L",
286
+ "self_atk_Der",
287
+ "self_atk_Centro",
288
+ "self_atk_Izq",
289
+ "self_offxt_H_Der",
290
+ "self_offxt_H_Centro",
291
+ "self_offxt_H_Izq",
292
+ "self_offxt_M_Der",
293
+ "self_offxt_M_Centro",
294
+ "self_offxt_M_Izq",
295
+ "self_offxt_L_Der",
296
+ "self_offxt_L_Centro",
297
+ "self_offxt_L_Izq",
298
+ "self_defxt_H_Der",
299
+ "self_defxt_H_Centro",
300
+ "self_defxt_H_Izq",
301
+ "self_defxt_M_Der",
302
+ "self_defxt_M_Centro",
303
+ "self_defxt_M_Izq",
304
+ "self_defxt_L_Der",
305
+ "self_defxt_L_Centro",
306
+ "self_defxt_L_Izq",
307
+ "self_sh_buildup",
308
+ "self_sh_counter",
309
+ "self_sh_direct",
310
+ "self_sh_setpiece",
311
+ "self_sh_recovery",
312
+ "self_sh_progr",
313
+ "self_cross_pct",
314
+ "self_pct_long",
315
+ "self_pct_short",
316
+ "self_pct_pass_ok",
317
+ "self_n_attacks",
318
+ "self_xt_total",
319
+ "self_xg_total",
320
+ "self_xt_per_attack",
321
+ "self_n_seq",
322
+ "self_n_pass",
323
+ "self_n_shots",
324
+ "self_avg_x",
325
+ "self_avg_y",
326
+ "self_share_opp_half",
327
+ "self_recovery_height",
328
+ "self_n_progr",
329
+ "self_goals_for",
330
+ "self_goals_against",
331
+ "self_win",
332
+ "self_xt_lane_Der",
333
+ "self_xt_lane_Centro",
334
+ "self_xt_lane_Izq"
335
+ ],
336
+ "Features - rival (opp_*)": [
337
+ "opp_self_elo",
338
+ "opp_self_def_H",
339
+ "opp_self_def_M",
340
+ "opp_self_def_L",
341
+ "opp_self_atk_Der",
342
+ "opp_self_atk_Centro",
343
+ "opp_self_atk_Izq",
344
+ "opp_self_offxt_H_Der",
345
+ "opp_self_offxt_H_Centro",
346
+ "opp_self_offxt_H_Izq",
347
+ "opp_self_offxt_M_Der",
348
+ "opp_self_offxt_M_Centro",
349
+ "opp_self_offxt_M_Izq",
350
+ "opp_self_offxt_L_Der",
351
+ "opp_self_offxt_L_Centro",
352
+ "opp_self_offxt_L_Izq",
353
+ "opp_self_defxt_H_Der",
354
+ "opp_self_defxt_H_Centro",
355
+ "opp_self_defxt_H_Izq",
356
+ "opp_self_defxt_M_Der",
357
+ "opp_self_defxt_M_Centro",
358
+ "opp_self_defxt_M_Izq",
359
+ "opp_self_defxt_L_Der",
360
+ "opp_self_defxt_L_Centro",
361
+ "opp_self_defxt_L_Izq",
362
+ "opp_self_sh_buildup",
363
+ "opp_self_sh_counter",
364
+ "opp_self_sh_direct",
365
+ "opp_self_sh_setpiece",
366
+ "opp_self_sh_recovery",
367
+ "opp_self_sh_progr",
368
+ "opp_self_cross_pct",
369
+ "opp_self_pct_long",
370
+ "opp_self_pct_short",
371
+ "opp_self_pct_pass_ok",
372
+ "opp_self_n_attacks",
373
+ "opp_self_xt_total",
374
+ "opp_self_xg_total",
375
+ "opp_self_xt_per_attack",
376
+ "opp_self_n_seq",
377
+ "opp_self_n_pass",
378
+ "opp_self_n_shots",
379
+ "opp_self_avg_x",
380
+ "opp_self_avg_y",
381
+ "opp_self_share_opp_half",
382
+ "opp_self_recovery_height",
383
+ "opp_self_n_progr",
384
+ "opp_self_goals_for",
385
+ "opp_self_goals_against",
386
+ "opp_self_win",
387
+ "opp_self_xt_lane_Der",
388
+ "opp_self_xt_lane_Centro",
389
+ "opp_self_xt_lane_Izq",
390
+ "opp_selfH_def_H",
391
+ "opp_selfH_def_M",
392
+ "opp_selfH_def_L",
393
+ "opp_selfH_atk_Der",
394
+ "opp_selfH_atk_Centro",
395
+ "opp_selfH_atk_Izq",
396
+ "opp_selfH_offxt_H_Der",
397
+ "opp_selfH_offxt_H_Centro",
398
+ "opp_selfH_offxt_H_Izq",
399
+ "opp_selfH_offxt_M_Der",
400
+ "opp_selfH_offxt_M_Centro",
401
+ "opp_selfH_offxt_M_Izq",
402
+ "opp_selfH_offxt_L_Der",
403
+ "opp_selfH_offxt_L_Centro",
404
+ "opp_selfH_offxt_L_Izq",
405
+ "opp_selfH_defxt_H_Der",
406
+ "opp_selfH_defxt_H_Centro",
407
+ "opp_selfH_defxt_H_Izq",
408
+ "opp_selfH_defxt_M_Der",
409
+ "opp_selfH_defxt_M_Centro",
410
+ "opp_selfH_defxt_M_Izq",
411
+ "opp_selfH_defxt_L_Der",
412
+ "opp_selfH_defxt_L_Centro",
413
+ "opp_selfH_defxt_L_Izq",
414
+ "opp_selfH_sh_buildup",
415
+ "opp_selfH_sh_counter",
416
+ "opp_selfH_sh_direct",
417
+ "opp_selfH_sh_setpiece",
418
+ "opp_selfH_sh_recovery",
419
+ "opp_selfH_sh_progr",
420
+ "opp_selfH_cross_pct",
421
+ "opp_selfH_pct_long",
422
+ "opp_selfH_pct_short",
423
+ "opp_selfH_pct_pass_ok",
424
+ "opp_selfH_n_attacks",
425
+ "opp_selfH_xt_total",
426
+ "opp_selfH_xg_total",
427
+ "opp_selfH_xt_per_attack",
428
+ "opp_selfH_n_seq",
429
+ "opp_selfH_n_pass",
430
+ "opp_selfH_n_shots",
431
+ "opp_selfH_avg_x",
432
+ "opp_selfH_avg_y",
433
+ "opp_selfH_share_opp_half",
434
+ "opp_selfH_recovery_height",
435
+ "opp_selfH_n_progr",
436
+ "opp_selfH_goals_for",
437
+ "opp_selfH_goals_against",
438
+ "opp_selfH_win",
439
+ "opp_selfH_xt_lane_Der",
440
+ "opp_selfH_xt_lane_Centro",
441
+ "opp_selfH_xt_lane_Izq",
442
+ "opp_selfA_def_H",
443
+ "opp_selfA_def_M",
444
+ "opp_selfA_def_L",
445
+ "opp_selfA_atk_Der",
446
+ "opp_selfA_atk_Centro",
447
+ "opp_selfA_atk_Izq",
448
+ "opp_selfA_offxt_H_Der",
449
+ "opp_selfA_offxt_H_Centro",
450
+ "opp_selfA_offxt_H_Izq",
451
+ "opp_selfA_offxt_M_Der",
452
+ "opp_selfA_offxt_M_Centro",
453
+ "opp_selfA_offxt_M_Izq",
454
+ "opp_selfA_offxt_L_Der",
455
+ "opp_selfA_offxt_L_Centro",
456
+ "opp_selfA_offxt_L_Izq",
457
+ "opp_selfA_defxt_H_Der",
458
+ "opp_selfA_defxt_H_Centro",
459
+ "opp_selfA_defxt_H_Izq",
460
+ "opp_selfA_defxt_M_Der",
461
+ "opp_selfA_defxt_M_Centro",
462
+ "opp_selfA_defxt_M_Izq",
463
+ "opp_selfA_defxt_L_Der",
464
+ "opp_selfA_defxt_L_Centro",
465
+ "opp_selfA_defxt_L_Izq",
466
+ "opp_selfA_sh_buildup",
467
+ "opp_selfA_sh_counter",
468
+ "opp_selfA_sh_direct",
469
+ "opp_selfA_sh_setpiece",
470
+ "opp_selfA_sh_recovery",
471
+ "opp_selfA_sh_progr",
472
+ "opp_selfA_cross_pct",
473
+ "opp_selfA_pct_long",
474
+ "opp_selfA_pct_short",
475
+ "opp_selfA_pct_pass_ok",
476
+ "opp_selfA_n_attacks",
477
+ "opp_selfA_xt_total",
478
+ "opp_selfA_xg_total",
479
+ "opp_selfA_xt_per_attack",
480
+ "opp_selfA_n_seq",
481
+ "opp_selfA_n_pass",
482
+ "opp_selfA_n_shots",
483
+ "opp_selfA_avg_x",
484
+ "opp_selfA_avg_y",
485
+ "opp_selfA_share_opp_half",
486
+ "opp_selfA_recovery_height",
487
+ "opp_selfA_n_progr",
488
+ "opp_selfA_goals_for",
489
+ "opp_selfA_goals_against",
490
+ "opp_selfA_win",
491
+ "opp_selfA_xt_lane_Der",
492
+ "opp_selfA_xt_lane_Centro",
493
+ "opp_selfA_xt_lane_Izq"
494
+ ],
495
+ "Features - equipo de local (selfH_*)": [
496
+ "selfH_def_H",
497
+ "selfH_def_M",
498
+ "selfH_def_L",
499
+ "selfH_atk_Der",
500
+ "selfH_atk_Centro",
501
+ "selfH_atk_Izq",
502
+ "selfH_offxt_H_Der",
503
+ "selfH_offxt_H_Centro",
504
+ "selfH_offxt_H_Izq",
505
+ "selfH_offxt_M_Der",
506
+ "selfH_offxt_M_Centro",
507
+ "selfH_offxt_M_Izq",
508
+ "selfH_offxt_L_Der",
509
+ "selfH_offxt_L_Centro",
510
+ "selfH_offxt_L_Izq",
511
+ "selfH_defxt_H_Der",
512
+ "selfH_defxt_H_Centro",
513
+ "selfH_defxt_H_Izq",
514
+ "selfH_defxt_M_Der",
515
+ "selfH_defxt_M_Centro",
516
+ "selfH_defxt_M_Izq",
517
+ "selfH_defxt_L_Der",
518
+ "selfH_defxt_L_Centro",
519
+ "selfH_defxt_L_Izq",
520
+ "selfH_sh_buildup",
521
+ "selfH_sh_counter",
522
+ "selfH_sh_direct",
523
+ "selfH_sh_setpiece",
524
+ "selfH_sh_recovery",
525
+ "selfH_sh_progr",
526
+ "selfH_cross_pct",
527
+ "selfH_pct_long",
528
+ "selfH_pct_short",
529
+ "selfH_pct_pass_ok",
530
+ "selfH_n_attacks",
531
+ "selfH_xt_total",
532
+ "selfH_xg_total",
533
+ "selfH_xt_per_attack",
534
+ "selfH_n_seq",
535
+ "selfH_n_pass",
536
+ "selfH_n_shots",
537
+ "selfH_avg_x",
538
+ "selfH_avg_y",
539
+ "selfH_share_opp_half",
540
+ "selfH_recovery_height",
541
+ "selfH_n_progr",
542
+ "selfH_goals_for",
543
+ "selfH_goals_against",
544
+ "selfH_win",
545
+ "selfH_xt_lane_Der",
546
+ "selfH_xt_lane_Centro",
547
+ "selfH_xt_lane_Izq"
548
+ ],
549
+ "Features - equipo de visitante (selfA_*)": [
550
+ "selfA_def_H",
551
+ "selfA_def_M",
552
+ "selfA_def_L",
553
+ "selfA_atk_Der",
554
+ "selfA_atk_Centro",
555
+ "selfA_atk_Izq",
556
+ "selfA_offxt_H_Der",
557
+ "selfA_offxt_H_Centro",
558
+ "selfA_offxt_H_Izq",
559
+ "selfA_offxt_M_Der",
560
+ "selfA_offxt_M_Centro",
561
+ "selfA_offxt_M_Izq",
562
+ "selfA_offxt_L_Der",
563
+ "selfA_offxt_L_Centro",
564
+ "selfA_offxt_L_Izq",
565
+ "selfA_defxt_H_Der",
566
+ "selfA_defxt_H_Centro",
567
+ "selfA_defxt_H_Izq",
568
+ "selfA_defxt_M_Der",
569
+ "selfA_defxt_M_Centro",
570
+ "selfA_defxt_M_Izq",
571
+ "selfA_defxt_L_Der",
572
+ "selfA_defxt_L_Centro",
573
+ "selfA_defxt_L_Izq",
574
+ "selfA_sh_buildup",
575
+ "selfA_sh_counter",
576
+ "selfA_sh_direct",
577
+ "selfA_sh_setpiece",
578
+ "selfA_sh_recovery",
579
+ "selfA_sh_progr",
580
+ "selfA_cross_pct",
581
+ "selfA_pct_long",
582
+ "selfA_pct_short",
583
+ "selfA_pct_pass_ok",
584
+ "selfA_n_attacks",
585
+ "selfA_xt_total",
586
+ "selfA_xg_total",
587
+ "selfA_xt_per_attack",
588
+ "selfA_n_seq",
589
+ "selfA_n_pass",
590
+ "selfA_n_shots",
591
+ "selfA_avg_x",
592
+ "selfA_avg_y",
593
+ "selfA_share_opp_half",
594
+ "selfA_recovery_height",
595
+ "selfA_n_progr",
596
+ "selfA_goals_for",
597
+ "selfA_goals_against",
598
+ "selfA_win",
599
+ "selfA_xt_lane_Der",
600
+ "selfA_xt_lane_Centro",
601
+ "selfA_xt_lane_Izq"
602
+ ],
603
+ "Features - contexto": [
604
+ "is_home",
605
+ "elo_diff",
606
+ "form_4231",
607
+ "form_4231.0",
608
+ "form_433",
609
+ "form_442",
610
+ "form_3421",
611
+ "form_433.0",
612
+ "form_442.0",
613
+ "form_3421.0",
614
+ "form_352",
615
+ "form_4141.0",
616
+ "form_343",
617
+ "form_4141"
618
  ]
619
  },
620
  "analisis/choque-de-estilos": {
 
745
  "Cut_Back__Der_ (int der área)",
746
  "Cross__Der_ (ext der área)"
747
  ],
 
 
 
 
 
 
 
 
 
748
  "Features - de nodo": [
749
  "ataque y PV propios por zona",
750
  "concedidos por zona",
 
756
  ],
757
  "Train": [
758
  "split TEMPORAL",
759
+ "8.506 filas de train",
760
+ "962 de validación (desde 2025-11-16)",
761
+ "early stopping + weight decay + dropout",
762
+ "ensemble de 5 semillas"
763
  ],
764
  "Test": [
765
+ "1.108 filas (temporal, aparte)",
766
+ "MAE vs baseline temporada y últimos 8",
767
  "intervalos bootstrap",
768
  "mejora ~3.6%"
769
+ ],
770
+ "Features globales (200, tras la poda)": [
771
+ "long_mean__actual_press_share__x2_y1",
772
+ "short_mean__actual_press_share__x2_y1",
773
+ "long_mean__press_cnt__x2_y1",
774
+ "short_mean__press_cnt__x2_y1",
775
+ "long_mean__zone_actions__Creativity_Zone",
776
+ "short_mean__zone_actions__Half_Space__Izq_",
777
+ "short_mean__zone_actions__Creativity_Zone",
778
+ "long_mean__zone_actions__Half_Space__Izq_",
779
+ "long_mean__actual_press_share__x2_y2",
780
+ "short_mean__actual_press_share__x2_y2",
781
+ "long_mean__mf__press_int_sum__x2_y1",
782
+ "long_mean__short_long_pass_ratio",
783
+ "short_mean__mf__press_int_sum__x2_y1",
784
+ "short_mean__short_long_pass_ratio",
785
+ "long_mean__zone_actions__Deep_Cross__Izq_",
786
+ "long_mean__zone_linesBroken__Deep_Cross__Izq_",
787
+ "short_mean__passes_short",
788
+ "short_mean__actual_press_share__x1_y0",
789
+ "long_mean__zone_linesBroken__Creativity_Zone",
790
+ "long_mean__passes_short",
791
+ "long_mean__actual_press_share__x1_y0",
792
+ "long_mean__mf__pct_pases_largos",
793
+ "short_mean__zone_actions__Deep_Cross__Izq_",
794
+ "short_mean__mf__pct_pases_largos",
795
+ "long_mean__zone_linesBroken__Half_Space__Izq_",
796
+ "long_mean__press_cnt__x2_y2",
797
+ "short_mean__zone_linesBroken__Half_Space__Izq_",
798
+ "long_mean__interception_cnt__x3_y1",
799
+ "short_mean__press_cnt__x2_y2",
800
+ "short_mean__zone_linesBroken__Deep_Cross__Izq_",
801
+ "short_mean__interception_cnt__x3_y1",
802
+ "short_mean__zone_linesBroken__Creativity_Zone",
803
+ "league_Liga Profesional Argentina",
804
+ "short_mean__pressures_total",
805
+ "long_mean__pressures_total",
806
+ "short_mean__linesBroken_total",
807
+ "long_mean__mf__press_cnt__x2_y2",
808
+ "long_mean__linesBroken_total",
809
+ "short_mean__zone_pvAdded__Creativity_Zone",
810
+ "long_mean__press_cnt__x1_y1",
811
+ "short_mean__actual_recovery_share__x3_y1",
812
+ "short_mean__press_cnt__x1_y1",
813
+ "long_mean__mf__pases_progresivos_sobre_pases",
814
+ "short_mean__mf__pases_progresivos_sobre_pases",
815
+ "short_mean__zone_actions__Half_Space__Der_",
816
+ "long_mean__actual_recovery_share__x3_y1",
817
+ "short_mean__mf__press_cnt__x2_y2",
818
+ "short_mean__press_cnt__x1_y2",
819
+ "long_mean__mf__attack_zone_share__Cross (Izq)",
820
+ "long_mean__zone_pvAdded__Creativity_Zone",
821
+ "long_mean__passes_per_possession",
822
+ "long_mean__press_cnt__x1_y2",
823
+ "short_mean__actual_press_share__x1_y2",
824
+ "long_mean__press_cnt__x1_y0",
825
+ "short_mean__passes_per_possession",
826
+ "short_mean__press_cnt__x1_y0",
827
+ "short_mean__mf__attack_zone_share__Deep Cross (Izq)",
828
+ "long_mean__zone_actions__Half_Space__Der_",
829
+ "long_mean__press_cnt__x2_y0",
830
+ "short_mean__actual_press_share__x2_y0",
831
+ "long_mean__actual_press_share__x2_y0",
832
+ "short_mean__press_cnt__x2_y0",
833
+ "season_25",
834
+ "long_mean__actual_press_share__x1_y2",
835
+ "short_mean__actual_press_share__x3_y2",
836
+ "long_mean__mf__pressures",
837
+ "short_mean__actual_recovery_share__x2_y1",
838
+ "short_mean__mf__attack_zone_share__Deep Cross (Der)",
839
+ "opp__short_mean__zone_actions__Creativity_Zone__opp",
840
+ "short_mean__mf__pressures",
841
+ "opp__long_mean__zone_actions__Creativity_Zone__opp",
842
+ "short_mean__zone_linesBroken__Half_Space__Der_",
843
+ "short_mean__zone_linesBroken__Deep_Cross__Der_",
844
+ "long_mean__press_cnt__x3_y1",
845
+ "long_mean__actual_press_share__x3_y2",
846
+ "opp__long_mean__interception_cnt__x1_y1",
847
+ "season_24-25",
848
+ "long_mean__mf__press_cnt__x3_y2",
849
+ "short_mean__mf__attack_zone_share__Cross (Der)",
850
+ "long_mean__press_cnt__x3_y2",
851
+ "long_mean__zone_actions__Deep_Cross__Der_",
852
+ "short_mean__mf__press_cnt__x3_y2",
853
+ "long_mean__mf__press_cnt__x1_y1",
854
+ "short_mean__zone_actions__Deep_Cross__Der_",
855
+ "long_mean__actual_press_share__x3_y1",
856
+ "short_mean__actual_press_share__x3_y1",
857
+ "short_mean__mf__attack_zone_pvAdded__Creativity Zone",
858
+ "short_mean__press_cnt__x3_y1",
859
+ "short_mean__actual_press_share__x3_y0",
860
+ "long_mean__mf__attack_zone_pvAdded__Creativity Zone",
861
+ "long_mean__actual_recovery_share__x2_y1",
862
+ "short_mean__zone_actions__Cut_Back__Izq_",
863
+ "long_mean__zone_linesBroken__Half_Space__Der_",
864
+ "long_mean__mf__recepciones_area",
865
+ "long_mean__mf__press_int_sum__x3_y1",
866
+ "short_mean__press_cnt__x3_y2",
867
+ "long_mean__zone_linesBroken__Deep_Cross__Der_",
868
+ "short_mean__mf__press_cnt__x1_y1",
869
+ "short_mean__interception_cnt__x2_y1",
870
+ "opp__long_mean__mf__recov_cnt__x1_y1",
871
+ "long_mean__actual_press_share__x3_y0",
872
+ "short_mean__mf__recepciones_area",
873
+ "long_std__actual_press_share__x3_y2",
874
+ "opp__long_mean__mf__recuperaciones_campo_propio",
875
+ "opp__short_mean__interception_cnt__x1_y1",
876
+ "long_std__actual_press_share__x2_y1",
877
+ "opp__short_mean__mf__high_recov_share",
878
+ "short_mean__mf__pct_centros_pases_totales_ultimo_tercio",
879
+ "long_mean__zone_actions__Cut_Back__Izq_",
880
+ "long_mean__mf__press_cnt__x1_y2",
881
+ "opp__short_mean__mf__attack_zone_share__Half-Space (Der)",
882
+ "opp__long_mean__mf__attack_zone_share__Cut-Back (Der)",
883
+ "league_Austrian Bundesliga",
884
+ "short_mean__mf__attack_zone_pvAdded__Security Behind",
885
+ "opp__long_mean__zone_actions__Deep_Cross__Izq___opp",
886
+ "opp__short_mean__mf__recuperaciones_campo_propio",
887
+ "short_mean__mf__press_int_sum__x3_y1",
888
+ "short_mean__mf__press_cnt__x1_y2",
889
+ "opp__short_mean__mf__recov_cnt__x1_y1",
890
+ "short_mean__mf__ritmo_circulacion_pases_por_min",
891
+ "long_mean__actual_recovery_share__x2_y2",
892
+ "long_mean__interception_cnt__x2_y1",
893
+ "long_mean__mf__press_cnt__x2_y0",
894
+ "league_French Ligue 2",
895
+ "short_mean__actual_recovery_share__x2_y2",
896
+ "long_mean__mf__attack_zone_pvAdded__Security Behind",
897
+ "short_mean__mf__press_cnt__x2_y0",
898
+ "opp__short_mean__mf__attack_zone_share__Security Behind",
899
+ "opp__long_mean__mf__attack_zone_share__Deep Cross (Der)",
900
+ "opp__long_mean__mf__attack_zone_share__Scoring Zone",
901
+ "long_mean__zone_actions__Cross__Izq_",
902
+ "short_mean__zone_actions__Cross__Izq_",
903
+ "short_mean__mf__high_recov_share",
904
+ "long_mean__mf__attack_zone_share__Half-Space (Izq)",
905
+ "long_mean__mf__recov_cnt__x1_y1",
906
+ "short_mean__zone_pvAdded__Half_Space__Izq_",
907
+ "long_mean__zone_pvAdded__Half_Space__Izq_",
908
+ "opp__short_mean__zone_actions__Deep_Cross__Izq___opp",
909
+ "long_mean__mf__press_cnt__x3_y0",
910
+ "short_mean__zone_pvAdded__Deep_Cross__Der_",
911
+ "short_mean__interception_cnt__x2_y0",
912
+ "long_mean__mf__shots_on_target",
913
+ "short_mean__actual_press_share__x1_y1",
914
+ "long_mean__mf__progresion_promedio_m_por_posesion",
915
+ "short_mean__mf__pases_prom_secuencia",
916
+ "opp__long_mean__actual_recovery_share__x1_y1",
917
+ "long_mean__mf__ritmo_circulacion_pases_por_min",
918
+ "opp__short_mean__mf__attack_zone_share__Half-Space (Izq)",
919
+ "opp__long_mean__mf__attack_zone_share__Cross (Der)",
920
+ "long_mean__zone_pvAdded__Deep_Cross__Der_",
921
+ "long_mean__mf__pases_prom_secuencia",
922
+ "short_mean__mf__progresion_promedio_m_por_posesion",
923
+ "long_mean__mf__pvValue_sum",
924
+ "long_mean__mf__attack_zone_share__Scoring Zone",
925
+ "short_mean__mf__recov_cnt__x2_y1",
926
+ "long_mean__shots_total",
927
+ "opp__long_mean__mf__attack_zone_share__Creativity Zone",
928
+ "long_mean__mf__recov_cnt__x2_y1",
929
+ "opp__long_mean__mf__attack_zone_share__Cut-Back (Izq)",
930
+ "short_mean__mf__attack_zone_share__Cut-Back (Der)",
931
+ "short_mean__mf__press_cnt__x3_y0",
932
+ "short_mean__shots_total",
933
+ "short_mean__mf__recov_cnt__x1_y1",
934
+ "long_mean__interception_cnt__x2_y0",
935
+ "opp__long_mean__mf__pct_centros_pases_totales_ultimo_tercio",
936
+ "opp__long_mean__mf__recov_cnt__x1_y2",
937
+ "long_std__actual_press_share__x0_y2",
938
+ "short_mean__interception_cnt__x3_y0",
939
+ "is_home_num",
940
+ "short_mean__mf__press_cnt__x1_y0",
941
+ "long_mean__mf__tiros_fuera_de_area",
942
+ "opp__short_mean__mf__attack_zone_share__Deep Cross (Izq)",
943
+ "opp__short_mean__actual_recovery_share__x1_y1",
944
+ "long_mean__interception_cnt__x2_y2",
945
+ "long_mean__actual_press_share__x0_y1",
946
+ "short_mean__mf__attack_zone_share__Half-Space (Der)",
947
+ "short_mean__interception_cnt__x2_y2",
948
+ "short_mean__mf__shots_on_target",
949
+ "short_mean__zone_actions__Scoring_Zone",
950
+ "long_mean__zone_actions__Deep_Cross__Der___opp",
951
+ "opp__long_mean__mf__attack_zone_share__Cross (Izq)",
952
+ "short_mean__mf__attack_zone_share__Cut-Back (Izq)",
953
+ "long_std__actual_press_share__x3_y1",
954
+ "short_mean__actual_press_share__x0_y1",
955
+ "long_mean__mf__ancho_promedio_m_por_posesion",
956
+ "short_mean__mf__ancho_promedio_m_por_posesion",
957
+ "long_mean__mf__press_cnt__x1_y0",
958
+ "opp__long_mean__zone_actions__Half_Space__Izq___opp",
959
+ "long_mean__actual_press_share__x0_y2",
960
+ "opp__short_mean__zone_actions__Half_Space__Izq___opp",
961
+ "short_mean__mf__tiros_fuera_de_area",
962
+ "opp__long_mean__zone_actions__Deep_Cross__Der___opp",
963
+ "long_mean__mf__pases_totales_ultimo_tercio",
964
+ "opp__long_mean__mf__recov_cnt__x1_y0",
965
+ "short_mean__mf__attack_zone_pvAdded__Half-Space (Izq)",
966
+ "long_mean__zone_actions__Half_Space__Der___opp",
967
+ "opp__long_mean__mf__attack_zone_pvAdded__Security Behind",
968
+ "opp__long_mean__zone_actions__Half_Space__Der___opp",
969
+ "opp__short_mean__zone_actions__Half_Space__Der___opp",
970
+ "opp__short_mean__mf__attack_zone_pvAdded__Security Behind"
971
  ]
972
  },
973
  "modelos/pv_distribution_gnn": {
 
1004
  ],
1005
  "Train": [
1006
  "split TEMPORAL",
1007
+ "7.395 filas de train",
1008
+ "842 de validación (desde 2025-11-17)",
1009
+ "hasta 260 épocas con early stopping",
1010
  "RANDOM_SEED=42"
1011
  ],
1012
  "Test": [
1013
+ "981 filas (temporal, aparte)",
1014
  "MAE contra los dos baselines"
1015
+ ],
1016
+ "Features globales (1069, SIN poda)": [
1017
+ "long_mean__actual_attack_share__Creativity_Zone",
1018
+ "long_mean__actual_attack_share__Cross__Der_",
1019
+ "long_mean__actual_attack_share__Cross__Izq_",
1020
+ "long_mean__actual_attack_share__Cut_Back__Der_",
1021
+ "long_mean__actual_attack_share__Cut_Back__Izq_",
1022
+ "long_mean__actual_attack_share__Deep_Cross__Der_",
1023
+ "long_mean__actual_attack_share__Deep_Cross__Izq_",
1024
+ "long_mean__actual_attack_share__Half_Space__Der_",
1025
+ "long_mean__actual_attack_share__Half_Space__Izq_",
1026
+ "long_mean__actual_attack_share__Scoring_Zone",
1027
+ "long_mean__actual_conceded_attack_share__Creativity_Zone",
1028
+ "long_mean__actual_conceded_attack_share__Cross__Der_",
1029
+ "long_mean__actual_conceded_attack_share__Cross__Izq_",
1030
+ "long_mean__actual_conceded_attack_share__Cut_Back__Der_",
1031
+ "long_mean__actual_conceded_attack_share__Cut_Back__Izq_",
1032
+ "long_mean__actual_conceded_attack_share__Deep_Cross__Der_",
1033
+ "long_mean__actual_conceded_attack_share__Deep_Cross__Izq_",
1034
+ "long_mean__actual_conceded_attack_share__Half_Space__Der_",
1035
+ "long_mean__actual_conceded_attack_share__Half_Space__Izq_",
1036
+ "long_mean__actual_conceded_attack_share__Scoring_Zone",
1037
+ "long_mean__actual_conceded_pv_share__Creativity_Zone",
1038
+ "long_mean__actual_conceded_pv_share__Cross__Der_",
1039
+ "long_mean__actual_conceded_pv_share__Cross__Izq_",
1040
+ "long_mean__actual_conceded_pv_share__Cut_Back__Der_",
1041
+ "long_mean__actual_conceded_pv_share__Cut_Back__Izq_",
1042
+ "long_mean__actual_conceded_pv_share__Deep_Cross__Der_",
1043
+ "long_mean__actual_conceded_pv_share__Deep_Cross__Izq_",
1044
+ "long_mean__actual_conceded_pv_share__Half_Space__Der_",
1045
+ "long_mean__actual_conceded_pv_share__Half_Space__Izq_",
1046
+ "long_mean__actual_conceded_pv_share__Scoring_Zone",
1047
+ "long_mean__actual_press_share__x0_y0",
1048
+ "long_mean__actual_press_share__x0_y1",
1049
+ "long_mean__actual_press_share__x0_y2",
1050
+ "long_mean__actual_press_share__x1_y0",
1051
+ "long_mean__actual_press_share__x1_y1",
1052
+ "long_mean__actual_press_share__x1_y2",
1053
+ "long_mean__actual_press_share__x2_y0",
1054
+ "long_mean__actual_press_share__x2_y1",
1055
+ "long_mean__actual_press_share__x2_y2",
1056
+ "long_mean__actual_press_share__x3_y0",
1057
+ "long_mean__actual_press_share__x3_y1",
1058
+ "long_mean__actual_press_share__x3_y2",
1059
+ "long_mean__actual_pv_share__Creativity_Zone",
1060
+ "long_mean__actual_pv_share__Cross__Der_",
1061
+ "long_mean__actual_pv_share__Cross__Izq_",
1062
+ "long_mean__actual_pv_share__Cut_Back__Der_",
1063
+ "long_mean__actual_pv_share__Cut_Back__Izq_",
1064
+ "long_mean__actual_pv_share__Deep_Cross__Der_",
1065
+ "long_mean__actual_pv_share__Deep_Cross__Izq_",
1066
+ "long_mean__actual_pv_share__Half_Space__Der_",
1067
+ "long_mean__actual_pv_share__Half_Space__Izq_",
1068
+ "long_mean__actual_pv_share__Scoring_Zone",
1069
+ "long_mean__actual_recovery_share__x0_y0",
1070
+ "long_mean__actual_recovery_share__x0_y1",
1071
+ "long_mean__actual_recovery_share__x0_y2",
1072
+ "long_mean__actual_recovery_share__x1_y0",
1073
+ "long_mean__actual_recovery_share__x1_y1",
1074
+ "long_mean__actual_recovery_share__x1_y2",
1075
+ "long_mean__actual_recovery_share__x2_y0",
1076
+ "long_mean__actual_recovery_share__x2_y1",
1077
+ "long_mean__actual_recovery_share__x2_y2",
1078
+ "long_mean__actual_recovery_share__x3_y0",
1079
+ "long_mean__actual_recovery_share__x3_y1",
1080
+ "long_mean__actual_recovery_share__x3_y2",
1081
+ "long_mean__goals_against",
1082
+ "long_mean__goals_for",
1083
+ "long_mean__goals_for__opp",
1084
+ "long_mean__interception_cnt__x0_y0",
1085
+ "long_mean__interception_cnt__x0_y1",
1086
+ "long_mean__interception_cnt__x0_y2",
1087
+ "long_mean__interception_cnt__x1_y0",
1088
+ "long_mean__interception_cnt__x1_y1",
1089
+ "long_mean__interception_cnt__x1_y2",
1090
+ "long_mean__interception_cnt__x2_y0",
1091
+ "long_mean__interception_cnt__x2_y1",
1092
+ "long_mean__interception_cnt__x2_y2",
1093
+ "long_mean__interception_cnt__x3_y0",
1094
+ "long_mean__interception_cnt__x3_y1",
1095
+ "long_mean__interception_cnt__x3_y2",
1096
+ "long_mean__linesBroken_total",
1097
+ "long_mean__mf__acciones_defensivas_en_ofensiva",
1098
+ "long_mean__mf__acciones_defensivas_totales",
1099
+ "long_mean__mf__altura_media_recuperacion",
1100
+ "long_mean__mf__ancho_promedio_m_por_posesion",
1101
+ "long_mean__mf__attack_zone_pvAdded__Creativity Zone",
1102
+ "long_mean__mf__attack_zone_pvAdded__Cross (Der)",
1103
+ "long_mean__mf__attack_zone_pvAdded__Cross (Izq)",
1104
+ "long_mean__mf__attack_zone_pvAdded__Cut-Back (Der)",
1105
+ "long_mean__mf__attack_zone_pvAdded__Cut-Back (Izq)",
1106
+ "long_mean__mf__attack_zone_pvAdded__Deep Cross (Der)",
1107
+ "long_mean__mf__attack_zone_pvAdded__Deep Cross (Izq)",
1108
+ "long_mean__mf__attack_zone_pvAdded__Half-Space (Der)",
1109
+ "long_mean__mf__attack_zone_pvAdded__Half-Space (Izq)",
1110
+ "long_mean__mf__attack_zone_pvAdded__Scoring Zone",
1111
+ "long_mean__mf__attack_zone_pvAdded__Security Behind",
1112
+ "long_mean__mf__attack_zone_share__Creativity Zone",
1113
+ "long_mean__mf__attack_zone_share__Cross (Der)",
1114
+ "long_mean__mf__attack_zone_share__Cross (Izq)",
1115
+ "long_mean__mf__attack_zone_share__Cut-Back (Der)",
1116
+ "long_mean__mf__attack_zone_share__Cut-Back (Izq)",
1117
+ "long_mean__mf__attack_zone_share__Deep Cross (Der)",
1118
+ "long_mean__mf__attack_zone_share__Deep Cross (Izq)",
1119
+ "long_mean__mf__attack_zone_share__Half-Space (Der)",
1120
+ "long_mean__mf__attack_zone_share__Half-Space (Izq)",
1121
+ "long_mean__mf__attack_zone_share__Scoring Zone",
1122
+ "long_mean__mf__attack_zone_share__Security Behind",
1123
+ "long_mean__mf__avg_end_x_pass",
1124
+ "long_mean__mf__big_chances_generadas",
1125
+ "long_mean__mf__centros_totales_ultimo_tercio",
1126
+ "long_mean__mf__counter_press_recovery",
1127
+ "long_mean__mf__cross_share_last3",
1128
+ "long_mean__mf__final3_success",
1129
+ "long_mean__mf__high_recov_share",
1130
+ "long_mean__mf__pases_area",
1131
+ "long_mean__mf__pases_progresivos_sobre_pases",
1132
+ "long_mean__mf__pases_prom_secuencia",
1133
+ "long_mean__mf__pases_totales_ultimo_tercio",
1134
+ "long_mean__mf__passes_per_loss",
1135
+ "long_mean__mf__passes_per_shot",
1136
+ "long_mean__mf__pct_centros_pases_totales_ultimo_tercio",
1137
+ "long_mean__mf__pct_pases_largos",
1138
+ "long_mean__mf__possession_nunique",
1139
+ "long_mean__mf__ppda",
1140
+ "long_mean__mf__ppda_inv",
1141
+ "long_mean__mf__press_cnt__x0_y0",
1142
+ "long_mean__mf__press_cnt__x0_y1",
1143
+ "long_mean__mf__press_cnt__x0_y2",
1144
+ "long_mean__mf__press_cnt__x1_y0",
1145
+ "long_mean__mf__press_cnt__x1_y1",
1146
+ "long_mean__mf__press_cnt__x1_y2",
1147
+ "long_mean__mf__press_cnt__x2_y0",
1148
+ "long_mean__mf__press_cnt__x2_y1",
1149
+ "long_mean__mf__press_cnt__x2_y2",
1150
+ "long_mean__mf__press_cnt__x3_y0",
1151
+ "long_mean__mf__press_cnt__x3_y1",
1152
+ "long_mean__mf__press_cnt__x3_y2",
1153
+ "long_mean__mf__press_int_sum__x0_y0",
1154
+ "long_mean__mf__press_int_sum__x0_y1",
1155
+ "long_mean__mf__press_int_sum__x0_y2",
1156
+ "long_mean__mf__press_int_sum__x1_y0",
1157
+ "long_mean__mf__press_int_sum__x1_y1",
1158
+ "long_mean__mf__press_int_sum__x1_y2",
1159
+ "long_mean__mf__press_int_sum__x2_y0",
1160
+ "long_mean__mf__press_int_sum__x2_y1",
1161
+ "long_mean__mf__press_int_sum__x2_y2",
1162
+ "long_mean__mf__press_int_sum__x3_y0",
1163
+ "long_mean__mf__press_int_sum__x3_y1",
1164
+ "long_mean__mf__press_int_sum__x3_y2",
1165
+ "long_mean__mf__pressure_intensity_sum",
1166
+ "long_mean__mf__pressures",
1167
+ "long_mean__mf__progresion_promedio_m_por_posesion",
1168
+ "long_mean__mf__pvAdded_sum",
1169
+ "long_mean__mf__pvValue_sum",
1170
+ "long_mean__mf__recepciones_area",
1171
+ "long_mean__mf__recov_cnt__x0_y0",
1172
+ "long_mean__mf__recov_cnt__x0_y1",
1173
+ "long_mean__mf__recov_cnt__x0_y2",
1174
+ "long_mean__mf__recov_cnt__x1_y0",
1175
+ "long_mean__mf__recov_cnt__x1_y1",
1176
+ "long_mean__mf__recov_cnt__x1_y2",
1177
+ "long_mean__mf__recov_cnt__x2_y0",
1178
+ "long_mean__mf__recov_cnt__x2_y1",
1179
+ "long_mean__mf__recov_cnt__x2_y2",
1180
+ "long_mean__mf__recov_cnt__x3_y0",
1181
+ "long_mean__mf__recov_cnt__x3_y1",
1182
+ "long_mean__mf__recov_cnt__x3_y2",
1183
+ "long_mean__mf__recuperaciones_campo_propio",
1184
+ "long_mean__mf__recuperaciones_campo_rival",
1185
+ "long_mean__mf__ritmo_circulacion_pases_por_min",
1186
+ "long_mean__mf__shots",
1187
+ "long_mean__mf__shots_on_target",
1188
+ "long_mean__mf__tiros_area_grande",
1189
+ "long_mean__mf__tiros_area_pequeña",
1190
+ "long_mean__mf__tiros_fuera_de_area",
1191
+ "long_mean__mf__touches_area",
1192
+ "long_mean__mf__xg_por_tiro",
1193
+ "long_mean__mf__xg_suma_tiros",
1194
+ "long_mean__passes_long",
1195
+ "long_mean__passes_per_possession",
1196
+ "long_mean__passes_short",
1197
+ "long_mean__passes_total",
1198
+ "long_mean__possessions_nunique",
1199
+ "long_mean__press_cnt__x0_y0",
1200
+ "long_mean__press_cnt__x0_y1",
1201
+ "long_mean__press_cnt__x0_y2",
1202
+ "long_mean__press_cnt__x1_y0",
1203
+ "long_mean__press_cnt__x1_y1",
1204
+ "long_mean__press_cnt__x1_y2",
1205
+ "long_mean__press_cnt__x2_y0",
1206
+ "long_mean__press_cnt__x2_y1",
1207
+ "long_mean__press_cnt__x2_y2",
1208
+ "long_mean__press_cnt__x3_y0",
1209
+ "long_mean__press_cnt__x3_y1",
1210
+ "long_mean__press_cnt__x3_y2",
1211
+ "long_mean__pressures_total",
1212
+ "long_mean__pvAdded_total",
1213
+ "long_mean__pvAdded_total__opp",
1214
+ "long_mean__recoveries_total",
1215
+ "long_mean__short_long_pass_ratio",
1216
+ "long_mean__shots_total",
1217
+ "long_mean__shots_total__opp",
1218
+ "long_mean__zone_actions__Creativity_Zone",
1219
+ "long_mean__zone_actions__Creativity_Zone__opp",
1220
+ "long_mean__zone_actions__Cross__Der_",
1221
+ "long_mean__zone_actions__Cross__Der___opp",
1222
+ "long_mean__zone_actions__Cross__Izq_",
1223
+ "long_mean__zone_actions__Cross__Izq___opp",
1224
+ "long_mean__zone_actions__Cut_Back__Der_",
1225
+ "long_mean__zone_actions__Cut_Back__Der___opp",
1226
+ "long_mean__zone_actions__Cut_Back__Izq_",
1227
+ "long_mean__zone_actions__Cut_Back__Izq___opp",
1228
+ "long_mean__zone_actions__Deep_Cross__Der_",
1229
+ "long_mean__zone_actions__Deep_Cross__Der___opp",
1230
+ "long_mean__zone_actions__Deep_Cross__Izq_",
1231
+ "long_mean__zone_actions__Deep_Cross__Izq___opp",
1232
+ "long_mean__zone_actions__Half_Space__Der_",
1233
+ "long_mean__zone_actions__Half_Space__Der___opp",
1234
+ "long_mean__zone_actions__Half_Space__Izq_",
1235
+ "long_mean__zone_actions__Half_Space__Izq___opp",
1236
+ "long_mean__zone_actions__Scoring_Zone",
1237
+ "long_mean__zone_actions__Scoring_Zone__opp",
1238
+ "long_mean__zone_linesBroken__Creativity_Zone",
1239
+ "long_mean__zone_linesBroken__Cross__Der_",
1240
+ "long_mean__zone_linesBroken__Cross__Izq_",
1241
+ "long_mean__zone_linesBroken__Cut_Back__Der_",
1242
+ "long_mean__zone_linesBroken__Cut_Back__Izq_",
1243
+ "long_mean__zone_linesBroken__Deep_Cross__Der_",
1244
+ "long_mean__zone_linesBroken__Deep_Cross__Izq_",
1245
+ "long_mean__zone_linesBroken__Half_Space__Der_",
1246
+ "long_mean__zone_linesBroken__Half_Space__Izq_",
1247
+ "long_mean__zone_linesBroken__Scoring_Zone",
1248
+ "long_mean__zone_pvAdded_shots__Creativity_Zone",
1249
+ "long_mean__zone_pvAdded_shots__Cross__Der_",
1250
+ "long_mean__zone_pvAdded_shots__Cross__Izq_",
1251
+ "long_mean__zone_pvAdded_shots__Cut_Back__Der_",
1252
+ "long_mean__zone_pvAdded_shots__Cut_Back__Izq_",
1253
+ "long_mean__zone_pvAdded_shots__Deep_Cross__Der_",
1254
+ "long_mean__zone_pvAdded_shots__Deep_Cross__Izq_",
1255
+ "long_mean__zone_pvAdded_shots__Half_Space__Der_",
1256
+ "long_mean__zone_pvAdded_shots__Half_Space__Izq_",
1257
+ "long_mean__zone_pvAdded_shots__Scoring_Zone",
1258
+ "long_std__actual_press_share__x0_y0",
1259
+ "long_std__actual_press_share__x0_y1",
1260
+ "long_std__actual_press_share__x0_y2",
1261
+ "long_std__actual_press_share__x1_y0",
1262
+ "long_std__actual_press_share__x1_y1",
1263
+ "long_std__actual_press_share__x1_y2",
1264
+ "long_std__actual_press_share__x2_y0",
1265
+ "long_std__actual_press_share__x2_y1",
1266
+ "long_std__actual_press_share__x2_y2",
1267
+ "long_std__actual_press_share__x3_y0",
1268
+ "long_std__actual_press_share__x3_y1",
1269
+ "long_std__actual_press_share__x3_y2",
1270
+ "long_std__actual_recovery_share__x0_y0",
1271
+ "long_std__actual_recovery_share__x0_y1",
1272
+ "long_std__actual_recovery_share__x0_y2",
1273
+ "long_std__actual_recovery_share__x1_y0",
1274
+ "long_std__actual_recovery_share__x1_y1",
1275
+ "long_std__actual_recovery_share__x1_y2",
1276
+ "long_std__actual_recovery_share__x2_y0",
1277
+ "long_std__actual_recovery_share__x2_y1",
1278
+ "long_std__actual_recovery_share__x2_y2",
1279
+ "long_std__actual_recovery_share__x3_y0",
1280
+ "long_std__actual_recovery_share__x3_y1",
1281
+ "long_std__actual_recovery_share__x3_y2",
1282
+ "opp__long_mean__actual_attack_share__Creativity_Zone",
1283
+ "opp__long_mean__actual_attack_share__Cross__Der_",
1284
+ "opp__long_mean__actual_attack_share__Cross__Izq_",
1285
+ "opp__long_mean__actual_attack_share__Cut_Back__Der_",
1286
+ "opp__long_mean__actual_attack_share__Cut_Back__Izq_",
1287
+ "opp__long_mean__actual_attack_share__Deep_Cross__Der_",
1288
+ "opp__long_mean__actual_attack_share__Deep_Cross__Izq_",
1289
+ "opp__long_mean__actual_attack_share__Half_Space__Der_",
1290
+ "opp__long_mean__actual_attack_share__Half_Space__Izq_",
1291
+ "opp__long_mean__actual_attack_share__Scoring_Zone",
1292
+ "opp__long_mean__actual_conceded_attack_share__Creativity_Zone",
1293
+ "opp__long_mean__actual_conceded_attack_share__Cross__Der_",
1294
+ "opp__long_mean__actual_conceded_attack_share__Cross__Izq_",
1295
+ "opp__long_mean__actual_conceded_attack_share__Cut_Back__Der_",
1296
+ "opp__long_mean__actual_conceded_attack_share__Cut_Back__Izq_",
1297
+ "opp__long_mean__actual_conceded_attack_share__Deep_Cross__Der_",
1298
+ "opp__long_mean__actual_conceded_attack_share__Deep_Cross__Izq_",
1299
+ "opp__long_mean__actual_conceded_attack_share__Half_Space__Der_",
1300
+ "opp__long_mean__actual_conceded_attack_share__Half_Space__Izq_",
1301
+ "opp__long_mean__actual_conceded_attack_share__Scoring_Zone",
1302
+ "opp__long_mean__actual_conceded_pv_share__Creativity_Zone",
1303
+ "opp__long_mean__actual_conceded_pv_share__Cross__Der_",
1304
+ "opp__long_mean__actual_conceded_pv_share__Cross__Izq_",
1305
+ "opp__long_mean__actual_conceded_pv_share__Cut_Back__Der_",
1306
+ "opp__long_mean__actual_conceded_pv_share__Cut_Back__Izq_",
1307
+ "opp__long_mean__actual_conceded_pv_share__Deep_Cross__Der_",
1308
+ "opp__long_mean__actual_conceded_pv_share__Deep_Cross__Izq_",
1309
+ "opp__long_mean__actual_conceded_pv_share__Half_Space__Der_",
1310
+ "opp__long_mean__actual_conceded_pv_share__Half_Space__Izq_",
1311
+ "opp__long_mean__actual_conceded_pv_share__Scoring_Zone",
1312
+ "opp__long_mean__actual_press_share__x0_y0",
1313
+ "opp__long_mean__actual_press_share__x0_y1",
1314
+ "opp__long_mean__actual_press_share__x0_y2",
1315
+ "opp__long_mean__actual_press_share__x1_y0",
1316
+ "opp__long_mean__actual_press_share__x1_y1",
1317
+ "opp__long_mean__actual_press_share__x1_y2",
1318
+ "opp__long_mean__actual_press_share__x2_y0",
1319
+ "opp__long_mean__actual_press_share__x2_y1",
1320
+ "opp__long_mean__actual_press_share__x2_y2",
1321
+ "opp__long_mean__actual_press_share__x3_y0",
1322
+ "opp__long_mean__actual_press_share__x3_y1",
1323
+ "opp__long_mean__actual_press_share__x3_y2",
1324
+ "opp__long_mean__actual_pv_share__Creativity_Zone",
1325
+ "opp__long_mean__actual_pv_share__Cross__Der_",
1326
+ "opp__long_mean__actual_pv_share__Cross__Izq_",
1327
+ "opp__long_mean__actual_pv_share__Cut_Back__Der_",
1328
+ "opp__long_mean__actual_pv_share__Cut_Back__Izq_",
1329
+ "opp__long_mean__actual_pv_share__Deep_Cross__Der_",
1330
+ "opp__long_mean__actual_pv_share__Deep_Cross__Izq_",
1331
+ "opp__long_mean__actual_pv_share__Half_Space__Der_",
1332
+ "opp__long_mean__actual_pv_share__Half_Space__Izq_",
1333
+ "opp__long_mean__actual_pv_share__Scoring_Zone",
1334
+ "opp__long_mean__actual_recovery_share__x0_y0",
1335
+ "opp__long_mean__actual_recovery_share__x0_y1",
1336
+ "opp__long_mean__actual_recovery_share__x0_y2",
1337
+ "opp__long_mean__actual_recovery_share__x1_y0",
1338
+ "opp__long_mean__actual_recovery_share__x1_y1",
1339
+ "opp__long_mean__actual_recovery_share__x1_y2",
1340
+ "opp__long_mean__actual_recovery_share__x2_y0",
1341
+ "opp__long_mean__actual_recovery_share__x2_y1",
1342
+ "opp__long_mean__actual_recovery_share__x2_y2",
1343
+ "opp__long_mean__actual_recovery_share__x3_y0",
1344
+ "opp__long_mean__actual_recovery_share__x3_y1",
1345
+ "opp__long_mean__actual_recovery_share__x3_y2",
1346
+ "opp__long_mean__goals_against",
1347
+ "opp__long_mean__goals_for",
1348
+ "opp__long_mean__goals_for__opp",
1349
+ "opp__long_mean__interception_cnt__x0_y0",
1350
+ "opp__long_mean__interception_cnt__x0_y1",
1351
+ "opp__long_mean__interception_cnt__x0_y2",
1352
+ "opp__long_mean__interception_cnt__x1_y0",
1353
+ "opp__long_mean__interception_cnt__x1_y1",
1354
+ "opp__long_mean__interception_cnt__x1_y2",
1355
+ "opp__long_mean__interception_cnt__x2_y0",
1356
+ "opp__long_mean__interception_cnt__x2_y1",
1357
+ "opp__long_mean__interception_cnt__x2_y2",
1358
+ "opp__long_mean__interception_cnt__x3_y0",
1359
+ "opp__long_mean__interception_cnt__x3_y1",
1360
+ "opp__long_mean__interception_cnt__x3_y2",
1361
+ "opp__long_mean__linesBroken_total",
1362
+ "opp__long_mean__mf__acciones_defensivas_en_ofensiva",
1363
+ "opp__long_mean__mf__acciones_defensivas_totales",
1364
+ "opp__long_mean__mf__altura_media_recuperacion",
1365
+ "opp__long_mean__mf__ancho_promedio_m_por_posesion",
1366
+ "opp__long_mean__mf__attack_zone_pvAdded__Creativity Zone",
1367
+ "opp__long_mean__mf__attack_zone_pvAdded__Cross (Der)",
1368
+ "opp__long_mean__mf__attack_zone_pvAdded__Cross (Izq)",
1369
+ "opp__long_mean__mf__attack_zone_pvAdded__Cut-Back (Der)",
1370
+ "opp__long_mean__mf__attack_zone_pvAdded__Cut-Back (Izq)",
1371
+ "opp__long_mean__mf__attack_zone_pvAdded__Deep Cross (Der)",
1372
+ "opp__long_mean__mf__attack_zone_pvAdded__Deep Cross (Izq)",
1373
+ "opp__long_mean__mf__attack_zone_pvAdded__Half-Space (Der)",
1374
+ "opp__long_mean__mf__attack_zone_pvAdded__Half-Space (Izq)",
1375
+ "opp__long_mean__mf__attack_zone_pvAdded__Scoring Zone",
1376
+ "opp__long_mean__mf__attack_zone_pvAdded__Security Behind",
1377
+ "opp__long_mean__mf__attack_zone_share__Creativity Zone",
1378
+ "opp__long_mean__mf__attack_zone_share__Cross (Der)",
1379
+ "opp__long_mean__mf__attack_zone_share__Cross (Izq)",
1380
+ "opp__long_mean__mf__attack_zone_share__Cut-Back (Der)",
1381
+ "opp__long_mean__mf__attack_zone_share__Cut-Back (Izq)",
1382
+ "opp__long_mean__mf__attack_zone_share__Deep Cross (Der)",
1383
+ "opp__long_mean__mf__attack_zone_share__Deep Cross (Izq)",
1384
+ "opp__long_mean__mf__attack_zone_share__Half-Space (Der)",
1385
+ "opp__long_mean__mf__attack_zone_share__Half-Space (Izq)",
1386
+ "opp__long_mean__mf__attack_zone_share__Scoring Zone",
1387
+ "opp__long_mean__mf__attack_zone_share__Security Behind",
1388
+ "opp__long_mean__mf__avg_end_x_pass",
1389
+ "opp__long_mean__mf__big_chances_generadas",
1390
+ "opp__long_mean__mf__centros_totales_ultimo_tercio",
1391
+ "opp__long_mean__mf__counter_press_recovery",
1392
+ "opp__long_mean__mf__cross_share_last3",
1393
+ "opp__long_mean__mf__final3_success",
1394
+ "opp__long_mean__mf__high_recov_share",
1395
+ "opp__long_mean__mf__pases_area",
1396
+ "opp__long_mean__mf__pases_progresivos_sobre_pases",
1397
+ "opp__long_mean__mf__pases_prom_secuencia",
1398
+ "opp__long_mean__mf__pases_totales_ultimo_tercio",
1399
+ "opp__long_mean__mf__passes_per_loss",
1400
+ "opp__long_mean__mf__passes_per_shot",
1401
+ "opp__long_mean__mf__pct_centros_pases_totales_ultimo_tercio",
1402
+ "opp__long_mean__mf__pct_pases_largos",
1403
+ "opp__long_mean__mf__possession_nunique",
1404
+ "opp__long_mean__mf__ppda",
1405
+ "opp__long_mean__mf__ppda_inv",
1406
+ "opp__long_mean__mf__press_cnt__x0_y0",
1407
+ "opp__long_mean__mf__press_cnt__x0_y1",
1408
+ "opp__long_mean__mf__press_cnt__x0_y2",
1409
+ "opp__long_mean__mf__press_cnt__x1_y0",
1410
+ "opp__long_mean__mf__press_cnt__x1_y1",
1411
+ "opp__long_mean__mf__press_cnt__x1_y2",
1412
+ "opp__long_mean__mf__press_cnt__x2_y0",
1413
+ "opp__long_mean__mf__press_cnt__x2_y1",
1414
+ "opp__long_mean__mf__press_cnt__x2_y2",
1415
+ "opp__long_mean__mf__press_cnt__x3_y0",
1416
+ "opp__long_mean__mf__press_cnt__x3_y1",
1417
+ "opp__long_mean__mf__press_cnt__x3_y2",
1418
+ "opp__long_mean__mf__press_int_sum__x0_y0",
1419
+ "opp__long_mean__mf__press_int_sum__x0_y1",
1420
+ "opp__long_mean__mf__press_int_sum__x0_y2",
1421
+ "opp__long_mean__mf__press_int_sum__x1_y0",
1422
+ "opp__long_mean__mf__press_int_sum__x1_y1",
1423
+ "opp__long_mean__mf__press_int_sum__x1_y2",
1424
+ "opp__long_mean__mf__press_int_sum__x2_y0",
1425
+ "opp__long_mean__mf__press_int_sum__x2_y1",
1426
+ "opp__long_mean__mf__press_int_sum__x2_y2",
1427
+ "opp__long_mean__mf__press_int_sum__x3_y0",
1428
+ "opp__long_mean__mf__press_int_sum__x3_y1",
1429
+ "opp__long_mean__mf__press_int_sum__x3_y2",
1430
+ "opp__long_mean__mf__pressure_intensity_sum",
1431
+ "opp__long_mean__mf__pressures",
1432
+ "opp__long_mean__mf__progresion_promedio_m_por_posesion",
1433
+ "opp__long_mean__mf__pvAdded_sum",
1434
+ "opp__long_mean__mf__pvValue_sum",
1435
+ "opp__long_mean__mf__recepciones_area",
1436
+ "opp__long_mean__mf__recov_cnt__x0_y0",
1437
+ "opp__long_mean__mf__recov_cnt__x0_y1",
1438
+ "opp__long_mean__mf__recov_cnt__x0_y2",
1439
+ "opp__long_mean__mf__recov_cnt__x1_y0",
1440
+ "opp__long_mean__mf__recov_cnt__x1_y1",
1441
+ "opp__long_mean__mf__recov_cnt__x1_y2",
1442
+ "opp__long_mean__mf__recov_cnt__x2_y0",
1443
+ "opp__long_mean__mf__recov_cnt__x2_y1",
1444
+ "opp__long_mean__mf__recov_cnt__x2_y2",
1445
+ "opp__long_mean__mf__recov_cnt__x3_y0",
1446
+ "opp__long_mean__mf__recov_cnt__x3_y1",
1447
+ "opp__long_mean__mf__recov_cnt__x3_y2",
1448
+ "opp__long_mean__mf__recuperaciones_campo_propio",
1449
+ "opp__long_mean__mf__recuperaciones_campo_rival",
1450
+ "opp__long_mean__mf__ritmo_circulacion_pases_por_min",
1451
+ "opp__long_mean__mf__shots",
1452
+ "opp__long_mean__mf__shots_on_target",
1453
+ "opp__long_mean__mf__tiros_area_grande",
1454
+ "opp__long_mean__mf__tiros_area_pequeña",
1455
+ "opp__long_mean__mf__tiros_fuera_de_area",
1456
+ "opp__long_mean__mf__touches_area",
1457
+ "opp__long_mean__mf__xg_por_tiro",
1458
+ "opp__long_mean__mf__xg_suma_tiros",
1459
+ "opp__long_mean__passes_long",
1460
+ "opp__long_mean__passes_per_possession",
1461
+ "opp__long_mean__passes_short",
1462
+ "opp__long_mean__passes_total",
1463
+ "opp__long_mean__possessions_nunique",
1464
+ "opp__long_mean__press_cnt__x0_y0",
1465
+ "opp__long_mean__press_cnt__x0_y1",
1466
+ "opp__long_mean__press_cnt__x0_y2",
1467
+ "opp__long_mean__press_cnt__x1_y0",
1468
+ "opp__long_mean__press_cnt__x1_y1",
1469
+ "opp__long_mean__press_cnt__x1_y2",
1470
+ "opp__long_mean__press_cnt__x2_y0",
1471
+ "opp__long_mean__press_cnt__x2_y1",
1472
+ "opp__long_mean__press_cnt__x2_y2",
1473
+ "opp__long_mean__press_cnt__x3_y0",
1474
+ "opp__long_mean__press_cnt__x3_y1",
1475
+ "opp__long_mean__press_cnt__x3_y2",
1476
+ "opp__long_mean__pressures_total",
1477
+ "opp__long_mean__pvAdded_total",
1478
+ "opp__long_mean__pvAdded_total__opp",
1479
+ "opp__long_mean__recoveries_total",
1480
+ "opp__long_mean__short_long_pass_ratio",
1481
+ "opp__long_mean__shots_total",
1482
+ "opp__long_mean__shots_total__opp",
1483
+ "opp__long_mean__zone_actions__Creativity_Zone",
1484
+ "opp__long_mean__zone_actions__Creativity_Zone__opp",
1485
+ "opp__long_mean__zone_actions__Cross__Der_",
1486
+ "opp__long_mean__zone_actions__Cross__Der___opp",
1487
+ "opp__long_mean__zone_actions__Cross__Izq_",
1488
+ "opp__long_mean__zone_actions__Cross__Izq___opp",
1489
+ "opp__long_mean__zone_actions__Cut_Back__Der_",
1490
+ "opp__long_mean__zone_actions__Cut_Back__Der___opp",
1491
+ "opp__long_mean__zone_actions__Cut_Back__Izq_",
1492
+ "opp__long_mean__zone_actions__Cut_Back__Izq___opp",
1493
+ "opp__long_mean__zone_actions__Deep_Cross__Der_",
1494
+ "opp__long_mean__zone_actions__Deep_Cross__Der___opp",
1495
+ "opp__long_mean__zone_actions__Deep_Cross__Izq_",
1496
+ "opp__long_mean__zone_actions__Deep_Cross__Izq___opp",
1497
+ "opp__long_mean__zone_actions__Half_Space__Der_",
1498
+ "opp__long_mean__zone_actions__Half_Space__Der___opp",
1499
+ "opp__long_mean__zone_actions__Half_Space__Izq_",
1500
+ "opp__long_mean__zone_actions__Half_Space__Izq___opp",
1501
+ "opp__long_mean__zone_actions__Scoring_Zone",
1502
+ "opp__long_mean__zone_actions__Scoring_Zone__opp",
1503
+ "opp__long_mean__zone_linesBroken__Creativity_Zone",
1504
+ "opp__long_mean__zone_linesBroken__Cross__Der_",
1505
+ "opp__long_mean__zone_linesBroken__Cross__Izq_",
1506
+ "opp__long_mean__zone_linesBroken__Cut_Back__Der_",
1507
+ "opp__long_mean__zone_linesBroken__Cut_Back__Izq_",
1508
+ "opp__long_mean__zone_linesBroken__Deep_Cross__Der_",
1509
+ "opp__long_mean__zone_linesBroken__Deep_Cross__Izq_",
1510
+ "opp__long_mean__zone_linesBroken__Half_Space__Der_",
1511
+ "opp__long_mean__zone_linesBroken__Half_Space__Izq_",
1512
+ "opp__long_mean__zone_linesBroken__Scoring_Zone",
1513
+ "opp__long_mean__zone_pvAdded__Creativity_Zone",
1514
+ "opp__long_mean__zone_pvAdded__Creativity_Zone__opp",
1515
+ "opp__long_mean__zone_pvAdded__Cross__Der_",
1516
+ "opp__long_mean__zone_pvAdded__Cross__Der___opp",
1517
+ "opp__long_mean__zone_pvAdded__Cross__Izq_",
1518
+ "opp__long_mean__zone_pvAdded__Cross__Izq___opp",
1519
+ "opp__long_mean__zone_pvAdded__Cut_Back__Der_",
1520
+ "opp__long_mean__zone_pvAdded__Cut_Back__Der___opp",
1521
+ "opp__long_mean__zone_pvAdded__Cut_Back__Izq_",
1522
+ "opp__long_mean__zone_pvAdded__Cut_Back__Izq___opp",
1523
+ "opp__long_mean__zone_pvAdded__Deep_Cross__Der_",
1524
+ "opp__long_mean__zone_pvAdded__Deep_Cross__Der___opp",
1525
+ "opp__long_mean__zone_pvAdded__Deep_Cross__Izq_",
1526
+ "opp__long_mean__zone_pvAdded__Deep_Cross__Izq___opp",
1527
+ "opp__long_mean__zone_pvAdded__Half_Space__Der_",
1528
+ "opp__long_mean__zone_pvAdded__Half_Space__Der___opp",
1529
+ "opp__long_mean__zone_pvAdded__Half_Space__Izq_",
1530
+ "opp__long_mean__zone_pvAdded__Half_Space__Izq___opp",
1531
+ "opp__long_mean__zone_pvAdded__Scoring_Zone",
1532
+ "opp__long_mean__zone_pvAdded__Scoring_Zone__opp",
1533
+ "opp__long_mean__zone_pvAdded_shots__Creativity_Zone",
1534
+ "opp__long_mean__zone_pvAdded_shots__Cross__Der_",
1535
+ "opp__long_mean__zone_pvAdded_shots__Cross__Izq_",
1536
+ "opp__long_mean__zone_pvAdded_shots__Cut_Back__Der_",
1537
+ "opp__long_mean__zone_pvAdded_shots__Cut_Back__Izq_",
1538
+ "opp__long_mean__zone_pvAdded_shots__Deep_Cross__Der_",
1539
+ "opp__long_mean__zone_pvAdded_shots__Deep_Cross__Izq_",
1540
+ "opp__long_mean__zone_pvAdded_shots__Half_Space__Der_",
1541
+ "opp__long_mean__zone_pvAdded_shots__Half_Space__Izq_",
1542
+ "opp__long_mean__zone_pvAdded_shots__Scoring_Zone",
1543
+ "opp__long_std__actual_press_share__x0_y0",
1544
+ "opp__long_std__actual_press_share__x0_y1",
1545
+ "opp__long_std__actual_press_share__x0_y2",
1546
+ "opp__long_std__actual_press_share__x1_y0",
1547
+ "opp__long_std__actual_press_share__x1_y1",
1548
+ "opp__long_std__actual_press_share__x1_y2",
1549
+ "opp__long_std__actual_press_share__x2_y0",
1550
+ "opp__long_std__actual_press_share__x2_y1",
1551
+ "opp__long_std__actual_press_share__x2_y2",
1552
+ "opp__long_std__actual_press_share__x3_y0",
1553
+ "opp__long_std__actual_press_share__x3_y1",
1554
+ "opp__long_std__actual_press_share__x3_y2",
1555
+ "opp__long_std__actual_recovery_share__x0_y0",
1556
+ "opp__long_std__actual_recovery_share__x0_y1",
1557
+ "opp__long_std__actual_recovery_share__x0_y2",
1558
+ "opp__long_std__actual_recovery_share__x1_y0",
1559
+ "opp__long_std__actual_recovery_share__x1_y1",
1560
+ "opp__long_std__actual_recovery_share__x1_y2",
1561
+ "opp__long_std__actual_recovery_share__x2_y0",
1562
+ "opp__long_std__actual_recovery_share__x2_y1",
1563
+ "opp__long_std__actual_recovery_share__x2_y2",
1564
+ "opp__long_std__actual_recovery_share__x3_y0",
1565
+ "opp__long_std__actual_recovery_share__x3_y1",
1566
+ "opp__long_std__actual_recovery_share__x3_y2",
1567
+ "opp__short_mean__actual_attack_share__Creativity_Zone",
1568
+ "opp__short_mean__actual_attack_share__Cross__Der_",
1569
+ "opp__short_mean__actual_attack_share__Cross__Izq_",
1570
+ "opp__short_mean__actual_attack_share__Cut_Back__Der_",
1571
+ "opp__short_mean__actual_attack_share__Cut_Back__Izq_",
1572
+ "opp__short_mean__actual_attack_share__Deep_Cross__Der_",
1573
+ "opp__short_mean__actual_attack_share__Deep_Cross__Izq_",
1574
+ "opp__short_mean__actual_attack_share__Half_Space__Der_",
1575
+ "opp__short_mean__actual_attack_share__Half_Space__Izq_",
1576
+ "opp__short_mean__actual_attack_share__Scoring_Zone",
1577
+ "opp__short_mean__actual_conceded_attack_share__Creativity_Zone",
1578
+ "opp__short_mean__actual_conceded_attack_share__Cross__Der_",
1579
+ "opp__short_mean__actual_conceded_attack_share__Cross__Izq_",
1580
+ "opp__short_mean__actual_conceded_attack_share__Cut_Back__Der_",
1581
+ "opp__short_mean__actual_conceded_attack_share__Cut_Back__Izq_",
1582
+ "opp__short_mean__actual_conceded_attack_share__Deep_Cross__Der_",
1583
+ "opp__short_mean__actual_conceded_attack_share__Deep_Cross__Izq_",
1584
+ "opp__short_mean__actual_conceded_attack_share__Half_Space__Der_",
1585
+ "opp__short_mean__actual_conceded_attack_share__Half_Space__Izq_",
1586
+ "opp__short_mean__actual_conceded_attack_share__Scoring_Zone",
1587
+ "opp__short_mean__actual_conceded_pv_share__Creativity_Zone",
1588
+ "opp__short_mean__actual_conceded_pv_share__Cross__Der_",
1589
+ "opp__short_mean__actual_conceded_pv_share__Cross__Izq_",
1590
+ "opp__short_mean__actual_conceded_pv_share__Cut_Back__Der_",
1591
+ "opp__short_mean__actual_conceded_pv_share__Cut_Back__Izq_",
1592
+ "opp__short_mean__actual_conceded_pv_share__Deep_Cross__Der_",
1593
+ "opp__short_mean__actual_conceded_pv_share__Deep_Cross__Izq_",
1594
+ "opp__short_mean__actual_conceded_pv_share__Half_Space__Der_",
1595
+ "opp__short_mean__actual_conceded_pv_share__Half_Space__Izq_",
1596
+ "opp__short_mean__actual_conceded_pv_share__Scoring_Zone",
1597
+ "opp__short_mean__actual_press_share__x0_y0",
1598
+ "opp__short_mean__actual_press_share__x0_y1",
1599
+ "opp__short_mean__actual_press_share__x0_y2",
1600
+ "opp__short_mean__actual_press_share__x1_y0",
1601
+ "opp__short_mean__actual_press_share__x1_y1",
1602
+ "opp__short_mean__actual_press_share__x1_y2",
1603
+ "opp__short_mean__actual_press_share__x2_y0",
1604
+ "opp__short_mean__actual_press_share__x2_y1",
1605
+ "opp__short_mean__actual_press_share__x2_y2",
1606
+ "opp__short_mean__actual_press_share__x3_y0",
1607
+ "opp__short_mean__actual_press_share__x3_y1",
1608
+ "opp__short_mean__actual_press_share__x3_y2",
1609
+ "opp__short_mean__actual_pv_share__Creativity_Zone",
1610
+ "opp__short_mean__actual_pv_share__Cross__Der_",
1611
+ "opp__short_mean__actual_pv_share__Cross__Izq_",
1612
+ "opp__short_mean__actual_pv_share__Cut_Back__Der_",
1613
+ "opp__short_mean__actual_pv_share__Cut_Back__Izq_",
1614
+ "opp__short_mean__actual_pv_share__Deep_Cross__Der_",
1615
+ "opp__short_mean__actual_pv_share__Deep_Cross__Izq_",
1616
+ "opp__short_mean__actual_pv_share__Half_Space__Der_",
1617
+ "opp__short_mean__actual_pv_share__Half_Space__Izq_",
1618
+ "opp__short_mean__actual_pv_share__Scoring_Zone",
1619
+ "opp__short_mean__actual_recovery_share__x0_y0",
1620
+ "opp__short_mean__actual_recovery_share__x0_y1",
1621
+ "opp__short_mean__actual_recovery_share__x0_y2",
1622
+ "opp__short_mean__actual_recovery_share__x1_y0",
1623
+ "opp__short_mean__actual_recovery_share__x1_y1",
1624
+ "opp__short_mean__actual_recovery_share__x1_y2",
1625
+ "opp__short_mean__actual_recovery_share__x2_y0",
1626
+ "opp__short_mean__actual_recovery_share__x2_y1",
1627
+ "opp__short_mean__actual_recovery_share__x2_y2",
1628
+ "opp__short_mean__actual_recovery_share__x3_y0",
1629
+ "opp__short_mean__actual_recovery_share__x3_y1",
1630
+ "opp__short_mean__actual_recovery_share__x3_y2",
1631
+ "opp__short_mean__goals_against",
1632
+ "opp__short_mean__goals_for",
1633
+ "opp__short_mean__goals_for__opp",
1634
+ "opp__short_mean__interception_cnt__x0_y0",
1635
+ "opp__short_mean__interception_cnt__x0_y1",
1636
+ "opp__short_mean__interception_cnt__x0_y2",
1637
+ "opp__short_mean__interception_cnt__x1_y0",
1638
+ "opp__short_mean__interception_cnt__x1_y1",
1639
+ "opp__short_mean__interception_cnt__x1_y2",
1640
+ "opp__short_mean__interception_cnt__x2_y0",
1641
+ "opp__short_mean__interception_cnt__x2_y1",
1642
+ "opp__short_mean__interception_cnt__x2_y2",
1643
+ "opp__short_mean__interception_cnt__x3_y0",
1644
+ "opp__short_mean__interception_cnt__x3_y1",
1645
+ "opp__short_mean__interception_cnt__x3_y2",
1646
+ "opp__short_mean__linesBroken_total",
1647
+ "opp__short_mean__mf__acciones_defensivas_en_ofensiva",
1648
+ "opp__short_mean__mf__acciones_defensivas_totales",
1649
+ "opp__short_mean__mf__altura_media_recuperacion",
1650
+ "opp__short_mean__mf__ancho_promedio_m_por_posesion",
1651
+ "opp__short_mean__mf__attack_zone_pvAdded__Creativity Zone",
1652
+ "opp__short_mean__mf__attack_zone_pvAdded__Cross (Der)",
1653
+ "opp__short_mean__mf__attack_zone_pvAdded__Cross (Izq)",
1654
+ "opp__short_mean__mf__attack_zone_pvAdded__Cut-Back (Der)",
1655
+ "opp__short_mean__mf__attack_zone_pvAdded__Cut-Back (Izq)",
1656
+ "opp__short_mean__mf__attack_zone_pvAdded__Deep Cross (Der)",
1657
+ "opp__short_mean__mf__attack_zone_pvAdded__Deep Cross (Izq)",
1658
+ "opp__short_mean__mf__attack_zone_pvAdded__Half-Space (Der)",
1659
+ "opp__short_mean__mf__attack_zone_pvAdded__Half-Space (Izq)",
1660
+ "opp__short_mean__mf__attack_zone_pvAdded__Scoring Zone",
1661
+ "opp__short_mean__mf__attack_zone_pvAdded__Security Behind",
1662
+ "opp__short_mean__mf__attack_zone_share__Creativity Zone",
1663
+ "opp__short_mean__mf__attack_zone_share__Cross (Der)",
1664
+ "opp__short_mean__mf__attack_zone_share__Cross (Izq)",
1665
+ "opp__short_mean__mf__attack_zone_share__Cut-Back (Der)",
1666
+ "opp__short_mean__mf__attack_zone_share__Cut-Back (Izq)",
1667
+ "opp__short_mean__mf__attack_zone_share__Deep Cross (Der)",
1668
+ "opp__short_mean__mf__attack_zone_share__Deep Cross (Izq)",
1669
+ "opp__short_mean__mf__attack_zone_share__Half-Space (Der)",
1670
+ "opp__short_mean__mf__attack_zone_share__Half-Space (Izq)",
1671
+ "opp__short_mean__mf__attack_zone_share__Scoring Zone",
1672
+ "opp__short_mean__mf__attack_zone_share__Security Behind",
1673
+ "opp__short_mean__mf__avg_end_x_pass",
1674
+ "opp__short_mean__mf__big_chances_generadas",
1675
+ "opp__short_mean__mf__centros_totales_ultimo_tercio",
1676
+ "opp__short_mean__mf__counter_press_recovery",
1677
+ "opp__short_mean__mf__cross_share_last3",
1678
+ "opp__short_mean__mf__final3_success",
1679
+ "opp__short_mean__mf__high_recov_share",
1680
+ "opp__short_mean__mf__pases_area",
1681
+ "opp__short_mean__mf__pases_progresivos_sobre_pases",
1682
+ "opp__short_mean__mf__pases_prom_secuencia",
1683
+ "opp__short_mean__mf__pases_totales_ultimo_tercio",
1684
+ "opp__short_mean__mf__passes_per_loss",
1685
+ "opp__short_mean__mf__passes_per_shot",
1686
+ "opp__short_mean__mf__pct_centros_pases_totales_ultimo_tercio",
1687
+ "opp__short_mean__mf__pct_pases_largos",
1688
+ "opp__short_mean__mf__possession_nunique",
1689
+ "opp__short_mean__mf__ppda",
1690
+ "opp__short_mean__mf__ppda_inv",
1691
+ "opp__short_mean__mf__press_cnt__x0_y0",
1692
+ "opp__short_mean__mf__press_cnt__x0_y1",
1693
+ "opp__short_mean__mf__press_cnt__x0_y2",
1694
+ "opp__short_mean__mf__press_cnt__x1_y0",
1695
+ "opp__short_mean__mf__press_cnt__x1_y1",
1696
+ "opp__short_mean__mf__press_cnt__x1_y2",
1697
+ "opp__short_mean__mf__press_cnt__x2_y0",
1698
+ "opp__short_mean__mf__press_cnt__x2_y1",
1699
+ "opp__short_mean__mf__press_cnt__x2_y2",
1700
+ "opp__short_mean__mf__press_cnt__x3_y0",
1701
+ "opp__short_mean__mf__press_cnt__x3_y1",
1702
+ "opp__short_mean__mf__press_cnt__x3_y2",
1703
+ "opp__short_mean__mf__press_int_sum__x0_y0",
1704
+ "opp__short_mean__mf__press_int_sum__x0_y1",
1705
+ "opp__short_mean__mf__press_int_sum__x0_y2",
1706
+ "opp__short_mean__mf__press_int_sum__x1_y0",
1707
+ "opp__short_mean__mf__press_int_sum__x1_y1",
1708
+ "opp__short_mean__mf__press_int_sum__x1_y2",
1709
+ "opp__short_mean__mf__press_int_sum__x2_y0",
1710
+ "opp__short_mean__mf__press_int_sum__x2_y1",
1711
+ "opp__short_mean__mf__press_int_sum__x2_y2",
1712
+ "opp__short_mean__mf__press_int_sum__x3_y0",
1713
+ "opp__short_mean__mf__press_int_sum__x3_y1",
1714
+ "opp__short_mean__mf__press_int_sum__x3_y2",
1715
+ "opp__short_mean__mf__pressure_intensity_sum",
1716
+ "opp__short_mean__mf__pressures",
1717
+ "opp__short_mean__mf__progresion_promedio_m_por_posesion",
1718
+ "opp__short_mean__mf__pvAdded_sum",
1719
+ "opp__short_mean__mf__pvValue_sum",
1720
+ "opp__short_mean__mf__recepciones_area",
1721
+ "opp__short_mean__mf__recov_cnt__x0_y0",
1722
+ "opp__short_mean__mf__recov_cnt__x0_y1",
1723
+ "opp__short_mean__mf__recov_cnt__x0_y2",
1724
+ "opp__short_mean__mf__recov_cnt__x1_y0",
1725
+ "opp__short_mean__mf__recov_cnt__x1_y1",
1726
+ "opp__short_mean__mf__recov_cnt__x1_y2",
1727
+ "opp__short_mean__mf__recov_cnt__x2_y0",
1728
+ "opp__short_mean__mf__recov_cnt__x2_y1",
1729
+ "opp__short_mean__mf__recov_cnt__x2_y2",
1730
+ "opp__short_mean__mf__recov_cnt__x3_y0",
1731
+ "opp__short_mean__mf__recov_cnt__x3_y1",
1732
+ "opp__short_mean__mf__recov_cnt__x3_y2",
1733
+ "opp__short_mean__mf__recuperaciones_campo_propio",
1734
+ "opp__short_mean__mf__recuperaciones_campo_rival",
1735
+ "opp__short_mean__mf__ritmo_circulacion_pases_por_min",
1736
+ "opp__short_mean__mf__shots",
1737
+ "opp__short_mean__mf__shots_on_target",
1738
+ "opp__short_mean__mf__tiros_area_grande",
1739
+ "opp__short_mean__mf__tiros_area_pequeña",
1740
+ "opp__short_mean__mf__tiros_fuera_de_area",
1741
+ "opp__short_mean__mf__touches_area",
1742
+ "opp__short_mean__mf__xg_por_tiro",
1743
+ "opp__short_mean__mf__xg_suma_tiros",
1744
+ "opp__short_mean__passes_long",
1745
+ "opp__short_mean__passes_per_possession",
1746
+ "opp__short_mean__passes_short",
1747
+ "opp__short_mean__passes_total",
1748
+ "opp__short_mean__possessions_nunique",
1749
+ "opp__short_mean__press_cnt__x0_y0",
1750
+ "opp__short_mean__press_cnt__x0_y1",
1751
+ "opp__short_mean__press_cnt__x0_y2",
1752
+ "opp__short_mean__press_cnt__x1_y0",
1753
+ "opp__short_mean__press_cnt__x1_y1",
1754
+ "opp__short_mean__press_cnt__x1_y2",
1755
+ "opp__short_mean__press_cnt__x2_y0",
1756
+ "opp__short_mean__press_cnt__x2_y1",
1757
+ "opp__short_mean__press_cnt__x2_y2",
1758
+ "opp__short_mean__press_cnt__x3_y0",
1759
+ "opp__short_mean__press_cnt__x3_y1",
1760
+ "opp__short_mean__press_cnt__x3_y2",
1761
+ "opp__short_mean__pressures_total",
1762
+ "opp__short_mean__pvAdded_total",
1763
+ "opp__short_mean__pvAdded_total__opp",
1764
+ "opp__short_mean__recoveries_total",
1765
+ "opp__short_mean__short_long_pass_ratio",
1766
+ "opp__short_mean__shots_total",
1767
+ "opp__short_mean__shots_total__opp",
1768
+ "opp__short_mean__zone_actions__Creativity_Zone",
1769
+ "opp__short_mean__zone_actions__Creativity_Zone__opp",
1770
+ "opp__short_mean__zone_actions__Cross__Der_",
1771
+ "opp__short_mean__zone_actions__Cross__Der___opp",
1772
+ "opp__short_mean__zone_actions__Cross__Izq_",
1773
+ "opp__short_mean__zone_actions__Cross__Izq___opp",
1774
+ "opp__short_mean__zone_actions__Cut_Back__Der_",
1775
+ "opp__short_mean__zone_actions__Cut_Back__Der___opp",
1776
+ "opp__short_mean__zone_actions__Cut_Back__Izq_",
1777
+ "opp__short_mean__zone_actions__Cut_Back__Izq___opp",
1778
+ "opp__short_mean__zone_actions__Deep_Cross__Der_",
1779
+ "opp__short_mean__zone_actions__Deep_Cross__Der___opp",
1780
+ "opp__short_mean__zone_actions__Deep_Cross__Izq_",
1781
+ "opp__short_mean__zone_actions__Deep_Cross__Izq___opp",
1782
+ "opp__short_mean__zone_actions__Half_Space__Der_",
1783
+ "opp__short_mean__zone_actions__Half_Space__Der___opp",
1784
+ "opp__short_mean__zone_actions__Half_Space__Izq_",
1785
+ "opp__short_mean__zone_actions__Half_Space__Izq___opp",
1786
+ "opp__short_mean__zone_actions__Scoring_Zone",
1787
+ "opp__short_mean__zone_actions__Scoring_Zone__opp",
1788
+ "opp__short_mean__zone_linesBroken__Creativity_Zone",
1789
+ "opp__short_mean__zone_linesBroken__Cross__Der_",
1790
+ "opp__short_mean__zone_linesBroken__Cross__Izq_",
1791
+ "opp__short_mean__zone_linesBroken__Cut_Back__Der_",
1792
+ "opp__short_mean__zone_linesBroken__Cut_Back__Izq_",
1793
+ "opp__short_mean__zone_linesBroken__Deep_Cross__Der_",
1794
+ "opp__short_mean__zone_linesBroken__Deep_Cross__Izq_",
1795
+ "opp__short_mean__zone_linesBroken__Half_Space__Der_",
1796
+ "opp__short_mean__zone_linesBroken__Half_Space__Izq_",
1797
+ "opp__short_mean__zone_linesBroken__Scoring_Zone",
1798
+ "opp__short_mean__zone_pvAdded__Creativity_Zone",
1799
+ "opp__short_mean__zone_pvAdded__Creativity_Zone__opp",
1800
+ "opp__short_mean__zone_pvAdded__Cross__Der_",
1801
+ "opp__short_mean__zone_pvAdded__Cross__Der___opp",
1802
+ "opp__short_mean__zone_pvAdded__Cross__Izq_",
1803
+ "opp__short_mean__zone_pvAdded__Cross__Izq___opp",
1804
+ "opp__short_mean__zone_pvAdded__Cut_Back__Der_",
1805
+ "opp__short_mean__zone_pvAdded__Cut_Back__Der___opp",
1806
+ "opp__short_mean__zone_pvAdded__Cut_Back__Izq_",
1807
+ "opp__short_mean__zone_pvAdded__Cut_Back__Izq___opp",
1808
+ "opp__short_mean__zone_pvAdded__Deep_Cross__Der_",
1809
+ "opp__short_mean__zone_pvAdded__Deep_Cross__Der___opp",
1810
+ "opp__short_mean__zone_pvAdded__Deep_Cross__Izq_",
1811
+ "opp__short_mean__zone_pvAdded__Deep_Cross__Izq___opp",
1812
+ "opp__short_mean__zone_pvAdded__Half_Space__Der_",
1813
+ "opp__short_mean__zone_pvAdded__Half_Space__Der___opp",
1814
+ "opp__short_mean__zone_pvAdded__Half_Space__Izq_",
1815
+ "opp__short_mean__zone_pvAdded__Half_Space__Izq___opp",
1816
+ "opp__short_mean__zone_pvAdded__Scoring_Zone",
1817
+ "opp__short_mean__zone_pvAdded__Scoring_Zone__opp",
1818
+ "opp__short_mean__zone_pvAdded_shots__Creativity_Zone",
1819
+ "opp__short_mean__zone_pvAdded_shots__Cross__Der_",
1820
+ "opp__short_mean__zone_pvAdded_shots__Cross__Izq_",
1821
+ "opp__short_mean__zone_pvAdded_shots__Cut_Back__Der_",
1822
+ "opp__short_mean__zone_pvAdded_shots__Cut_Back__Izq_",
1823
+ "opp__short_mean__zone_pvAdded_shots__Deep_Cross__Der_",
1824
+ "opp__short_mean__zone_pvAdded_shots__Deep_Cross__Izq_",
1825
+ "opp__short_mean__zone_pvAdded_shots__Half_Space__Der_",
1826
+ "opp__short_mean__zone_pvAdded_shots__Half_Space__Izq_",
1827
+ "opp__short_mean__zone_pvAdded_shots__Scoring_Zone",
1828
+ "short_mean__actual_attack_share__Creativity_Zone",
1829
+ "short_mean__actual_attack_share__Cross__Der_",
1830
+ "short_mean__actual_attack_share__Cross__Izq_",
1831
+ "short_mean__actual_attack_share__Cut_Back__Der_",
1832
+ "short_mean__actual_attack_share__Cut_Back__Izq_",
1833
+ "short_mean__actual_attack_share__Deep_Cross__Der_",
1834
+ "short_mean__actual_attack_share__Deep_Cross__Izq_",
1835
+ "short_mean__actual_attack_share__Half_Space__Der_",
1836
+ "short_mean__actual_attack_share__Half_Space__Izq_",
1837
+ "short_mean__actual_attack_share__Scoring_Zone",
1838
+ "short_mean__actual_conceded_attack_share__Creativity_Zone",
1839
+ "short_mean__actual_conceded_attack_share__Cross__Der_",
1840
+ "short_mean__actual_conceded_attack_share__Cross__Izq_",
1841
+ "short_mean__actual_conceded_attack_share__Cut_Back__Der_",
1842
+ "short_mean__actual_conceded_attack_share__Cut_Back__Izq_",
1843
+ "short_mean__actual_conceded_attack_share__Deep_Cross__Der_",
1844
+ "short_mean__actual_conceded_attack_share__Deep_Cross__Izq_",
1845
+ "short_mean__actual_conceded_attack_share__Half_Space__Der_",
1846
+ "short_mean__actual_conceded_attack_share__Half_Space__Izq_",
1847
+ "short_mean__actual_conceded_attack_share__Scoring_Zone",
1848
+ "short_mean__actual_conceded_pv_share__Creativity_Zone",
1849
+ "short_mean__actual_conceded_pv_share__Cross__Der_",
1850
+ "short_mean__actual_conceded_pv_share__Cross__Izq_",
1851
+ "short_mean__actual_conceded_pv_share__Cut_Back__Der_",
1852
+ "short_mean__actual_conceded_pv_share__Cut_Back__Izq_",
1853
+ "short_mean__actual_conceded_pv_share__Deep_Cross__Der_",
1854
+ "short_mean__actual_conceded_pv_share__Deep_Cross__Izq_",
1855
+ "short_mean__actual_conceded_pv_share__Half_Space__Der_",
1856
+ "short_mean__actual_conceded_pv_share__Half_Space__Izq_",
1857
+ "short_mean__actual_conceded_pv_share__Scoring_Zone",
1858
+ "short_mean__actual_press_share__x0_y0",
1859
+ "short_mean__actual_press_share__x0_y1",
1860
+ "short_mean__actual_press_share__x0_y2",
1861
+ "short_mean__actual_press_share__x1_y0",
1862
+ "short_mean__actual_press_share__x1_y1",
1863
+ "short_mean__actual_press_share__x1_y2",
1864
+ "short_mean__actual_press_share__x2_y0",
1865
+ "short_mean__actual_press_share__x2_y1",
1866
+ "short_mean__actual_press_share__x2_y2",
1867
+ "short_mean__actual_press_share__x3_y0",
1868
+ "short_mean__actual_press_share__x3_y1",
1869
+ "short_mean__actual_press_share__x3_y2",
1870
+ "short_mean__actual_pv_share__Creativity_Zone",
1871
+ "short_mean__actual_pv_share__Cross__Der_",
1872
+ "short_mean__actual_pv_share__Cross__Izq_",
1873
+ "short_mean__actual_pv_share__Cut_Back__Der_",
1874
+ "short_mean__actual_pv_share__Cut_Back__Izq_",
1875
+ "short_mean__actual_pv_share__Deep_Cross__Der_",
1876
+ "short_mean__actual_pv_share__Deep_Cross__Izq_",
1877
+ "short_mean__actual_pv_share__Half_Space__Der_",
1878
+ "short_mean__actual_pv_share__Half_Space__Izq_",
1879
+ "short_mean__actual_pv_share__Scoring_Zone",
1880
+ "short_mean__actual_recovery_share__x0_y0",
1881
+ "short_mean__actual_recovery_share__x0_y1",
1882
+ "short_mean__actual_recovery_share__x0_y2",
1883
+ "short_mean__actual_recovery_share__x1_y0",
1884
+ "short_mean__actual_recovery_share__x1_y1",
1885
+ "short_mean__actual_recovery_share__x1_y2",
1886
+ "short_mean__actual_recovery_share__x2_y0",
1887
+ "short_mean__actual_recovery_share__x2_y1",
1888
+ "short_mean__actual_recovery_share__x2_y2",
1889
+ "short_mean__actual_recovery_share__x3_y0",
1890
+ "short_mean__actual_recovery_share__x3_y1",
1891
+ "short_mean__actual_recovery_share__x3_y2",
1892
+ "short_mean__goals_against",
1893
+ "short_mean__goals_for",
1894
+ "short_mean__goals_for__opp",
1895
+ "short_mean__interception_cnt__x0_y0",
1896
+ "short_mean__interception_cnt__x0_y1",
1897
+ "short_mean__interception_cnt__x0_y2",
1898
+ "short_mean__interception_cnt__x1_y0",
1899
+ "short_mean__interception_cnt__x1_y1",
1900
+ "short_mean__interception_cnt__x1_y2",
1901
+ "short_mean__interception_cnt__x2_y0",
1902
+ "short_mean__interception_cnt__x2_y1",
1903
+ "short_mean__interception_cnt__x2_y2",
1904
+ "short_mean__interception_cnt__x3_y0",
1905
+ "short_mean__interception_cnt__x3_y1",
1906
+ "short_mean__interception_cnt__x3_y2",
1907
+ "short_mean__linesBroken_total",
1908
+ "short_mean__mf__acciones_defensivas_en_ofensiva",
1909
+ "short_mean__mf__acciones_defensivas_totales",
1910
+ "short_mean__mf__altura_media_recuperacion",
1911
+ "short_mean__mf__ancho_promedio_m_por_posesion",
1912
+ "short_mean__mf__attack_zone_pvAdded__Creativity Zone",
1913
+ "short_mean__mf__attack_zone_pvAdded__Cross (Der)",
1914
+ "short_mean__mf__attack_zone_pvAdded__Cross (Izq)",
1915
+ "short_mean__mf__attack_zone_pvAdded__Cut-Back (Der)",
1916
+ "short_mean__mf__attack_zone_pvAdded__Cut-Back (Izq)",
1917
+ "short_mean__mf__attack_zone_pvAdded__Deep Cross (Der)",
1918
+ "short_mean__mf__attack_zone_pvAdded__Deep Cross (Izq)",
1919
+ "short_mean__mf__attack_zone_pvAdded__Half-Space (Der)",
1920
+ "short_mean__mf__attack_zone_pvAdded__Half-Space (Izq)",
1921
+ "short_mean__mf__attack_zone_pvAdded__Scoring Zone",
1922
+ "short_mean__mf__attack_zone_pvAdded__Security Behind",
1923
+ "short_mean__mf__attack_zone_share__Creativity Zone",
1924
+ "short_mean__mf__attack_zone_share__Cross (Der)",
1925
+ "short_mean__mf__attack_zone_share__Cross (Izq)",
1926
+ "short_mean__mf__attack_zone_share__Cut-Back (Der)",
1927
+ "short_mean__mf__attack_zone_share__Cut-Back (Izq)",
1928
+ "short_mean__mf__attack_zone_share__Deep Cross (Der)",
1929
+ "short_mean__mf__attack_zone_share__Deep Cross (Izq)",
1930
+ "short_mean__mf__attack_zone_share__Half-Space (Der)",
1931
+ "short_mean__mf__attack_zone_share__Half-Space (Izq)",
1932
+ "short_mean__mf__attack_zone_share__Scoring Zone",
1933
+ "short_mean__mf__attack_zone_share__Security Behind",
1934
+ "short_mean__mf__avg_end_x_pass",
1935
+ "short_mean__mf__big_chances_generadas",
1936
+ "short_mean__mf__centros_totales_ultimo_tercio",
1937
+ "short_mean__mf__counter_press_recovery",
1938
+ "short_mean__mf__cross_share_last3",
1939
+ "short_mean__mf__final3_success",
1940
+ "short_mean__mf__high_recov_share",
1941
+ "short_mean__mf__pases_area",
1942
+ "short_mean__mf__pases_progresivos_sobre_pases",
1943
+ "short_mean__mf__pases_prom_secuencia",
1944
+ "short_mean__mf__pases_totales_ultimo_tercio",
1945
+ "short_mean__mf__passes_per_loss",
1946
+ "short_mean__mf__passes_per_shot",
1947
+ "short_mean__mf__pct_centros_pases_totales_ultimo_tercio",
1948
+ "short_mean__mf__pct_pases_largos",
1949
+ "short_mean__mf__possession_nunique",
1950
+ "short_mean__mf__ppda",
1951
+ "short_mean__mf__ppda_inv",
1952
+ "short_mean__mf__press_cnt__x0_y0",
1953
+ "short_mean__mf__press_cnt__x0_y1",
1954
+ "short_mean__mf__press_cnt__x0_y2",
1955
+ "short_mean__mf__press_cnt__x1_y0",
1956
+ "short_mean__mf__press_cnt__x1_y1",
1957
+ "short_mean__mf__press_cnt__x1_y2",
1958
+ "short_mean__mf__press_cnt__x2_y0",
1959
+ "short_mean__mf__press_cnt__x2_y1",
1960
+ "short_mean__mf__press_cnt__x2_y2",
1961
+ "short_mean__mf__press_cnt__x3_y0",
1962
+ "short_mean__mf__press_cnt__x3_y1",
1963
+ "short_mean__mf__press_cnt__x3_y2",
1964
+ "short_mean__mf__press_int_sum__x0_y0",
1965
+ "short_mean__mf__press_int_sum__x0_y1",
1966
+ "short_mean__mf__press_int_sum__x0_y2",
1967
+ "short_mean__mf__press_int_sum__x1_y0",
1968
+ "short_mean__mf__press_int_sum__x1_y1",
1969
+ "short_mean__mf__press_int_sum__x1_y2",
1970
+ "short_mean__mf__press_int_sum__x2_y0",
1971
+ "short_mean__mf__press_int_sum__x2_y1",
1972
+ "short_mean__mf__press_int_sum__x2_y2",
1973
+ "short_mean__mf__press_int_sum__x3_y0",
1974
+ "short_mean__mf__press_int_sum__x3_y1",
1975
+ "short_mean__mf__press_int_sum__x3_y2",
1976
+ "short_mean__mf__pressure_intensity_sum",
1977
+ "short_mean__mf__pressures",
1978
+ "short_mean__mf__progresion_promedio_m_por_posesion",
1979
+ "short_mean__mf__pvAdded_sum",
1980
+ "short_mean__mf__pvValue_sum",
1981
+ "short_mean__mf__recepciones_area",
1982
+ "short_mean__mf__recov_cnt__x0_y0",
1983
+ "short_mean__mf__recov_cnt__x0_y1",
1984
+ "short_mean__mf__recov_cnt__x0_y2",
1985
+ "short_mean__mf__recov_cnt__x1_y0",
1986
+ "short_mean__mf__recov_cnt__x1_y1",
1987
+ "short_mean__mf__recov_cnt__x1_y2",
1988
+ "short_mean__mf__recov_cnt__x2_y0",
1989
+ "short_mean__mf__recov_cnt__x2_y1",
1990
+ "short_mean__mf__recov_cnt__x2_y2",
1991
+ "short_mean__mf__recov_cnt__x3_y0",
1992
+ "short_mean__mf__recov_cnt__x3_y1",
1993
+ "short_mean__mf__recov_cnt__x3_y2",
1994
+ "short_mean__mf__recuperaciones_campo_propio",
1995
+ "short_mean__mf__recuperaciones_campo_rival",
1996
+ "short_mean__mf__ritmo_circulacion_pases_por_min",
1997
+ "short_mean__mf__shots",
1998
+ "short_mean__mf__shots_on_target",
1999
+ "short_mean__mf__tiros_area_grande",
2000
+ "short_mean__mf__tiros_area_pequeña",
2001
+ "short_mean__mf__tiros_fuera_de_area",
2002
+ "short_mean__mf__touches_area",
2003
+ "short_mean__mf__xg_por_tiro",
2004
+ "short_mean__mf__xg_suma_tiros",
2005
+ "short_mean__passes_long",
2006
+ "short_mean__passes_per_possession",
2007
+ "short_mean__passes_short",
2008
+ "short_mean__passes_total",
2009
+ "short_mean__possessions_nunique",
2010
+ "short_mean__press_cnt__x0_y0",
2011
+ "short_mean__press_cnt__x0_y1",
2012
+ "short_mean__press_cnt__x0_y2",
2013
+ "short_mean__press_cnt__x1_y0",
2014
+ "short_mean__press_cnt__x1_y1",
2015
+ "short_mean__press_cnt__x1_y2",
2016
+ "short_mean__press_cnt__x2_y0",
2017
+ "short_mean__press_cnt__x2_y1",
2018
+ "short_mean__press_cnt__x2_y2",
2019
+ "short_mean__press_cnt__x3_y0",
2020
+ "short_mean__press_cnt__x3_y1",
2021
+ "short_mean__press_cnt__x3_y2",
2022
+ "short_mean__pressures_total",
2023
+ "short_mean__pvAdded_total",
2024
+ "short_mean__pvAdded_total__opp",
2025
+ "short_mean__recoveries_total",
2026
+ "short_mean__short_long_pass_ratio",
2027
+ "short_mean__shots_total",
2028
+ "short_mean__shots_total__opp",
2029
+ "short_mean__zone_actions__Creativity_Zone",
2030
+ "short_mean__zone_actions__Creativity_Zone__opp",
2031
+ "short_mean__zone_actions__Cross__Der_",
2032
+ "short_mean__zone_actions__Cross__Der___opp",
2033
+ "short_mean__zone_actions__Cross__Izq_",
2034
+ "short_mean__zone_actions__Cross__Izq___opp",
2035
+ "short_mean__zone_actions__Cut_Back__Der_",
2036
+ "short_mean__zone_actions__Cut_Back__Der___opp",
2037
+ "short_mean__zone_actions__Cut_Back__Izq_",
2038
+ "short_mean__zone_actions__Cut_Back__Izq___opp",
2039
+ "short_mean__zone_actions__Deep_Cross__Der_",
2040
+ "short_mean__zone_actions__Deep_Cross__Der___opp",
2041
+ "short_mean__zone_actions__Deep_Cross__Izq_",
2042
+ "short_mean__zone_actions__Deep_Cross__Izq___opp",
2043
+ "short_mean__zone_actions__Half_Space__Der_",
2044
+ "short_mean__zone_actions__Half_Space__Der___opp",
2045
+ "short_mean__zone_actions__Half_Space__Izq_",
2046
+ "short_mean__zone_actions__Half_Space__Izq___opp",
2047
+ "short_mean__zone_actions__Scoring_Zone",
2048
+ "short_mean__zone_actions__Scoring_Zone__opp",
2049
+ "short_mean__zone_linesBroken__Creativity_Zone",
2050
+ "short_mean__zone_linesBroken__Cross__Der_",
2051
+ "short_mean__zone_linesBroken__Cross__Izq_",
2052
+ "short_mean__zone_linesBroken__Cut_Back__Der_",
2053
+ "short_mean__zone_linesBroken__Cut_Back__Izq_",
2054
+ "short_mean__zone_linesBroken__Deep_Cross__Der_",
2055
+ "short_mean__zone_linesBroken__Deep_Cross__Izq_",
2056
+ "short_mean__zone_linesBroken__Half_Space__Der_",
2057
+ "short_mean__zone_linesBroken__Half_Space__Izq_",
2058
+ "short_mean__zone_linesBroken__Scoring_Zone",
2059
+ "short_mean__zone_pvAdded_shots__Creativity_Zone",
2060
+ "short_mean__zone_pvAdded_shots__Cross__Der_",
2061
+ "short_mean__zone_pvAdded_shots__Cross__Izq_",
2062
+ "short_mean__zone_pvAdded_shots__Cut_Back__Der_",
2063
+ "short_mean__zone_pvAdded_shots__Cut_Back__Izq_",
2064
+ "short_mean__zone_pvAdded_shots__Deep_Cross__Der_",
2065
+ "short_mean__zone_pvAdded_shots__Deep_Cross__Izq_",
2066
+ "short_mean__zone_pvAdded_shots__Half_Space__Der_",
2067
+ "short_mean__zone_pvAdded_shots__Half_Space__Izq_",
2068
+ "short_mean__zone_pvAdded_shots__Scoring_Zone",
2069
+ "n_prior_matches",
2070
+ "opp_n_prior_matches",
2071
+ "is_home_num",
2072
+ "league_Austrian Bundesliga",
2073
+ "league_Belgian Challenger Pro League",
2074
+ "league_Danish Superligaen",
2075
+ "league_French Ligue 2",
2076
+ "league_Italian Serie B",
2077
+ "league_Liga Profesional Argentina",
2078
+ "league_Serbian Super Liga",
2079
+ "league_Spanish La Liga",
2080
+ "league_Spanish Segunda Division",
2081
+ "season_24",
2082
+ "season_24-25",
2083
+ "season_25",
2084
+ "season_25-26",
2085
+ "season_26"
2086
  ]
2087
  }
2088
  }
docs/diccionarios/modelos/attack_matchup_gnn.md CHANGED
@@ -61,6 +61,8 @@ proporción el modelo se sobreajustaba y apenas le ganaba al baseline.
61
  | Etapa | Qué se hace |
62
  |---|---|
63
  | **Split** | **temporal** (`_train_val_test_indices` → `_build_temporal_validation`): la validación son las fechas más recientes del train, y el test va aparte |
 
 
64
  | **Baselines** | se compara contra **dos**: el promedio de la temporada y el de los **últimos 8** partidos |
65
  | **Métrica** | **MAE**, con **intervalos bootstrap** sobre la diferencia modelo − baseline |
66
  | **Resultado** | el ensemble mejora **~3,6 %** el MAE sobre el baseline (cada semilla suelta: ~2,9–3,3 %) |
@@ -113,7 +115,7 @@ Liga Profesional Argentina.
113
 
114
  | Tipo | Qué es |
115
  |---|---|
116
- | **Globales** | **200** columnas, podadas desde ~950 candidatas (familia `mf__*` y rolling). Ver *Cómo se podan* abajo |
117
  | **De nodo** | por zona: ataque y PV **propios**, **concedidos** y **del rival** |
118
  | **Baselines** | promedio de la temporada y de los últimos 8 partidos, que entran al modelo como residual |
119
 
 
61
  | Etapa | Qué se hace |
62
  |---|---|
63
  | **Split** | **temporal** (`_train_val_test_indices` → `_build_temporal_validation`): la validación son las fechas más recientes del train, y el test va aparte |
64
+ | **Tamaños reales** | **8.506** train · **962** validación (desde el **16-nov-2025**) · **1.108** test |
65
+ | **Ensemble** | **5 semillas** promediadas en log-espacio |
66
  | **Baselines** | se compara contra **dos**: el promedio de la temporada y el de los **últimos 8** partidos |
67
  | **Métrica** | **MAE**, con **intervalos bootstrap** sobre la diferencia modelo − baseline |
68
  | **Resultado** | el ensemble mejora **~3,6 %** el MAE sobre el baseline (cada semilla suelta: ~2,9–3,3 %) |
 
115
 
116
  | Tipo | Qué es |
117
  |---|---|
118
+ | **Globales** | **200** columnas, podadas desde ~950 candidatas (familia `mf__*` y rolling). La lista exacta está en el CSV y en la referencia. Ver *Cómo se podan* abajo |
119
  | **De nodo** | por zona: ataque y PV **propios**, **concedidos** y **del rival** |
120
  | **Baselines** | promedio de la temporada y de los últimos 8 partidos, que entran al modelo como residual |
121
 
docs/diccionarios/modelos/pv_distribution_gnn.md CHANGED
@@ -29,7 +29,7 @@ en vez de predecirlas por separado.
29
 
30
  | Pieza | Qué hace |
31
  |---|---|
32
- | **Rama global** | toma las features del partido y las proyecta a un vector de contexto (96 dim) |
33
  | **Rama de nodo** | por zona: ataque y PV propios, concedidos y del rival |
34
  | **Bloques de grafo** | 3 capas que propagan información entre zonas vecinas (dropout 0.06) |
35
  | **Cabezas `gate` + `delta`** | el modelo **no predice el valor directo**: aprende una **corrección sobre un baseline**, y una compuerta que decide cuánto pesa cada baseline |
@@ -53,6 +53,7 @@ Los dos baselines que combina:
53
  | **Estandarización** | medias y desvíos calculados **solo sobre train** (globales y de nodo), y los NaN se rellenan con la **mediana del train** |
54
  | **Épocas** | hasta 260, con early stopping |
55
  | **Semilla** | `RANDOM_SEED = 42` |
 
56
  | **Métrica** | **MAE** contra los dos baselines (temporada y forma reciente) |
57
 
58
  > Igual que el modelo de ataque, **el split es temporal**: entrena con lo viejo y se evalúa con lo
@@ -69,7 +70,14 @@ equipos**, temporadas 24-25 y 25-26, fechas de ene-2024 a mar-2026.
69
  `target_pv_share__<zona>` — el **share de PV (peligro)** de cada zona, con los mismos 10 nombres de
70
  zona que el modelo de ataque (`Scoring_Zone`, `Half_Space__Izq_`, etc.).
71
 
72
- La única diferencia con el modelo de ataque es el target: **`attack_share`** (por dónde ataca) vs
 
 
 
 
 
 
 
73
  **`pv_share`** (dónde genera peligro). Las variables de entrada son las mismas.
74
 
75
  ---
 
29
 
30
  | Pieza | Qué hace |
31
  |---|---|
32
+ | **Rama global** | toma las **1.069 features** del partido y las proyecta a un vector de contexto (96 dim) |
33
  | **Rama de nodo** | por zona: ataque y PV propios, concedidos y del rival |
34
  | **Bloques de grafo** | 3 capas que propagan información entre zonas vecinas (dropout 0.06) |
35
  | **Cabezas `gate` + `delta`** | el modelo **no predice el valor directo**: aprende una **corrección sobre un baseline**, y una compuerta que decide cuánto pesa cada baseline |
 
53
  | **Estandarización** | medias y desvíos calculados **solo sobre train** (globales y de nodo), y los NaN se rellenan con la **mediana del train** |
54
  | **Épocas** | hasta 260, con early stopping |
55
  | **Semilla** | `RANDOM_SEED = 42` |
56
+ | **Tamaños reales** | **7.395** train · **842** validación (desde el **17-nov-2025**) · **981** test |
57
  | **Métrica** | **MAE** contra los dos baselines (temporada y forma reciente) |
58
 
59
  > Igual que el modelo de ataque, **el split es temporal**: entrena con lo viejo y se evalúa con lo
 
70
  `target_pv_share__<zona>` — el **share de PV (peligro)** de cada zona, con los mismos 10 nombres de
71
  zona que el modelo de ataque (`Scoring_Zone`, `Half_Space__Izq_`, etc.).
72
 
73
+ ### Una diferencia importante con el modelo de ataque
74
+
75
+ Este **NO poda las features**: usa las **1.069 globales** tal cual, mientras que el de ataque se
76
+ queda con 200 tras una poda agresiva. Los dos entrenan con el mismo dataset (~10.900 filas), así que
77
+ este modelo tiene una proporción features/filas mucho más exigente y **más riesgo de sobreajuste**.
78
+ Es un candidato claro a aplicarle la misma poda que al de ataque, y medir si mejora.
79
+
80
+ La otra diferencia es el target: **`attack_share`** (por dónde ataca) vs
81
  **`pv_share`** (dónde genera peligro). Las variables de entrada son las mismas.
82
 
83
  ---
scripts/build_team_stats_agg.py CHANGED
@@ -11,6 +11,7 @@ Uso: python scripts/build_team_stats_agg.py
11
 
12
  from __future__ import annotations
13
 
 
14
  import sys
15
  import tempfile
16
  from pathlib import Path
@@ -84,17 +85,28 @@ def _aggregate(csv_path: Path) -> pd.DataFrame:
84
  mean = g[metric_cols].mean()
85
  out = mean.reset_index()
86
  out["n_partidos"] = g.size().values
 
 
 
 
 
87
  print(f"Partidos (versión consistente): {len(full):,} | equipos-temporada: {len(out):,} | "
88
- f"métricas: {len(metric_cols)}", flush=True)
89
  return out
90
 
91
 
92
  def main() -> None:
93
  OUT.parent.mkdir(parents=True, exist_ok=True)
94
- with tempfile.TemporaryDirectory() as td:
95
- csv_path = Path(td) / "team_stats_all_leagues.csv"
96
- _download(csv_path)
97
- agg = _aggregate(csv_path)
 
 
 
 
 
 
98
  agg.to_parquet(OUT, index=False)
99
  print(f"Guardado: {OUT} ({OUT.stat().st_size / 1e6:.1f} MB)")
100
 
 
11
 
12
  from __future__ import annotations
13
 
14
+ import os
15
  import sys
16
  import tempfile
17
  from pathlib import Path
 
85
  mean = g[metric_cols].mean()
86
  out = mean.reset_index()
87
  out["n_partidos"] = g.size().values
88
+ # derivada: % éxito de centros = completados / totales (reemplaza los dos crudos).
89
+ if {"cross_completados", "cross_total"} <= set(out.columns):
90
+ tot = out["cross_total"].where(out["cross_total"] > 0)
91
+ out["pct_exito_centros"] = (out["cross_completados"] / tot).round(4)
92
+ out = out.drop(columns=["cross_completados", "cross_total"])
93
  print(f"Partidos (versión consistente): {len(full):,} | equipos-temporada: {len(out):,} | "
94
+ f"métricas: {len(out.columns) - len(KEYS) - 1}", flush=True)
95
  return out
96
 
97
 
98
  def main() -> None:
99
  OUT.parent.mkdir(parents=True, exist_ok=True)
100
+ # Permite reusar un CSV ya bajado (RACING_TEAMSTATS_CSV) y no re-descargar 1 GB.
101
+ local = os.getenv("RACING_TEAMSTATS_CSV")
102
+ if local and Path(local).exists():
103
+ print(f"Usando CSV local: {local}", flush=True)
104
+ agg = _aggregate(Path(local))
105
+ else:
106
+ with tempfile.TemporaryDirectory() as td:
107
+ csv_path = Path(td) / "team_stats_all_leagues.csv"
108
+ _download(csv_path)
109
+ agg = _aggregate(csv_path)
110
  agg.to_parquet(OUT, index=False)
111
  print(f"Guardado: {OUT} ({OUT.stat().st_size / 1e6:.1f} MB)")
112
 
scripts/build_var_dict.py CHANGED
@@ -26,6 +26,15 @@ from racing_reports import team_vars
26
 
27
  XLSX = Path(sys.argv[1]) if len(sys.argv) > 1 else Path.home() / "Documents/Racing/diccionario_variables.xlsx"
28
  OUT = Path(__file__).resolve().parents[1] / "vendor" / "data" / "var_dict.json"
 
 
 
 
 
 
 
 
 
29
 
30
 
31
  # Variables donde MENOS es mejor (rival / en contra / concedidas / errores propios).
@@ -40,7 +49,7 @@ NEGATIVE_COLS = {
40
  "goles_corner_rival", "goles_regular_play_rival", "goles_tempranos_rival",
41
  "goles_totales_rival", "goles_transicion_rival", "pases_<20m_no_cross_rival",
42
  "pases_peligrosos_exitosos_con_centros_rival", "pases_progresivos_exitosos_rival",
43
- "pases_progresivos_rival", "pct_centros_pases_totales_ultimo_tercio_rival",
44
  "pct_pases_exitosos_t1-2_rival", "pct_pases_exitosos_t3_rival", "pct_posesion_rival",
45
  "recepciones_area_rival", "ritmo_circulacion_pases_por_min_rival", "ritmo_progresion_rival",
46
  "shots_on_target_rival", "shots_rival", "situacion_fast_break_rival",
@@ -50,11 +59,32 @@ NEGATIVE_COLS = {
50
  "velocidad_progresion_m_por_s_rival", "xa_acumulado_rival", "xg_avg_tras_corner_rival",
51
  "xg_suma_tiros_rival", "xg_tiros_tras_corner_rival", "xgot_avg__tras_corner_rival",
52
  "xgot_suma_ontarget_rival", "xgot_tiros_tras_corner_rival", "xt_acumulado_rival",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  # --- propias: errores / pérdidas / tarjetas / presión propia (ppda bajo = mejor) ---
54
  "errores_quederivan_tiro/gol", "perdidas_no_forzadas", "tarjetas_totales",
55
  "tarjetas_rojas", "gpi_perdidas", "ppda",
56
  }
57
 
 
 
 
 
 
58
 
59
  def _top_type(cat: str) -> str:
60
  base = str(cat).split("–")[0].strip() # separador es en-dash U+2013
@@ -70,9 +100,12 @@ def main() -> None:
70
  # mapear a las columnas reales del agregado (canónicas, en minúscula)
71
  out = {}
72
  for c in team_vars.variables():
73
- info = by_col.get(c.lower()) or {"label": c, "tipo": "Otras"}
 
 
74
  info = dict(info)
75
  info["negativa"] = c in NEGATIVE_COLS
 
76
  out[c] = info
77
  OUT.parent.mkdir(parents=True, exist_ok=True)
78
  OUT.write_text(json.dumps(out, ensure_ascii=False, indent=0), encoding="utf-8")
 
26
 
27
  XLSX = Path(sys.argv[1]) if len(sys.argv) > 1 else Path.home() / "Documents/Racing/diccionario_variables.xlsx"
28
  OUT = Path(__file__).resolve().parents[1] / "vendor" / "data" / "var_dict.json"
29
+ # Grupos custom (Balón parado, Centros, Defensa, …) por feature — fuente editable.
30
+ # Una feature puede estar en varios grupos. Reemplazan al 'tipo' en las secciones 2 y 3 de la app.
31
+ GROUPS_FILE = Path(__file__).resolve().parent / "feature_groups.json"
32
+ FEATURE_GROUPS = json.loads(GROUPS_FILE.read_text(encoding="utf-8")) if GROUPS_FILE.exists() else {}
33
+
34
+ # Nombres de uso recuperados de "Estilos de juego - bloque.xlsx" para columnas que el
35
+ # diccionario_variables.xlsx no nombra (si no, la app mostraba el nombre técnico crudo).
36
+ EXTRA_FILE = Path(__file__).resolve().parent / "var_labels_extra.json"
37
+ EXTRA_LABELS = json.loads(EXTRA_FILE.read_text(encoding="utf-8")) if EXTRA_FILE.exists() else {}
38
 
39
 
40
  # Variables donde MENOS es mejor (rival / en contra / concedidas / errores propios).
 
49
  "goles_corner_rival", "goles_regular_play_rival", "goles_tempranos_rival",
50
  "goles_totales_rival", "goles_transicion_rival", "pases_<20m_no_cross_rival",
51
  "pases_peligrosos_exitosos_con_centros_rival", "pases_progresivos_exitosos_rival",
52
+ "pases_progresivos_rival",
53
  "pct_pases_exitosos_t1-2_rival", "pct_pases_exitosos_t3_rival", "pct_posesion_rival",
54
  "recepciones_area_rival", "ritmo_circulacion_pases_por_min_rival", "ritmo_progresion_rival",
55
  "shots_on_target_rival", "shots_rival", "situacion_fast_break_rival",
 
59
  "velocidad_progresion_m_por_s_rival", "xa_acumulado_rival", "xg_avg_tras_corner_rival",
60
  "xg_suma_tiros_rival", "xg_tiros_tras_corner_rival", "xgot_avg__tras_corner_rival",
61
  "xgot_suma_ontarget_rival", "xgot_tiros_tras_corner_rival", "xt_acumulado_rival",
62
+ # --- rival: xG generado (todo xg_*_rival = malo) + recuperaciones / progresión permitida ---
63
+ "recuperaciones_campo_rival_rival", "recuperaciones_campo_propio_rival",
64
+ "avg_end_x_pass_rival", "pases_endx_1_2_tercio_rival",
65
+ "xg_avg_vs_bloque_alto_rival", "xg_avg_vs_bloque_medio_rival", "xg_avg_vs_bloque_bajo_rival",
66
+ "xg_vs_bloque_alto_rival", "xg_vs_bloque_medio_rival", "xg_vs_bloque_bajo_rival",
67
+ "xg_secuencias_build_up_rival",
68
+ "xg_tras_centro_inswinger_area_rival", "xg_tras_centro_inswinger_temprano_rival",
69
+ "xg_tras_centro_outswinger_area_rival", "xg_tras_centro_outswinger_temprano_rival",
70
+ "xg_tras_centro_raso_area_cutback_rival", "xg_tras_centro_raso_area_dividido_rival",
71
+ "xg_tras_centro_raso_temprano_rival", "xg_tras_error_rival", "xg_tras_presion_alta_rival",
72
+ "xg_tras_profundidad_corta_rival", "xg_tras_profundidad_larga_rival",
73
+ "xg_tras_profundidad_media_rival", "xg_tras_recuperacion_tras_perdida_rival",
74
+ "xg_tras_transicion_abp_rival", "xg_tras_transicion_bloque_bajo_medio_rival",
75
+ "xg_tras_transicion_juego_directo_rival",
76
+ # --- propias: no queremos muchos centros ni pelotazos del equipo propio ---
77
+ "pct_centros_pases_totales_ultimo_tercio", "pct_pases_largos",
78
  # --- propias: errores / pérdidas / tarjetas / presión propia (ppda bajo = mejor) ---
79
  "errores_quederivan_tiro/gol", "perdidas_no_forzadas", "tarjetas_totales",
80
  "tarjetas_rojas", "gpi_perdidas", "ppda",
81
  }
82
 
83
+ # Labels/tipos para columnas DERIVADAS que no están en el Excel del proveedor.
84
+ MANUAL_LABELS = {
85
+ "pct_exito_centros": {"label": "% Éxito Centros", "tipo": "Ofensiva"},
86
+ }
87
+
88
 
89
  def _top_type(cat: str) -> str:
90
  base = str(cat).split("–")[0].strip() # separador es en-dash U+2013
 
100
  # mapear a las columnas reales del agregado (canónicas, en minúscula)
101
  out = {}
102
  for c in team_vars.variables():
103
+ info = (MANUAL_LABELS.get(c.lower()) or by_col.get(c.lower())
104
+ or ({"label": EXTRA_LABELS[c], "tipo": "Otras"} if c in EXTRA_LABELS else None)
105
+ or {"label": c, "tipo": "Otras"})
106
  info = dict(info)
107
  info["negativa"] = c in NEGATIVE_COLS
108
+ info["grupos"] = FEATURE_GROUPS.get(c, [])
109
  out[c] = info
110
  OUT.parent.mkdir(parents=True, exist_ok=True)
111
  OUT.write_text(json.dumps(out, ensure_ascii=False, indent=0), encoding="utf-8")
scripts/feature_groups.json ADDED
@@ -0,0 +1,726 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "acciones_defensivas_en_ofensiva": [
3
+ "Presión",
4
+ "Defensiva – Presión"
5
+ ],
6
+ "acciones_defensivas_en_ofensiva_rival": [
7
+ "Presión (rival)"
8
+ ],
9
+ "acciones_defensivas_en_ultimo_tercio": [
10
+ "Presión"
11
+ ],
12
+ "acciones_defensivas_totales": [
13
+ "Defensa"
14
+ ],
15
+ "altura_media_recuperacion": [
16
+ "Presión",
17
+ "Defensiva – Presión"
18
+ ],
19
+ "altura_media_recuperacion_campo_propio": [
20
+ "Defensa",
21
+ "Defensiva – Presión"
22
+ ],
23
+ "avg_one_twos_progress": [
24
+ "Elaboración y posesión"
25
+ ],
26
+ "ballrecovery": [
27
+ "Defensa"
28
+ ],
29
+ "centros_de_faltas": [
30
+ "Balón parado",
31
+ "Centros"
32
+ ],
33
+ "centros_totales_ultimo_tercio": [
34
+ "Centros",
35
+ "Ofensiva – Creación"
36
+ ],
37
+ "clearance_totales": [
38
+ "Defensa"
39
+ ],
40
+ "corners": [
41
+ "Balón parado"
42
+ ],
43
+ "counter_press_recovery": [
44
+ "Presión",
45
+ "Defensiva – Presión"
46
+ ],
47
+ "counter_press_recovery_rival": [
48
+ "Presión (rival)"
49
+ ],
50
+ "cutbacks": [
51
+ "Centros",
52
+ "Build-up / Posesión"
53
+ ],
54
+ "duelos_aereos_ganados": [
55
+ "Defensa"
56
+ ],
57
+ "duelos_aereos_ganados_rival": [
58
+ "Defensa (rival)"
59
+ ],
60
+ "errores_quederivan_tiro/gol": [
61
+ "Defensa"
62
+ ],
63
+ "goles_corner": [
64
+ "Balón parado"
65
+ ],
66
+ "goles_corner_rival": [
67
+ "Balón parado (rival)"
68
+ ],
69
+ "goles_regular_play": [
70
+ "Elaboración y posesión"
71
+ ],
72
+ "goles_regular_play_rival": [
73
+ "Elaboración y posesión (rival)"
74
+ ],
75
+ "goles_transicion": [
76
+ "Verticalidad",
77
+ "Transiciones – Ofensivas"
78
+ ],
79
+ "goles_transicion_rival": [
80
+ "Verticalidad (rival)"
81
+ ],
82
+ "gpe": [
83
+ "Presión",
84
+ "Defensiva – Presión"
85
+ ],
86
+ "gpi": [
87
+ "Presión",
88
+ "Defensiva – Presión"
89
+ ],
90
+ "gpi_intentos": [
91
+ "Presión"
92
+ ],
93
+ "gpi_recuperaciones": [
94
+ "Presión"
95
+ ],
96
+ "indice_verticalidad_transiciones_avg": [
97
+ "Verticalidad",
98
+ "Transiciones – Ofensivas"
99
+ ],
100
+ "indice_verticalidad_transiciones_avg_rival": [
101
+ "Verticalidad (rival)",
102
+ "Transiciones – Defensivas"
103
+ ],
104
+ "indice_verticalidad_transiciones_suma": [
105
+ "Verticalidad",
106
+ "Transiciones – Ofensivas"
107
+ ],
108
+ "indice_verticalidad_transiciones_suma_rival": [
109
+ "Verticalidad (rival)",
110
+ "Transiciones – Defensivas"
111
+ ],
112
+ "intercepciones": [
113
+ "Defensa"
114
+ ],
115
+ "keypass": [
116
+ "Rotura de líneas",
117
+ "Ofensiva – Creación"
118
+ ],
119
+ "n_pases_cuadrado_debil": [
120
+ "Rotura de líneas",
121
+ "Ofensiva – Creación"
122
+ ],
123
+ "n_posesiones_con_finalizacion": [
124
+ "Elaboración y posesión",
125
+ "Build-up / Posesión"
126
+ ],
127
+ "one_twos": [
128
+ "Elaboración y posesión",
129
+ "Juego corto",
130
+ "Build-up / Posesión"
131
+ ],
132
+ "pases_<20m_no_cross": [
133
+ "Juego corto",
134
+ "Ofensiva – Creación"
135
+ ],
136
+ "pases_<20m_no_cross_rival": [
137
+ "Juego corto (rival)",
138
+ "Defensiva"
139
+ ],
140
+ "pases_endx_1_2_tercio": [
141
+ "Elaboración y posesión",
142
+ "Build-up / Posesión"
143
+ ],
144
+ "pases_endx_1_2_tercio_rival": [
145
+ "Elaboración y posesión (rival)",
146
+ "Defensiva – Presión"
147
+ ],
148
+ "pases_endx_tercio_final": [
149
+ "Elaboración y posesión"
150
+ ],
151
+ "pases_peligrosos_exitosos_con_centros": [
152
+ "Centros",
153
+ "Ofensiva – Creación"
154
+ ],
155
+ "pases_peligrosos_exitosos_con_centros_rival": [
156
+ "Centros (rival)",
157
+ "Defensiva"
158
+ ],
159
+ "pases_prog_prom_secuencia": [
160
+ "Verticalidad",
161
+ "Build-up / Posesión"
162
+ ],
163
+ "pases_progresivos": [
164
+ "Verticalidad",
165
+ "Build-up / Posesión"
166
+ ],
167
+ "pases_progresivos_exitosos": [
168
+ "Verticalidad",
169
+ "Build-up / Posesión"
170
+ ],
171
+ "pases_progresivos_exitosos_rival": [
172
+ "Verticalidad (rival)",
173
+ "Defensiva – Presión"
174
+ ],
175
+ "pases_progresivos_no_exitosos": [
176
+ "Verticalidad",
177
+ "Build-up / Posesión"
178
+ ],
179
+ "pases_progresivos_rival": [
180
+ "Verticalidad (rival)",
181
+ "Defensiva"
182
+ ],
183
+ "pases_progresivos_sobre_pases": [
184
+ "Verticalidad",
185
+ "Build-up / Posesión"
186
+ ],
187
+ "pases_totales": [
188
+ "Elaboración y posesión"
189
+ ],
190
+ "pases_totales_a_ultimo_tercio": [
191
+ "Verticalidad"
192
+ ],
193
+ "pases_totales_ultimo_tercio": [
194
+ "Elaboración y posesión"
195
+ ],
196
+ "pct_centros_pases_totales_ultimo_tercio": [
197
+ "Centros",
198
+ "Elaboración y posesión",
199
+ "Ofensiva – Creación"
200
+ ],
201
+ "pct_centros_pases_totales_ultimo_tercio_rival": [
202
+ "Centros (rival)",
203
+ "Elaboración y posesión (rival)",
204
+ "Defensiva – Presión"
205
+ ],
206
+ "pct_pases_cortos": [
207
+ "Elaboración y posesión",
208
+ "Juego corto",
209
+ "Build-up / Posesión"
210
+ ],
211
+ "pct_pases_exitosos_t1-2": [
212
+ "Elaboración y posesión"
213
+ ],
214
+ "pct_pases_exitosos_t1-2_rival": [
215
+ "Elaboración y posesión (rival)",
216
+ "Defensiva – Presión"
217
+ ],
218
+ "pct_pases_exitosos_t3": [
219
+ "Elaboración y posesión",
220
+ "Build-up / Posesión"
221
+ ],
222
+ "pct_pases_exitosos_t3_rival": [
223
+ "Elaboración y posesión (rival)",
224
+ "Defensiva – Presión"
225
+ ],
226
+ "pct_pases_largos": [
227
+ "Elaboración y posesión",
228
+ "Juego corto",
229
+ "Build-up / Posesión"
230
+ ],
231
+ "pct_pases_largos_rival": [
232
+ "Elaboración y posesión (rival)",
233
+ "Juego corto (rival)",
234
+ "Defensiva – Presión"
235
+ ],
236
+ "pct_pases_medios": [
237
+ "Elaboración y posesión",
238
+ "Juego corto",
239
+ "Build-up / Posesión"
240
+ ],
241
+ "pct_posesion": [
242
+ "Elaboración y posesión",
243
+ "Build-up / Posesión"
244
+ ],
245
+ "pct_posesion_rival": [
246
+ "Elaboración y posesión (rival)",
247
+ "Defensiva – Presión"
248
+ ],
249
+ "pct_tiros_tras_corner": [
250
+ "Balón parado"
251
+ ],
252
+ "posesiones_build_up_exitoso": [
253
+ "Elaboración y posesión",
254
+ "Build-up / Posesión"
255
+ ],
256
+ "ppda": [
257
+ "Defensa",
258
+ "Presión",
259
+ "Defensiva – Presión"
260
+ ],
261
+ "ppda_against": [
262
+ "Elaboración y posesión",
263
+ "Defensa (rival)",
264
+ "Presión (rival)",
265
+ "Defensiva – Presión"
266
+ ],
267
+ "progresion_promedio_m_por_posesion": [
268
+ "Elaboración y posesión",
269
+ "Verticalidad"
270
+ ],
271
+ "recuperaciones_campo_propio": [
272
+ "Defensa"
273
+ ],
274
+ "recuperaciones_campo_propio_rival": [
275
+ "Defensa (rival)",
276
+ "Build-up / Posesión"
277
+ ],
278
+ "recuperaciones_campo_rival": [
279
+ "Defensa (rival)"
280
+ ],
281
+ "recuperaciones_campo_rival_rival": [
282
+ "Defensa (rival)",
283
+ "Build-up / Posesión"
284
+ ],
285
+ "ritmo_circulacion_pases_por_min": [
286
+ "Elaboración y posesión",
287
+ "Build-up / Posesión"
288
+ ],
289
+ "ritmo_circulacion_pases_por_min_rival": [
290
+ "Elaboración y posesión (rival)"
291
+ ],
292
+ "ritmo_progresion": [
293
+ "Verticalidad",
294
+ "Build-up / Posesión"
295
+ ],
296
+ "ritmo_progresion_rival": [
297
+ "Verticalidad (rival)"
298
+ ],
299
+ "secuencias_build_up": [
300
+ "Elaboración y posesión",
301
+ "Build-up / Posesión"
302
+ ],
303
+ "secuencias_build_up_rival": [
304
+ "Elaboración y posesión (rival)"
305
+ ],
306
+ "secuencias_progresivas": [
307
+ "Verticalidad"
308
+ ],
309
+ "shots_on_target_rival": [
310
+ "Defensa (rival)"
311
+ ],
312
+ "shots_rival": [
313
+ "Defensa (rival)"
314
+ ],
315
+ "situacion_fast_break": [
316
+ "Verticalidad",
317
+ "Transiciones – Ofensivas"
318
+ ],
319
+ "situacion_fast_break_rival": [
320
+ "Defensa (rival)",
321
+ "Verticalidad (rival)"
322
+ ],
323
+ "tackles_totales": [
324
+ "Defensa"
325
+ ],
326
+ "throughballs": [
327
+ "Rotura de líneas",
328
+ "Ofensiva – Creación"
329
+ ],
330
+ "throughballs_exitosos": [
331
+ "Rotura de líneas",
332
+ "Ofensiva – Creación"
333
+ ],
334
+ "throughballs_exitosos_rival": [
335
+ "Rotura de líneas (rival)",
336
+ "Defensiva"
337
+ ],
338
+ "throughballs_rival": [
339
+ "Rotura de líneas (rival)",
340
+ "Defensiva"
341
+ ],
342
+ "tiros_bloqueados": [
343
+ "Defensa"
344
+ ],
345
+ "tiros_corner": [
346
+ "Balón parado"
347
+ ],
348
+ "tiros_corner_rival": [
349
+ "Balón parado (rival)"
350
+ ],
351
+ "velocidad_progresion_m_por_s": [
352
+ "Verticalidad",
353
+ "Build-up / Posesión"
354
+ ],
355
+ "velocidad_progresion_m_por_s_rival": [
356
+ "Verticalidad (rival)"
357
+ ],
358
+ "xg_avg_tras_corner": [
359
+ "Balón parado"
360
+ ],
361
+ "xg_avg_tras_corner_rival": [
362
+ "Balón parado (rival)"
363
+ ],
364
+ "xg_avg_vs_bloque_alto": [
365
+ "Defensa (rival)",
366
+ "Ofensiva – Creación"
367
+ ],
368
+ "xg_avg_vs_bloque_alto_rival": [
369
+ "Defensa",
370
+ "Defensiva"
371
+ ],
372
+ "xg_avg_vs_bloque_bajo": [
373
+ "Defensa (rival)",
374
+ "Ofensiva – Creación"
375
+ ],
376
+ "xg_avg_vs_bloque_bajo_rival": [
377
+ "Defensa",
378
+ "Defensiva"
379
+ ],
380
+ "xg_avg_vs_bloque_medio": [
381
+ "Defensa (rival)",
382
+ "Ofensiva – Creación"
383
+ ],
384
+ "xg_avg_vs_bloque_medio_rival": [
385
+ "Defensa",
386
+ "Defensiva"
387
+ ],
388
+ "xg_secuencias_build_up": [
389
+ "Elaboración y posesión"
390
+ ],
391
+ "xg_secuencias_build_up_rival": [
392
+ "Elaboración y posesión (rival)",
393
+ "Defensiva"
394
+ ],
395
+ "xg_suma_tiros_rival": [
396
+ "Defensa (rival)"
397
+ ],
398
+ "xg_tiros_tras_corner": [
399
+ "Balón parado"
400
+ ],
401
+ "xg_tiros_tras_corner_rival": [
402
+ "Balón parado (rival)"
403
+ ],
404
+ "xg_tras_centro_inswinger_area": [
405
+ "Centros",
406
+ "Ofensiva – Creación"
407
+ ],
408
+ "xg_tras_centro_inswinger_area_rival": [
409
+ "Centros (rival)",
410
+ "Defensiva"
411
+ ],
412
+ "xg_tras_centro_inswinger_temprano": [
413
+ "Centros",
414
+ "Ofensiva – Creación"
415
+ ],
416
+ "xg_tras_centro_inswinger_temprano_rival": [
417
+ "Centros (rival)",
418
+ "Defensiva"
419
+ ],
420
+ "xg_tras_centro_outswinger_area": [
421
+ "Centros",
422
+ "Ofensiva – Creación"
423
+ ],
424
+ "xg_tras_centro_outswinger_area_rival": [
425
+ "Centros (rival)",
426
+ "Defensiva"
427
+ ],
428
+ "xg_tras_centro_outswinger_temprano": [
429
+ "Centros",
430
+ "Ofensiva – Creación"
431
+ ],
432
+ "xg_tras_centro_outswinger_temprano_rival": [
433
+ "Centros (rival)",
434
+ "Defensiva"
435
+ ],
436
+ "xg_tras_centro_raso_area_cutback": [
437
+ "Centros",
438
+ "Ofensiva – Creación"
439
+ ],
440
+ "xg_tras_centro_raso_area_cutback_rival": [
441
+ "Centros (rival)",
442
+ "Defensiva"
443
+ ],
444
+ "xg_tras_centro_raso_area_dividido": [
445
+ "Centros",
446
+ "Ofensiva – Creación"
447
+ ],
448
+ "xg_tras_centro_raso_area_dividido_rival": [
449
+ "Centros (rival)",
450
+ "Defensiva"
451
+ ],
452
+ "xg_tras_centro_raso_temprano": [
453
+ "Centros",
454
+ "Ofensiva – Creación"
455
+ ],
456
+ "xg_tras_centro_raso_temprano_rival": [
457
+ "Centros (rival)",
458
+ "Defensiva"
459
+ ],
460
+ "xg_tras_presion_alta": [
461
+ "Presión",
462
+ "Defensiva – Presión"
463
+ ],
464
+ "xg_tras_presion_alta_rival": [
465
+ "Presión (rival)"
466
+ ],
467
+ "xg_tras_profundidad_corta": [
468
+ "Rotura de líneas",
469
+ "Ofensiva – Creación"
470
+ ],
471
+ "xg_tras_profundidad_corta_rival": [
472
+ "Rotura de líneas (rival)",
473
+ "Defensiva"
474
+ ],
475
+ "xg_tras_profundidad_larga": [
476
+ "Rotura de líneas",
477
+ "Ofensiva – Creación"
478
+ ],
479
+ "xg_tras_profundidad_larga_rival": [
480
+ "Rotura de líneas (rival)",
481
+ "Defensiva"
482
+ ],
483
+ "xg_tras_profundidad_media": [
484
+ "Rotura de líneas",
485
+ "Ofensiva – Creación"
486
+ ],
487
+ "xg_tras_profundidad_media_rival": [
488
+ "Rotura de líneas (rival)",
489
+ "Defensiva"
490
+ ],
491
+ "xg_tras_recuperacion_tras_perdida": [
492
+ "Defensa",
493
+ "Defensiva – Presión"
494
+ ],
495
+ "xg_tras_recuperacion_tras_perdida_rival": [
496
+ "Defensa (rival)",
497
+ "Transiciones – Defensivas"
498
+ ],
499
+ "xg_tras_transicion_abp": [
500
+ "Balón parado",
501
+ "Verticalidad",
502
+ "Transiciones – Ofensivas"
503
+ ],
504
+ "xg_tras_transicion_abp_rival": [
505
+ "Balón parado (rival)",
506
+ "Verticalidad (rival)",
507
+ "Transiciones – Defensivas"
508
+ ],
509
+ "xg_tras_transicion_bloque_bajo_medio": [
510
+ "Verticalidad",
511
+ "Transiciones – Ofensivas"
512
+ ],
513
+ "xg_tras_transicion_bloque_bajo_medio_rival": [
514
+ "Verticalidad (rival)",
515
+ "Transiciones – Defensivas"
516
+ ],
517
+ "xg_tras_transicion_juego_directo": [
518
+ "Verticalidad",
519
+ "Transiciones – Ofensivas"
520
+ ],
521
+ "xg_tras_transicion_juego_directo_rival": [
522
+ "Verticalidad (rival)",
523
+ "Transiciones – Defensivas"
524
+ ],
525
+ "xgot_avg__tras_corner": [
526
+ "Balón parado"
527
+ ],
528
+ "xgot_avg__tras_corner_rival": [
529
+ "Balón parado (rival)"
530
+ ],
531
+ "xgot_suma_ontarget_rival": [
532
+ "Defensa (rival)"
533
+ ],
534
+ "xgot_tiros_tras_corner": [
535
+ "Balón parado"
536
+ ],
537
+ "xgot_tiros_tras_corner_rival": [
538
+ "Balón parado (rival)"
539
+ ],
540
+ "pct_exito_centros": [
541
+ "Centros"
542
+ ],
543
+ "ancho_promedio_m_por_posesion": [
544
+ "Build-up / Posesión"
545
+ ],
546
+ "avg_dist_pase": [
547
+ "Build-up / Posesión"
548
+ ],
549
+ "pases_prom_secuencia": [
550
+ "Build-up / Posesión"
551
+ ],
552
+ "n_pases_tercer_hombre": [
553
+ "Build-up / Posesión"
554
+ ],
555
+ "pases_divididos": [
556
+ "Build-up / Posesión"
557
+ ],
558
+ "pases_ancho_30m": [
559
+ "Build-up / Posesión"
560
+ ],
561
+ "pct_pases_fuera_area_gk": [
562
+ "Build-up / Posesión"
563
+ ],
564
+ "pct_pases_rasos_gk": [
565
+ "Build-up / Posesión"
566
+ ],
567
+ "avg_distancia_porteria_pases_cortos_gk": [
568
+ "Build-up / Posesión"
569
+ ],
570
+ "agresividad_offside": [
571
+ "Defensiva"
572
+ ],
573
+ "avg_altura_offside": [
574
+ "Defensiva"
575
+ ],
576
+ "offside_provoked": [
577
+ "Defensiva"
578
+ ],
579
+ "recepciones_area_rival": [
580
+ "Defensiva"
581
+ ],
582
+ "sweeper_keeper_opa": [
583
+ "Defensiva"
584
+ ],
585
+ "touches_area_rival": [
586
+ "Defensiva"
587
+ ],
588
+ "xg_tras_error_rival": [
589
+ "Defensiva"
590
+ ],
591
+ "xg_vs_bloque_alto_rival": [
592
+ "Defensiva"
593
+ ],
594
+ "xg_vs_bloque_bajo_rival": [
595
+ "Defensiva"
596
+ ],
597
+ "xg_vs_bloque_medio_rival": [
598
+ "Defensiva"
599
+ ],
600
+ "pct_centros_aereo_rival": [
601
+ "Defensiva"
602
+ ],
603
+ "tiros_mas_25_metros_rival": [
604
+ "Defensiva"
605
+ ],
606
+ "xg_tiros_mas_25_metros_rival": [
607
+ "Defensiva"
608
+ ],
609
+ "pct_tiros_fuera_area_rival": [
610
+ "Defensiva"
611
+ ],
612
+ "pct_tiros_cabeza_rival": [
613
+ "Defensiva"
614
+ ],
615
+ "pct_pases_al_area_son_centros_rival": [
616
+ "Defensiva"
617
+ ],
618
+ "pct_centros_zona_bandas_rival": [
619
+ "Defensiva"
620
+ ],
621
+ "pct_centros_rasos_zona_bandas_rival": [
622
+ "Defensiva"
623
+ ],
624
+ "pct_pases_al_corte_zona_bandas_rival": [
625
+ "Defensiva"
626
+ ],
627
+ "pct_pases_hacia_atras_zona_bandas_rival": [
628
+ "Defensiva"
629
+ ],
630
+ "pct_cutback_zona_bandas_rival": [
631
+ "Defensiva"
632
+ ],
633
+ "pct_dividido_zona_bandas_rival": [
634
+ "Defensiva"
635
+ ],
636
+ "pct_takeon_zona_bandas_rival": [
637
+ "Defensiva"
638
+ ],
639
+ "altura_media_recuperacion_campo_rival": [
640
+ "Defensiva – Presión"
641
+ ],
642
+ "pct_segundas_jugadas_ganadas_tras_duelo_aereo": [
643
+ "Defensiva – Presión"
644
+ ],
645
+ "pct_segundas_jugadas_ganadas_tras_duelo_aereo_rival": [
646
+ "Defensiva – Presión"
647
+ ],
648
+ "lay_off_exitoso": [
649
+ "Ofensiva – Creación"
650
+ ],
651
+ "pases_area": [
652
+ "Ofensiva – Creación"
653
+ ],
654
+ "recepciones_area": [
655
+ "Ofensiva – Creación"
656
+ ],
657
+ "touches_area": [
658
+ "Ofensiva – Creación"
659
+ ],
660
+ "xg_por_tiro": [
661
+ "Ofensiva – Creación"
662
+ ],
663
+ "xg_tras_error": [
664
+ "Ofensiva – Creación"
665
+ ],
666
+ "xg_vs_bloque_alto": [
667
+ "Ofensiva – Creación"
668
+ ],
669
+ "xg_vs_bloque_bajo": [
670
+ "Ofensiva – Creación"
671
+ ],
672
+ "xg_vs_bloque_medio": [
673
+ "Ofensiva – Creación"
674
+ ],
675
+ "xgot_por_tiro": [
676
+ "Ofensiva – Creación"
677
+ ],
678
+ "pct_centros_aereo": [
679
+ "Ofensiva – Creación"
680
+ ],
681
+ "tiros_mas_25_metros": [
682
+ "Ofensiva – Creación"
683
+ ],
684
+ "pct_tiros_fuera_area": [
685
+ "Ofensiva – Creación"
686
+ ],
687
+ "pct_tiros_cabeza": [
688
+ "Ofensiva – Creación"
689
+ ],
690
+ "pct_pases_al_area_son_centros": [
691
+ "Ofensiva – Creación"
692
+ ],
693
+ "pct_centros_zona_bandas": [
694
+ "Ofensiva – Creación"
695
+ ],
696
+ "pct_centros_rasos_zona_bandas": [
697
+ "Ofensiva – Creación"
698
+ ],
699
+ "pct_pases_al_corte_zona_bandas": [
700
+ "Ofensiva – Creación"
701
+ ],
702
+ "pct_pases_hacia_atras_zona_bandas": [
703
+ "Ofensiva – Creación"
704
+ ],
705
+ "pct_cutback_zona_bandas": [
706
+ "Ofensiva – Creación"
707
+ ],
708
+ "pct_dividido_zona_bandas": [
709
+ "Ofensiva – Creación"
710
+ ],
711
+ "pct_takeon_zona_bandas": [
712
+ "Ofensiva – Creación"
713
+ ],
714
+ "avg_distancia_centroide": [
715
+ "Ofensiva – Creación"
716
+ ],
717
+ "avg_ancho_robusto_equipo": [
718
+ "Ofensiva – Creación"
719
+ ],
720
+ "nfbc_rival": [
721
+ "Transiciones – Defensivas"
722
+ ],
723
+ "nfbc": [
724
+ "Transiciones – Ofensivas"
725
+ ]
726
+ }
scripts/gen_diccionario_variables.py ADDED
@@ -0,0 +1,279 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Genera el DICCIONARIO DE VARIABLES (docs/diccionarios/variables.{csv,md}).
3
+
4
+ Una fila por variable con: nombre técnico, nombre de uso (label), dataset del que sale, si viene
5
+ DIRECTA del proveedor o se CALCULA acá, y —para las calculadas— de qué variables sale y cómo.
6
+
7
+ Fuentes de verdad (no se duplica nada a mano salvo las fórmulas):
8
+ vendor/data/var_dict.json ............ label / tipo / grupos de las 262 de team_stats_agg
9
+ scripts/feature_groups.json .......... columna → grupos de estilo de juego
10
+ docs/datasets_variables.json ......... columnas de cada dataset (generado del código)
11
+ data/analysis/next_goal/ejes_definition.json ... qué métricas componen cada eje
12
+ docs/diccionarios/_formulas.json ..... fórmula + entradas de las variables calculadas (curado)
13
+
14
+ USO: python scripts/gen_diccionario_variables.py
15
+ """
16
+ from __future__ import annotations
17
+ import csv, json
18
+ from pathlib import Path
19
+
20
+ ROOT = Path(__file__).resolve().parents[1]
21
+ RACING = ROOT.parent
22
+ OUT = ROOT / "docs" / "diccionarios"
23
+
24
+ vd = json.loads((ROOT / "vendor/data/var_dict.json").read_text(encoding="utf-8"))
25
+ groups = json.loads((ROOT / "scripts/feature_groups.json").read_text(encoding="utf-8"))
26
+ dsv = json.loads((ROOT / "docs/datasets_variables.json").read_text(encoding="utf-8"))["datasets"]
27
+ formulas = json.loads((OUT / "_formulas.json").read_text(encoding="utf-8"))
28
+ ejes_def_p = RACING / "data/analysis/next_goal/ejes_definition.json"
29
+ ejes_def = json.loads(ejes_def_p.read_text(encoding="utf-8")) if ejes_def_p.exists() else {}
30
+
31
+ META = {"liga", "temporada", "equipo", "team", "team_id", "rival", "matchId", "matchid",
32
+ "sequenceId", "fecha", "competencia", "lado", "recurso", "bloque", "zona", "is_home"}
33
+
34
+ rows: list[dict] = []
35
+
36
+
37
+ def add(name, label, dataset, origen, script, entradas, formula, tipo="", grupos="", nota=""):
38
+ rows.append({"variable": name, "nombre_de_uso": label if label and label != name else "",
39
+ "dataset": dataset, "origen": origen, "generado_por": script,
40
+ "entradas": entradas, "como_se_calcula": formula,
41
+ "tipo": tipo, "grupos": grupos, "nota": nota})
42
+
43
+
44
+ def f(name):
45
+ d = formulas.get(name, {})
46
+ return d.get("entradas", ""), d.get("formula", "")
47
+
48
+
49
+ # ── 1. team_stats_agg.parquet ────────────────────────────────────────────────
50
+ DERIVADAS_AGG = {
51
+ "pct_exito_centros": ("cross_completados, cross_total",
52
+ "cross_completados / cross_total (reemplaza a las dos crudas)"),
53
+ "n_partidos": ("filas del CSV por equipo-temporada", "cantidad de partidos agregados"),
54
+ }
55
+ for name, info in sorted(vd.items()):
56
+ ent, form = DERIVADAS_AGG.get(name, ("", ""))
57
+ calc = name in DERIVADAS_AGG
58
+ add(name, info.get("label", name), "team_stats_agg.parquet",
59
+ "calculada" if calc else "directa",
60
+ "scripts/build_team_stats_agg.py" if calc else "pipeline externo del proveedor (team_stats_all_leagues.csv)",
61
+ ent, form or "valor del proveedor por partido, agregado como PROMEDIO por partido",
62
+ info.get("tipo", ""), " · ".join(groups.get(name, [])),
63
+ "negativa (menos = mejor)" if info.get("negativa") else "")
64
+
65
+ # ── 2. sequences.parquet ─────────────────────────────────────────────────────
66
+ for name in dsv["sequences.parquet"]["variables"]:
67
+ if name in META:
68
+ continue
69
+ ent, form = f(name)
70
+ add(name, "", "sequences.parquet", "calculada",
71
+ "scripts/build_sequence_features_v3.py:aggregate (vía ejes_pipeline.py)",
72
+ ent, form or "métrica de la secuencia (ver script)")
73
+
74
+ # ── 3. team_resources.parquet + tasas derivadas ──────────────────────────────
75
+ CRUDAS = {"n_matches": "partidos jugados", "n_intentos": "intentos del recurso",
76
+ "n_exitos": "intentos exitosos", "pv_sum": "Σ pvAdded", "pv_n": "nº de pvAdded sumados",
77
+ "pv_ok_sum": "Σ pvAdded de exitosos", "pv_ok_n": "nº de esos", "n_seqs": "secuencias únicas",
78
+ "tiros": "tiros en esas secuencias", "goles": "goles", "xg_acum": "Σ xG",
79
+ "n_ok_seqs": "secuencias con el recurso exitoso", "xg_ok": "Σ xG de esas",
80
+ "evento_clave": "veces que el recurso fue la acción de MÁS pvAdded del ataque"}
81
+ for name, desc in CRUDAS.items():
82
+ add(name, "", "team_resources.parquet", "calculada",
83
+ "scripts/lowblock_extract_events.py → lowblock_build_artifacts.py",
84
+ "eventos del preprocessed", f"suma cruda por liga·temp·equipo·lado·recurso·bloque: {desc}")
85
+ for name in ["intentos_90", "pv_jugada", "pv_jugada_exitosa", "pct_exito", "tiros_jugada",
86
+ "xg_jugada", "xg_jugada_exitosa", "pct_goles"]:
87
+ ent, form = f(name)
88
+ add(name, "", "team_resources.parquet (derivada en la app)", "calculada",
89
+ "lowblock_data.py:_combine / app.js:_lbCombine",
90
+ ent, form or "tasa recalculada al combinar los bloques elegidos")
91
+
92
+ # ── 4. Ejes ──────────────────────────────────────────────────────────────────
93
+ LBL = {"verticalidad": "Verticalidad", "elaboracion": "Elaboración", "individual": "Juego individual",
94
+ "rotura_profundidad": "Rotura de líneas / profundidad", "amplitud_centro": "Amplitud / centros",
95
+ "robo_alto": "Robo alto", "aereo_segunda": "Aéreo / 2ª jugada"}
96
+ for eje, comps in ejes_def.items():
97
+ add(f"eje_{eje}", LBL.get(eje, eje), "ejes/*.parquet", "calculada",
98
+ "scripts/ejes_build_artifacts.py", ", ".join(comps),
99
+ "promedio de los z-score (dentro de liga-temporada) de sus métricas; en 'ppda' se invierte el signo")
100
+ for name, desc in {"mix_z": "score del eje en z dentro de su liga-temporada",
101
+ "mix_global": "score del eje en unidades globales (comparable entre ligas)",
102
+ "real": "tiros reales en jugadas de ese eje", "esperado": "tiros esperados (modelo P(tiro))",
103
+ "liga_real": "media de la liga", "n_alto": "nº de secuencias 'eje alto' que sostienen el valor",
104
+ "tiros_esp": "tiros esperados de la secuencia (modelo P(tiro))",
105
+ "tiros_real": "tiros reales"}.items():
106
+ add(name, "", "ejes/*.parquet", "calculada", "scripts/ejes_build_artifacts.py",
107
+ "sequences.parquet", desc)
108
+
109
+ # ── 5. goalkicks ─────────────────────────────────────────────────────────────
110
+ for name in dsv.get("goalkicks/team_profiles.parquet", {}).get("variables", []):
111
+ if name in META:
112
+ continue
113
+ add(name, "", "goalkicks/team_profiles.parquet", "calculada",
114
+ "scripts/build_goalkick_artifacts.py", "secuencias que nacen en saque de arco (qualifier 124)",
115
+ "perfil de salida desde el arco", nota="sección de la app todavía en desarrollo (WIP)")
116
+
117
+ OUT.mkdir(parents=True, exist_ok=True)
118
+ cols = ["variable", "nombre_de_uso", "dataset", "origen", "generado_por", "entradas",
119
+ "como_se_calcula", "tipo", "grupos", "nota"]
120
+ with (OUT / "variables.csv").open("w", newline="", encoding="utf-8") as fh:
121
+ w = csv.DictWriter(fh, fieldnames=cols)
122
+ w.writeheader()
123
+ w.writerows(rows)
124
+
125
+ # markdown por dataset
126
+ by_ds: dict[str, list] = {}
127
+ for r in rows:
128
+ by_ds.setdefault(r["dataset"], []).append(r)
129
+ n_dir = sum(1 for r in rows if r["origen"] == "directa")
130
+ md = ["# Diccionario de variables", "",
131
+ "Qué significa cada variable, de dónde sale y —si la calculamos nosotros— con qué fórmula.", "",
132
+ "## Cómo leer este archivo", "",
133
+ "Lo que más importa de cada variable es su **origen**:", "",
134
+ "| Origen | Qué significa |", "|---|---|",
135
+ "| **directa** | viene así del proveedor; nosotros solo la promediamos por partido |",
136
+ "| **calculada** | la computamos nosotros, y acá está de qué sale y cómo |", "",
137
+ f"En total hay **{len(rows)} variables** en {len(by_ds)} datasets: "
138
+ f"**{n_dir} directas** y **{len(rows)-n_dir} calculadas**.", "",
139
+ "Una misma variable puede aparecer **dos veces** si existe en dos datasets con orígenes",
140
+ "distintos (`ppda` es el caso típico: directa del proveedor por equipo, y calculada por",
141
+ "nosotros por jugada). No son intercambiables.", "",
142
+ "> Este archivo lo genera `scripts/gen_diccionario_variables.py`: **no editarlo a mano**.",
143
+ "> Para trabajarlo en Excel, usá [variables.csv](variables.csv).", "",
144
+ "## Los datasets de un vistazo", "",
145
+ "| Dataset | Qué guarda | Variables | Origen |", "|---|---|---|---|"]
146
+ QUE = {"team_stats_agg.parquet": "estadísticas de equipo por temporada (la base de la app)",
147
+ "sequences.parquet": "una fila por jugada: cómo fue construida",
148
+ "team_resources.parquet": "recursos para romper un bloque, por equipo",
149
+ "team_resources.parquet (derivada en la app)": "las tasas que la app recalcula al combinar bloques",
150
+ "ejes/*.parquet": "los 7 ejes de estilo por equipo",
151
+ "goalkicks/team_profiles.parquet": "perfil de salida desde el arco"}
152
+ for ds, rs in by_ds.items():
153
+ d = sum(1 for r in rs if r["origen"] == "directa")
154
+ md.append(f"| `{ds}` | {QUE.get(ds, '')} | {len(rs)} | "
155
+ f"{'todas calculadas' if not d else f'{d} directas / {len(rs)-d} calculadas'} |")
156
+ md.append("")
157
+ for ds, rs in by_ds.items():
158
+ md += [f"## `{ds}`", "",
159
+ "| Variable | Nombre de uso | Origen | De qué sale | Cómo se calcula |", "|---|---|---|---|---|"]
160
+ for r in sorted(rs, key=lambda x: x["variable"]):
161
+ md.append(f"| `{r['variable']}` | {r['nombre_de_uso']} | {r['origen']} | {r['entradas']} | {r['como_se_calcula']} |")
162
+ md.append("")
163
+ (OUT / "variables.md").write_text("\n".join(md), encoding="utf-8")
164
+ # ── tablas por GRUPO (estilo "Estilos de juego - bloque.xlsx") inyectadas en los .md ──────
165
+ def tabla_grupos() -> str:
166
+ porg: dict[str, list[str]] = {}
167
+ for col, gs in groups.items():
168
+ for g in gs:
169
+ porg.setdefault(g, []).append(col)
170
+ out = [f"*{len(porg)} grupos · {sum(len(v) for v in porg.values())} asignaciones. "
171
+ "Una variable puede estar en varios grupos.*", ""]
172
+ for g in sorted(porg):
173
+ cols = sorted(porg[g], key=lambda c: (vd.get(c, {}).get("label", c) or c).lower())
174
+ out += [f"### {g} ({len(cols)})", "", "| Variable | Nombre de uso |", "|---|---|"]
175
+ out += [f"| `{c}` | {vd.get(c, {}).get('label', '')} |" for c in cols]
176
+ out.append("")
177
+ return "\n".join(out)
178
+
179
+
180
+ def tabla_tipos() -> str:
181
+ port: dict[str, list[str]] = {}
182
+ for c, i in vd.items():
183
+ port.setdefault(i.get("tipo", "Otras"), []).append(c)
184
+ out = ["| Tipo | Variables |", "|---|---|"]
185
+ out += [f"| {t} | {len(port[t])} |" for t in sorted(port)]
186
+ return "\n".join(out)
187
+
188
+
189
+ def tabla_ejes() -> str:
190
+ out = ["| Eje | Nombre de uso | Métricas que lo componen |", "|---|---|---|"]
191
+ for eje, comps in ejes_def.items():
192
+ out.append(f"| `eje_{eje}` | {LBL.get(eje, eje)} | " + ", ".join(f"`{c}`" for c in comps) + " |")
193
+ return "\n".join(out)
194
+
195
+
196
+ AUTO = {"grupos": tabla_grupos, "tipos": tabla_tipos, "ejes": tabla_ejes}
197
+ import re as _re
198
+ for md_path in sorted(OUT.glob("*/*.md")):
199
+ txt = md_path.read_text(encoding="utf-8")
200
+ new = txt
201
+ for key, fn in AUTO.items():
202
+ pat = _re.compile(r"(<!-- AUTO:" + key + r" -->)(.*?)(<!-- /AUTO:" + key + r" -->)", _re.S)
203
+ if pat.search(new):
204
+ new = pat.sub(lambda m: m.group(1) + "\n" + fn() + "\n" + m.group(3), new)
205
+ if new != txt:
206
+ md_path.write_text(new, encoding="utf-8")
207
+ print(f" inyectado: reportes/{md_path.name}")
208
+
209
+
210
+ # ── CSV "ancho" por reporte/gráfico (formato de "Estilos de juego - bloque.xlsx"): ───────────
211
+ # una COLUMNA por grupo/categoría, y en las celdas las variables. Se rellena con vacío.
212
+ def _write_wide(path: Path, cats: dict[str, list[str]]) -> None:
213
+ cols = list(cats)
214
+ alto = max((len(v) for v in cats.values()), default=0)
215
+ with path.open("w", newline="", encoding="utf-8") as fh:
216
+ w = csv.writer(fh)
217
+ w.writerow(cols)
218
+ for i in range(alto):
219
+ w.writerow([(cats[c][i] if i < len(cats[c]) else "") for c in cols])
220
+
221
+
222
+ def _pair(cats_cols: dict[str, list[str]]) -> dict:
223
+ """Para cada categoría deja DOS columnas: el nombre con el que la llamamos y el técnico."""
224
+ out: dict[str, list[str]] = {}
225
+ for cat, cols in cats_cols.items():
226
+ cols = sorted(cols, key=lambda c: (vd.get(c, {}).get("label", c) or c).lower())
227
+ out[cat] = [vd.get(c, {}).get("label", c) or c for c in cols]
228
+ out[f"{cat} · variable"] = list(cols)
229
+ return out
230
+
231
+
232
+ def _cats_grupos() -> dict:
233
+ porg: dict[str, list[str]] = {}
234
+ for col, gs in groups.items():
235
+ for g in gs:
236
+ porg.setdefault(g, []).append(col)
237
+ return _pair({g: porg[g] for g in sorted(porg)})
238
+
239
+
240
+ def _cats_tipos() -> dict:
241
+ port: dict[str, list[str]] = {}
242
+ for c, i in vd.items():
243
+ port.setdefault(i.get("tipo", "Otras"), []).append(c)
244
+ return _pair({t: port[t] for t in sorted(port)})
245
+
246
+
247
+ def _cats_ejes() -> dict:
248
+ # las métricas de los ejes son de sequences.parquet (no tienen label en var_dict)
249
+ out: dict[str, list[str]] = {}
250
+ for e, cs in ejes_def.items():
251
+ out[LBL.get(e, e)] = list(cs)
252
+ return out
253
+
254
+
255
+ def _cats_recursos() -> dict:
256
+ lb = json.loads((ROOT / "webapp-static/site/lowblock.json").read_text(encoding="utf-8"))["options"]
257
+ return {"Lado": ["Ofensivo (of)", "Defensivo (def)"],
258
+ "Bloque": list(lb.get("bloques", {}).values()),
259
+ "Recursos": list(lb.get("recursos", {}).values()),
260
+ "Métricas": list(lb.get("metricas", {}).values())}
261
+
262
+
263
+ # Carpetas espejo de las apps: equipos-y-variables/ · reportes-de-partido/ · modelos/ · analisis/
264
+ _wide = {"equipos-y-variables/top-equipos": _cats_grupos,
265
+ "equipos-y-variables/perfil-y-similares": _cats_grupos,
266
+ "equipos-y-variables/scatter-libre": _cats_tipos,
267
+ "equipos-y-variables/ejes-ataque-defensa": _cats_ejes,
268
+ "equipos-y-variables/recursos": _cats_recursos}
269
+ for rel, fn in _wide.items():
270
+ _write_wide(OUT / f"{rel}.csv", fn())
271
+ cats_json = json.loads((OUT / "_reportes_categorias.json").read_text(encoding="utf-8"))
272
+ for rel, cats in cats_json.items():
273
+ (OUT / rel).parent.mkdir(parents=True, exist_ok=True)
274
+ _write_wide(OUT / f"{rel}.csv", cats)
275
+ print(f" CSV: {len(_wide) + len(cats_json)} archivos")
276
+
277
+ print(f"OK variables.csv / variables.md — {len(rows)} variables, {len(by_ds)} datasets")
278
+ for ds, rs in by_ds.items():
279
+ print(f" {ds:44} {len(rs):4}")
scripts/push_data_to_hf.py ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Sube vendor/data al dataset privado `rrc-data` y reinicia el Space RRC.
2
+
3
+ Es el paso que faltaba en la rutina: el Space baja su data de este dataset al bootear
4
+ (``ensure_data`` con ``RR_DATA_REPO``). Subiendo acá los artefactos frescos + reiniciando
5
+ el Space, la app de HF queda actualizada. ``upload_folder`` sube SOLO los archivos que
6
+ cambiaron (dedupe por hash), así que aunque mande toda la carpeta transfiere poco.
7
+
8
+ Usa el token HF ya configurado localmente (whoami = pablogrois). Uso:
9
+
10
+ python racing-reports/scripts/push_data_to_hf.py
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ from pathlib import Path
16
+
17
+ from huggingface_hub import HfApi
18
+
19
+ DATASET_ID = "pablogrois/rrc-data"
20
+ SPACE_ID = "pablogrois/RRC"
21
+ DATA_DIR = Path(__file__).resolve().parents[1] / "vendor" / "data"
22
+
23
+
24
+ def main() -> None:
25
+ if not DATA_DIR.is_dir():
26
+ raise SystemExit(f"No existe {DATA_DIR}")
27
+ api = HfApi()
28
+ who = api.whoami()["name"]
29
+ print(f"[hf] usuario {who} → subiendo {DATA_DIR} a datasets/{DATASET_ID} …", flush=True)
30
+ api.upload_folder(
31
+ folder_path=str(DATA_DIR),
32
+ repo_id=DATASET_ID,
33
+ repo_type="dataset",
34
+ commit_message="Refresh semanal de artefactos (rutina martes)",
35
+ )
36
+ print("[hf] dataset actualizado. Reiniciando Space para que re-sincronice…", flush=True)
37
+ api.restart_space(SPACE_ID)
38
+ print(f"[hf] Space {SPACE_ID} reiniciándose ✓", flush=True)
39
+
40
+
41
+ if __name__ == "__main__":
42
+ main()
scripts/var_labels_extra.json ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "pases_progresivos": "Pases Progresivos",
3
+ "secuencias_build_up": "Secuencias Build Up",
4
+ "pct_pases_fuera_area_gk": "GK % Pases Fuera del Área",
5
+ "pct_pases_rasos_gk": "GK % Pases Rasos",
6
+ "avg_distancia_porteria_pases_cortos_gk": "GK avg Dist. Porteria en Pases Cortos",
7
+ "pases_progresivos_rival": "Pases Progresivos del Rival",
8
+ "xg_avg_vs_bloque_alto_rival": "xG conc avg vs Bloque Alto",
9
+ "xg_avg_vs_bloque_bajo_rival": "xG conc avg vs Bloque Bajo",
10
+ "xg_avg_vs_bloque_medio_rival": "xG conc avg vs Bloque Medio",
11
+ "xg_secuencias_build_up_rival": "xG conc Build Up",
12
+ "xg_tras_centro_raso_temprano_rival": "xG conc tras Centro Raso Temprano",
13
+ "xg_tras_centro_raso_area_cutback_rival": "xG conc tras Cutback",
14
+ "xg_tras_centro_raso_area_dividido_rival": "xG conc tras Dividido",
15
+ "xg_tras_error_rival": "xG conc tras Error",
16
+ "xg_tras_centro_inswinger_area_rival": "xG conc tras Inswinger",
17
+ "xg_tras_centro_inswinger_temprano_rival": "xG conc tras Inswinger Temprano",
18
+ "xg_tras_centro_outswinger_area_rival": "xG conc tras Outswinger",
19
+ "xg_tras_centro_outswinger_temprano_rival": "xG conc tras Outswinger Temprano",
20
+ "xg_tras_profundidad_media_rival": "xG conc tras Profundidad",
21
+ "xg_tras_profundidad_corta_rival": "xG conc tras Prof. Corta",
22
+ "xg_tras_profundidad_larga_rival": "xG conc tras Prof. Larga",
23
+ "xg_vs_bloque_alto_rival": "xG conc vs Bloque Alto",
24
+ "xg_vs_bloque_bajo_rival": "xG conc vs Bloque Bajo",
25
+ "xg_vs_bloque_medio_rival": "xG conc vs Bloque Medio",
26
+ "pct_centros_aereo_rival": "% Centros Aéreos del Rival",
27
+ "tiros_mas_25_metros_rival": "Tiros Conc. +25 m",
28
+ "xg_tiros_mas_25_metros_rival": "xG Conc. Tiros +25 m",
29
+ "pct_tiros_fuera_area_rival": "% Tiros Fuera del Área del Rival",
30
+ "pct_tiros_cabeza_rival": "% Tiros de Cabeza del Rival",
31
+ "pct_pases_al_area_son_centros_rival": "% Pases al Área que son Centros del Rival",
32
+ "pct_centros_zona_bandas_rival": "% Centros desde Banda del Rival",
33
+ "pct_centros_rasos_zona_bandas_rival": "% Centros Rasos desde Banda del Rival",
34
+ "pct_pases_al_corte_zona_bandas_rival": "% Pases al Corte desde Banda del Rival",
35
+ "pct_pases_hacia_atras_zona_bandas_rival": "% Pases Atrás desde Banda del Rival",
36
+ "pct_cutback_zona_bandas_rival": "% Cutback desde Banda del Rival",
37
+ "pct_dividido_zona_bandas_rival": "% Dividido desde Banda del Rival",
38
+ "pct_takeon_zona_bandas_rival": "% Regate desde Banda del Rival",
39
+ "xg_tras_presion_alta": "xG tras Press Alta",
40
+ "xg_tras_recuperacion_tras_perdida": "xG tras Recup tras Perdida",
41
+ "pct_segundas_jugadas_ganadas_tras_duelo_aereo": "% 2ª Jugada Ganada Tras Duelo Aéreo",
42
+ "pct_segundas_jugadas_ganadas_tras_duelo_aereo_rival": "% 2ª Jugada Ganada Tras Duelo Aéreo del Rival",
43
+ "xg_avg_vs_bloque_alto": "xG avg vs Bloque Alto",
44
+ "xg_avg_vs_bloque_bajo": "xG avg vs Bloque Bajo",
45
+ "xg_avg_vs_bloque_medio": "xG avg vs Bloque Medio",
46
+ "xg_tras_centro_raso_temprano": "xG tras Centro Raso Temprano",
47
+ "xg_tras_centro_raso_area_cutback": "xG tras Cutback",
48
+ "xg_tras_centro_raso_area_dividido": "xG tras Dividido",
49
+ "xg_tras_error": "xG tras Error",
50
+ "xg_tras_centro_inswinger_area": "xG tras Inswinger",
51
+ "xg_tras_centro_inswinger_temprano": "xG tras Inswinger Temprano",
52
+ "xg_tras_centro_outswinger_area": "xG tras Outswinger",
53
+ "xg_tras_centro_outswinger_temprano": "xG tras Outswinger Temprano",
54
+ "xg_tras_profundidad_media": "xG tras Profundidad",
55
+ "xg_tras_profundidad_corta": "xG tras Prof. Corta",
56
+ "xg_tras_profundidad_larga": "xG tras Prof. Larga",
57
+ "xg_vs_bloque_alto": "xG vs Bloque Alto",
58
+ "xg_vs_bloque_bajo": "xG vs Bloque Bajo",
59
+ "xg_vs_bloque_medio": "xG vs Bloque Medio",
60
+ "pct_centros_aereo": "% Centros Aéreos",
61
+ "tiros_mas_25_metros": "Tiros +25 m",
62
+ "pct_tiros_fuera_area": "% Tiros Fuera del Área",
63
+ "pct_tiros_cabeza": "% Tiros de Cabeza",
64
+ "pct_pases_al_area_son_centros": "% Pases al Área que son Centros",
65
+ "pct_centros_zona_bandas": "% Centros desde Banda",
66
+ "pct_centros_rasos_zona_bandas": "% Centros Rasos desde Banda",
67
+ "pct_pases_al_corte_zona_bandas": "% Pases al Corte desde Banda",
68
+ "pct_pases_hacia_atras_zona_bandas": "% Pases Atrás desde Banda",
69
+ "pct_cutback_zona_bandas": "% Cutback desde Banda",
70
+ "pct_dividido_zona_bandas": "% Dividido desde Banda",
71
+ "pct_takeon_zona_bandas": "% Regate desde Banda",
72
+ "avg_distancia_centroide": "Avg Dist. Centroide",
73
+ "avg_ancho_robusto_equipo": "Ancho Robusto Equipo avg",
74
+ "indice_verticalidad_transiciones_avg_rival": "Indice Verticalidad Transiciones Conc. (Avg)",
75
+ "indice_verticalidad_transiciones_suma_rival": "Indice Verticalidad Transiciones Conc. (Suma)",
76
+ "xg_tras_recuperacion_tras_perdida_rival": "xG conc tras Recup tras Perdida",
77
+ "xg_tras_transicion_abp_rival": "xG conc tras Transicion ABP",
78
+ "xg_tras_transicion_bloque_bajo_medio_rival": "xG conc tras Transicion Bloque Bajo-Medio",
79
+ "xg_tras_transicion_juego_directo_rival": "xG conc tras Transicion Juego Directo",
80
+ "indice_verticalidad_transiciones_avg": "Indice Verticalidad Transiciones (Avg)",
81
+ "indice_verticalidad_transiciones_suma": "Indice Verticalidad Transiciones (Suma)",
82
+ "xg_tras_transicion_abp": "xG tras Transicion ABP",
83
+ "xg_tras_transicion_bloque_bajo_medio": "xG tras Transicion Bloque Bajo-Medio",
84
+ "xg_tras_transicion_juego_directo": "xG tras Transicion Juego Directo",
85
+ "avg_ancho_robusto_equipo_rival": "Ancho Robusto Equipo avg del Rival",
86
+ "avg_distancia_centroide_rival": "Avg Dist. Centroide del Rival",
87
+ "avg_distancia_porteria_pases_cortos_gk_rival": "GK avg Dist. Porteria en Pases Cortos del Rival",
88
+ "pct_pases_fuera_area_gk_rival": "GK % Pases Fuera del Área del Rival",
89
+ "pct_pases_rasos_gk_rival": "GK % Pases Rasos del Rival",
90
+ "secuencias_build_up_rival": "Secuencias Build Up del Rival",
91
+ "secuencias_con_tiro": "Secuencias con Tiro",
92
+ "secuencias_con_tiro_rival": "Secuencias con Tiro del Rival",
93
+ "xg_secuencias_build_up": "xG Build Up",
94
+ "xg_tiros_mas_25_metros": "xG Tiros +25 m",
95
+ "xg_tras_presion_alta_rival": "xG conc tras Press Alta",
96
+ "xt_acumulado_rival": "xT Acumulado del Rival"
97
+ }
src/racing_reports/web/templates/referencia.html CHANGED
The diff for this file is too large to render. See raw diff