import gradio as gr import matplotlib.pyplot as plt import datetime from plotting import create_daily_weekly_leaderboard from data import data_df def gr_create_daily_weekly_leaderboards(leaderboard_date, whiff_leaders, velo_leaders, data_df): filenames = [] for time_type in ('daily', 'weekly'): for stat, leaders in zip(('whiff', 'velo'), (whiff_leaders, velo_leaders)): create_daily_weekly_leaderboard(stat, leaderboard_date, time_type, leaders, data_df) filename = f'{stat}_{time_type}.png' plt.savefig(filename, bbox_inches='tight') filenames.append(filename) return filenames def go_back_day(date): return date - datetime.timedelta(days=1) def go_forward_day(date): return date + datetime.timedelta(days=1) def go_back_week(date): return date - datetime.timedelta(days=7) def go_forward_week(date): return date + datetime.timedelta(days=7) def create_daily_weekly_leaderboard_app(data_df): with gr.Blocks() as app: gr.Markdown('# Daily/Weekly Leaderboards') _data_df = gr.State(data_df) with gr.Row(): date_init = data_df['date'].max() date_init = datetime.datetime(date_init.year, date_init.month, date_init.day) leaderboard_date = gr.DateTime(date_init, include_time=False, type='datetime', label='Date') whiff_leaders = gr.Number(10, precision=0, minimum=0, label='Whiff Leaders') velo_leaders = gr.Number(10, precision=0, minimum=0, label='Velo Leaders') search = gr.Button('Search') with gr.Row(): prev_week = gr.Button('Previous Week') prev_day = gr.Button('Previous Day') next_day = gr.Button('Next Day') next_week = gr.Button('Next Week') leaderboards = [] for time_type in ('Daily', 'Weekly'): with gr.Row(): gr.Markdown(f'## {time_type}') with gr.Row(): for stat in ('Whiff', 'Velo'): leaderboards.append(gr.Image(label=f'{time_type} {stat} Leaderboard', height=512)) search.click(gr_create_daily_weekly_leaderboards, inputs=[leaderboard_date, whiff_leaders, velo_leaders, _data_df], outputs=leaderboards) for btn, fn in ( (prev_day, go_back_day), (next_day, go_forward_day), (prev_week, go_back_week), (next_week, go_forward_week) ): btn.click(fn, inputs=leaderboard_date, outputs=leaderboard_date) return app if __name__ == '__main__': app = create_daily_weekly_leaderboard_app(data_df) app.launch()