Chapter 24: Key Takeaways
Quick Reference Summary
Tracking Data Fundamentals
| Concept | Key Points |
|---|---|
| Data Structure | x,y coordinates at 10-25 Hz for all 22 players + ball |
| Field Coordinates | 120 yards long (0-120), 53.3 yards wide (0-53.3) |
| Direction vs Orientation | Direction = movement angle; Orientation = body facing |
| Standardization | Transform so offense always moves left-to-right |
Essential Formulas
Speed Calculation:
speed = sqrt(vx² + vy²)
vx = (x[t] - x[t-1]) × frame_rate
Distance Between Players:
distance = sqrt((x1-x2)² + (y1-y2)²)
Time to Contact:
ttc = distance / closing_speed
closing_speed = |v1 - v2| (considering direction)
Total Distance Traveled:
distance = Σ sqrt(Δx² + Δy²) for all frames
Movement Metrics
| Metric | Formula/Description | Typical Range |
|---|---|---|
| Max Speed | Peak speed during play | 8-12 yds/sec |
| Acceleration | Δspeed / Δtime | 0-5 yds/sec² |
| Distance Traveled | Sum of frame-to-frame distances | 10-50 yards |
| Separation | Euclidean distance to nearest defender | 0-8 yards |
Route Classification
| Route Type | Depth | Lateral Movement |
|---|---|---|
| Go/Fly | >15 yards | <5 yards |
| Slant | <8 yards | >5 yards (crossing) |
| Out | <8 yards | >5 yards (sideline) |
| In/Dig | <12 yards | >5 yards (middle) |
| Curl | 8-15 yards | Returns toward QB |
| Corner | >10 yards | >8 yards (sideline) |
| Post | >10 yards | >8 yards (middle) |
Formation Analysis
Box Count: Defenders within 5 yards of LOS, between tackles
Personnel Notation: - First digit = RBs - Second digit = TEs - Example: "11" = 1 RB, 1 TE, 3 WRs
Backfield Types: - Under Center: QB <2 yards from center - Pistol: QB 2-4 yards from center - Shotgun: QB >4 yards from center
Separation Benchmarks
| Separation | Quality | Completion % |
|---|---|---|
| 0-1 yards | Tight | ~42% |
| 1-2 yards | Contested | ~59% |
| 2-3 yards | Average | ~71% |
| 3-4 yards | Good | ~79% |
| 4+ yards | Open | ~85%+ |
Code Patterns
Loading Tracking Data:
df = pd.read_csv('tracking.csv')
df = df.sort_values(['play_id', 'frame_id', 'player_id'])
Calculating Speed:
df['vx'] = df.groupby('player_id')['x'].diff() * frame_rate
df['vy'] = df.groupby('player_id')['y'].diff() * frame_rate
df['speed'] = np.sqrt(df['vx']**2 + df['vy']**2)
Finding Nearest Defender:
def nearest_defender_distance(rec_x, rec_y, defense_df):
distances = np.sqrt(
(defense_df['x'] - rec_x)**2 +
(defense_df['y'] - rec_y)**2
)
return distances.min()
Visualization Best Practices
- Field Background: Green (#228B22) with white yard lines
- Player Colors: Red for offense, blue for defense, brown for ball
- Animation Speed: 10-15 FPS for smooth playback
- Include: Yard lines, hash marks, end zones, current situation text
Common Pitfalls
| Issue | Problem | Solution |
|---|---|---|
| Speed spikes | Position noise | Apply smoothing filter |
| Missing frames | Data gaps | Interpolate or flag |
| Coordinate flip | Wrong direction | Check play_direction field |
| Player count | Not always 22 | Validate before analysis |
Key Metrics Summary
For Receivers: - Separation at throw - Separation created (max - initial) - Route efficiency (actual/straight distance) - Time to break
For Defense: - Box count - Safety depth and split - Coverage classification confidence - Time to pressure
For Quarterbacks: - Pocket area (convex hull) - Time to throw - Pressure rate - Optimal target selection
Industry Applications
- Player Evaluation: Quantify separation creation ability
- Game Planning: Identify defensive tendencies
- Real-Time Analytics: Live win probability and decisions
- Broadcasting: Enhanced viewer experience
- Contract Negotiation: Objective performance metrics