npb_data_app / pitcher_overview.py
patrickramos's picture
Update player name translation, add daily and weekly leaderboards
d3fa801
raw
history blame
2.67 kB
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()