Skip to content

Instantly share code, notes, and snippets.

@sbrown70
sbrown70 / gist:6549c7de1e5d449effb570f387c9cecf
Created September 19, 2025 16:58
get_ball_xyz_at_intercept
stance_data=(
pl.read_csv(r".\stance_data_20250919_v2.csv") ## Download link: https://baseballsavant.mlb.com/visuals/batting-stance?gameType=Regular&groupBy=year%7Capi_game_date_month_text%7Cis_pre_strike_count_2&minSwings=1&minGroupSwings=1&seasonStart=2023&seasonEnd=2025&interceptView=false
.rename({
"id":"batter",
"api_game_date_month_mm":"month",
"bat_side":"stand",
"name":"batter_name",
"year":"game_year",
})
.select([
@sbrown70
sbrown70 / gist:97f59826ea2e7eb9547ed5ef3525f1fc
Created April 26, 2025 19:03
calculate_release_metrics_with_approach_angles
def add_release_metrics_aa(df):
df = (
df
.assign(
y0=50,
yf=17/12,
yR=lambda df: 60.5 - df['release_extension'],
tR=lambda df: (-df['vy0'] - np.sqrt(df['vy0']**2 - 2 * df['ay'] * (df['y0'] - df['yR']))) / df['ay'],
vxR=lambda df: df['vx0'] + df['ax'] * df['tR'],
vyR=lambda df: df['vy0'] + df['ay'] * df['tR'],
@sbrown70
sbrown70 / gist:3a75eca8a76ac89e8572e72a882c7ad7
Created March 10, 2025 19:01
get_statcast_data_fixed_again_final
def get_statcast(input_year,milb):
sc_request_str = "/csv?all=true&hfPT=&hfAB=&hfBBT=&hfPR=&hfZ=&stadium=&hfBBL=&hfNewZones=&hfGT=R%7CPO%7CS%7C=&hfSea=&hfSit=&player_type=pitcher&hfOuts=&opponent=&pitcher_throws=&batter_stands=&hfSA=&game_date_gt={start_dt}&game_date_lt={end_dt}&team={team}&position=&hfRO=&home_road=&hfFlag=&metric_1=&hfInn=&min_pitches=0&min_results=0&group_by=name&sort_col=pitches&player_event_sort=h_launch_speed&sort_order=desc&min_abs=0&type=details&"
import io
import os
from datetime import datetime
from typing import List, Union
import numpy as np
import pandas as pd
@sbrown70
sbrown70 / gist:a8db0a3cc21ce21a4c9cc6a03928e166
Created March 10, 2025 18:39
fixed_statcast_for_real_this_time
def get_statcast(input_year,milb):
sc_request_str = "/csv?all=true&hfPT=&hfAB=&hfBBT=&hfPR=&hfZ=&stadium=&hfBBL=&hfNewZones=&hfGT=R%7CPO%7CS%7C=&hfSea=&hfSit=&player_type=pitcher&hfOuts=&opponent=&pitcher_throws=&batter_stands=&hfSA=&game_date_gt={start_dt}&game_date_lt={end_dt}&team={team}&position=&hfRO=&home_road=&hfFlag=&metric_1=&hfInn=&min_pitches=0&min_results=0&group_by=name&sort_col=pitches&player_event_sort=h_launch_speed&sort_order=desc&min_abs=0&type=details&"
import io
import os
from datetime import datetime
from typing import List, Union
import numpy as np
import pandas as pd
def get_statcast(input_year,milb):
sc_request_str = "/csv?all=true&hfPT=&hfAB=&hfBBT=&hfPR=&hfZ=&stadium=&hfBBL=&hfNewZones=&hfGT=R%7CPO%7CS%7C=&hfSea=&hfSit=&player_type=pitcher&hfOuts=&opponent=&pitcher_throws=&batter_stands=&hfSA=&game_date_gt={start_dt}&game_date_lt={end_dt}&team={team}&position=&hfRO=&home_road=&hfFlag=&metric_1=&hfInn=&min_pitches=0&min_results=0&group_by=name&sort_col=pitches&player_event_sort=h_launch_speed&sort_order=desc&min_abs=0&type=details&"
import io
import os
from datetime import datetime
from typing import List, Union
import numpy as np
import pandas as pd
def get_statcast(input_year,milb):
sc_request_str = "/csv?all=true&hfPT=&hfAB=&hfBBT=&hfPR=&hfZ=&stadium=&hfBBL=&hfNewZones=&hfGT=R%7CPO%7CS%7C=&hfSea=&hfSit=&player_type=pitcher&hfOuts=&opponent=&pitcher_throws=&batter_stands=&hfSA=&game_date_gt={start_dt}&game_date_lt={end_dt}&team={team}&position=&hfRO=&home_road=&hfFlag=&metric_1=&hfInn=&min_pitches=0&min_results=0&group_by=name&sort_col=pitches&player_event_sort=h_launch_speed&sort_order=desc&min_abs=0&type=details&"
import io
import os
from datetime import datetime
from typing import List, Union
import numpy as np
import pandas as pd