Spaces:
Running
Running
| import gradio as gr | |
| import matplotlib.pyplot as plt | |
| import polars as pl | |
| from data import SEASONS, data_df | |
| from plotting import create_pitcher_overview_card | |
| notes = '''**Limitations** | |
| - Only supports regular season data | |
| **To-do** | |
| - Add teams insignias | |
| - Measure percentiles per pitcher handedness | |
| - Allow for arbitrary date ranges | |
| - Improve readability of pitch velocities | |
| - Add post-season | |
| ''' | |
| def dummy(*inputs): | |
| return inputs | |
| def gr_create_pitcher_overview_card(name, season): | |
| # pit_id = name.split(' | ')[-1] | |
| # hard-coded to only do regular season | |
| pit_id = data_df.filter((pl.col('pitcher_name') == name) & (pl.col('date').dt.year() == season) & (pl.col('coarse_game_kind') == 'Regular Season'))['pitId'].unique() | |
| if len(pit_id) == 0: | |
| raise gr.Error(f"No data found for {name} in {season}. If the name looks strangely spelled or formatted there's a possibility that's what causing the error.") | |
| elif len(pit_id) > 1: | |
| raise gr.Error(f'Multiple IDs for {name}') | |
| else: | |
| pit_id = pit_id.item() | |
| create_pitcher_overview_card(pit_id, season=season, dpi=300) | |
| plt.savefig('tmp.png', bbox_inches='tight') | |
| return 'tmp.png' | |
| # def adjust_season_end_based_on_season_start(season_start, season_end): | |
| # return max(season_start, season_end) | |
| # | |
| # def adjust_season_start_based_on_season_end(season_end, season_start): | |
| # return min(season_start, season_end) | |
| def create_pitcher_overview(data_df): | |
| with gr.Blocks() as app: | |
| gr.Markdown('# Pitcher Overview') | |
| with gr.Row(): | |
| with gr.Column(): | |
| # names = [f'{pit_name} | {pit_id}' for pit_name, pit_id in data_df[['pitcher_name', 'pitId']].unique().sort('pitId').iter_rows()] | |
| names = data_df['pitcher_name'].unique().sort().to_list() | |
| name = gr.Dropdown(names, label='Name') | |
| season = gr.Dropdown(SEASONS, value=max(SEASONS), label='Season') | |
| # season_start = gr.Dropdown(SEASONS, label='Season start') | |
| # season_end = gr.Dropdown(SEASONS, label='Season end') | |
| # game_type = gr.Dropdown(['Spring Training', 'Regular Season', 'Postseason'], label='Game Type']) | |
| view = gr.Button('View') | |
| gr.Markdown(notes) | |
| with gr.Column(): | |
| overview_card = gr.Image(label='Overview') | |
| # season_start.input(adjust_season_end_based_on_season_start, inputs=[season_start, season_end], outputs=season_end) | |
| # season_end.input(adjust_season_start_based_on_season_end, inputs=[season_end, season_start], outputs=season_start) | |
| view.click(gr_create_pitcher_overview_card, inputs=[name, season], outputs=overview_card) | |
| return app | |
| if __name__ == '__main__': | |
| create_pitcher_overview(data_df).launch() | |