Syntrex commited on
Commit
c151fc1
·
verified ·
1 Parent(s): 8b77825

Update models/pitch_sequence_model.py

Browse files
Files changed (1) hide show
  1. models/pitch_sequence_model.py +40 -1
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": pitcher_row.get("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