Spaces:
Sleeping
Sleeping
Update models/pitch_sequence_model.py
Browse files
models/pitch_sequence_model.py
CHANGED
|
@@ -19,12 +19,43 @@ def build_sequence_features(
|
|
| 19 |
except Exception:
|
| 20 |
return default
|
| 21 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 22 |
balls = _safe_int(game_row.get("balls"), 0)
|
| 23 |
strikes = _safe_int(game_row.get("strikes"), 0)
|
| 24 |
outs = _safe_int(game_row.get("outs"), 0)
|
| 25 |
|
| 26 |
last_pitch_type = str(game_row.get("pitch_type", "") or "").strip().lower()
|
| 27 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
return {
|
| 29 |
"balls": balls,
|
| 30 |
"strikes": strikes,
|
|
@@ -32,12 +63,20 @@ def build_sequence_features(
|
|
| 32 |
"runner_on_1b": bool(game_row.get("runner_on_1b", False)),
|
| 33 |
"runner_on_2b": bool(game_row.get("runner_on_2b", False)),
|
| 34 |
"runner_on_3b": bool(game_row.get("runner_on_3b", False)),
|
| 35 |
-
"pitcher_avg_release_speed":
|
|
|
|
|
|
|
| 36 |
"pitcher_ev_allowed": pitcher_row.get("ev_allowed"),
|
| 37 |
"batter_ev90": batter_row.get("ev90"),
|
| 38 |
"batter_barrel_rate": batter_row.get("barrel_rate"),
|
| 39 |
"batter_hard_hit_rate": batter_row.get("hard_hit_rate"),
|
| 40 |
"last_pitch_type": last_pitch_type,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 41 |
}
|
| 42 |
|
| 43 |
|
|
|
|
| 19 |
except Exception:
|
| 20 |
return default
|
| 21 |
|
| 22 |
+
def _safe_float(value: Any, default: float | None = None) -> float | None:
|
| 23 |
+
try:
|
| 24 |
+
if value is None:
|
| 25 |
+
return default
|
| 26 |
+
text = str(value).strip().lower()
|
| 27 |
+
if text in {"", "nan", "none"}:
|
| 28 |
+
return default
|
| 29 |
+
return float(value)
|
| 30 |
+
except Exception:
|
| 31 |
+
return default
|
| 32 |
+
|
| 33 |
balls = _safe_int(game_row.get("balls"), 0)
|
| 34 |
strikes = _safe_int(game_row.get("strikes"), 0)
|
| 35 |
outs = _safe_int(game_row.get("outs"), 0)
|
| 36 |
|
| 37 |
last_pitch_type = str(game_row.get("pitch_type", "") or "").strip().lower()
|
| 38 |
|
| 39 |
+
avg_release_speed = _safe_float(pitcher_row.get("avg_release_speed"))
|
| 40 |
+
avg_release_spin_rate = _safe_float(pitcher_row.get("avg_release_spin_rate"))
|
| 41 |
+
avg_release_extension = _safe_float(pitcher_row.get("avg_release_extension"))
|
| 42 |
+
|
| 43 |
+
last_pitch_velocity = _safe_float(game_row.get("pitch_velocity"))
|
| 44 |
+
last_pitch_spin_rate = _safe_float(game_row.get("pitch_spin_rate"))
|
| 45 |
+
last_pitch_extension = _safe_float(game_row.get("pitch_extension"))
|
| 46 |
+
|
| 47 |
+
velo_delta_from_baseline = None
|
| 48 |
+
if last_pitch_velocity is not None and avg_release_speed is not None:
|
| 49 |
+
velo_delta_from_baseline = last_pitch_velocity - avg_release_speed
|
| 50 |
+
|
| 51 |
+
spin_delta_from_baseline = None
|
| 52 |
+
if last_pitch_spin_rate is not None and avg_release_spin_rate is not None:
|
| 53 |
+
spin_delta_from_baseline = last_pitch_spin_rate - avg_release_spin_rate
|
| 54 |
+
|
| 55 |
+
extension_delta_from_baseline = None
|
| 56 |
+
if last_pitch_extension is not None and avg_release_extension is not None:
|
| 57 |
+
extension_delta_from_baseline = last_pitch_extension - avg_release_extension
|
| 58 |
+
|
| 59 |
return {
|
| 60 |
"balls": balls,
|
| 61 |
"strikes": strikes,
|
|
|
|
| 63 |
"runner_on_1b": bool(game_row.get("runner_on_1b", False)),
|
| 64 |
"runner_on_2b": bool(game_row.get("runner_on_2b", False)),
|
| 65 |
"runner_on_3b": bool(game_row.get("runner_on_3b", False)),
|
| 66 |
+
"pitcher_avg_release_speed": avg_release_speed,
|
| 67 |
+
"pitcher_avg_release_spin_rate": avg_release_spin_rate,
|
| 68 |
+
"pitcher_avg_release_extension": avg_release_extension,
|
| 69 |
"pitcher_ev_allowed": pitcher_row.get("ev_allowed"),
|
| 70 |
"batter_ev90": batter_row.get("ev90"),
|
| 71 |
"batter_barrel_rate": batter_row.get("barrel_rate"),
|
| 72 |
"batter_hard_hit_rate": batter_row.get("hard_hit_rate"),
|
| 73 |
"last_pitch_type": last_pitch_type,
|
| 74 |
+
"last_pitch_velocity": last_pitch_velocity,
|
| 75 |
+
"last_pitch_spin_rate": last_pitch_spin_rate,
|
| 76 |
+
"last_pitch_extension": last_pitch_extension,
|
| 77 |
+
"velo_delta_from_baseline": velo_delta_from_baseline,
|
| 78 |
+
"spin_delta_from_baseline": spin_delta_from_baseline,
|
| 79 |
+
"extension_delta_from_baseline": extension_delta_from_baseline,
|
| 80 |
}
|
| 81 |
|
| 82 |
|