patrickramos commited on
Commit
e7a5154
·
1 Parent(s): 26e0ac6

Update app

Browse files
Files changed (2) hide show
  1. demo.py +7 -2
  2. gradio_function.py +21 -10
demo.py CHANGED
@@ -35,7 +35,9 @@ with gr.Blocks(css=css) as demo:
35
  [Data from SportsNavi](https://sports.yahoo.co.jp/)
36
  ''')
37
  # player = gr.Dropdown(value=None, choices=sorted(player_df['name'].dropna().tolist()), label='Player')
38
- player = gr.Dropdown(value=None, choices=sorted(player_df.filter(pl.col('name').is_not_null())['name'].to_list()), label='Player')
 
 
39
  player_info = gr.Markdown()
40
  download_file = gr.DownloadButton(label='Download player data')
41
  with gr.Group():
@@ -83,7 +85,10 @@ with gr.Blocks(css=css) as demo:
83
  '''
84
  )
85
 
86
- player.input(get_data, inputs=player, outputs=[player_info, download_file, usage, pitch_velo_summary, pitch_loc_summary, *pitch_groups, *pitch_names, *pitch_infos, *pitch_velos, *pitch_maps, velo_stats])
 
 
 
87
 
88
  demo.launch(
89
  share=True,
 
35
  [Data from SportsNavi](https://sports.yahoo.co.jp/)
36
  ''')
37
  # player = gr.Dropdown(value=None, choices=sorted(player_df['name'].dropna().tolist()), label='Player')
38
+ with gr.Row():
39
+ player = gr.Dropdown(value=None, choices=sorted(player_df.filter(pl.col('name').is_not_null())['name'].to_list()), label='Player')
40
+ handedness = gr.Radio(value='Both', choices=['Both', 'Left', 'Right'], type='value', interactive=False, label='Batter Handedness')
41
  player_info = gr.Markdown()
42
  download_file = gr.DownloadButton(label='Download player data')
43
  with gr.Group():
 
85
  '''
86
  )
87
 
88
+ inputs = [player, handedness]
89
+ outputs = [player_info, handedness, download_file, usage, pitch_velo_summary, pitch_loc_summary, *pitch_groups, *pitch_names, *pitch_infos, *pitch_velos, *pitch_maps, velo_stats]
90
+ player.input(get_data, inputs=inputs, outputs=outputs)
91
+ handedness.input(get_data, inputs=inputs, outputs=outputs)
92
 
93
  demo.launch(
94
  share=True,
gradio_function.py CHANGED
@@ -49,7 +49,7 @@ colorscale = [
49
  ]
50
 
51
 
52
- def plot_pitch_map(player=None, loc=None, pitch_type=None, pitch_name=None, all_pitches=False, min_pitches=2):
53
  assert not ((loc is None and player is None) or (loc is not None and player is not None)), 'exactly one of `player` or `loc` must be specified'
54
 
55
  if loc is None and player is not None:
@@ -109,18 +109,19 @@ def plot_pitch_map(player=None, loc=None, pitch_type=None, pitch_name=None, all_
109
 
110
 
111
  # velo distribution
112
- def plot_pitch_velo(player=None, velos=None, pitch_type=None, pitch_name=None, min_pitches=2):
113
- assert not ((velos is None and player is None) or (velos is not None and player is not None)), 'exactly one of `player` or `loc` must be specified'
114
 
115
  if velos is None and player is not None:
116
  assert not ((pitch_type is None and pitch_name is None) or (pitch_type is not None and pitch_name is not None)), 'exactly one of `pitch_type` or `pitch_name` must be specified'
 
117
  pitch_val = pitch_type or pitch_name
118
  pitch_col = 'pitch_type' if pitch_type else 'pitch_name'
119
  # velos = df.set_index(['name', pitch_col]).sort_index().loc[(player, pitch_val), 'release_speed']
120
  velos = df.filter((pl.col('name') == player) & (pl.col(pitch_col) == pitch_val))['release_speed']
121
 
122
  if isinstance(velos, int):
123
- velos = [velos]
124
 
125
  fig = go.Figure()
126
  if len(velos) >= min_pitches:
@@ -157,11 +158,12 @@ def plot_pitch_velo(player=None, velos=None, pitch_type=None, pitch_name=None, m
157
  return fig
158
 
159
 
160
- def plot_all_pitch_velo(player=None, player_df=None, pitch_counts=None, min_pitches=2):
161
  # assert not ((player is None and player_df is None) or (player is not None and player_df is not None)), 'exactly one of `player` or `player_df` must be specified'
162
 
163
  if player_df is None and player is not None:
164
  assert pitch_counts is None, '`pitch_counts` must be `None` if `player_df` is None'
 
165
  # player_df = df.set_index('name').sort_index().loc[player].sort_values('pitch_name').set_index('pitch_name')
166
  # pitch_counts = player_df.index.value_counts(ascending=True)
167
  player_df = df.filter((pl.col('name') == player) & (pl.col('release_speed').is_not_null()))
@@ -251,13 +253,22 @@ def plot_all_pitch_velo(player=None, player_df=None, pitch_counts=None, min_pitc
251
  return fig
252
 
253
 
254
- def get_data(player):
255
  player_name = f'# {player}'
256
 
257
  # _df = df.set_index('name').sort_index().loc[player]
258
  # _df.to_csv(f'files/npb.csv', index=False)
259
  # _df_by_pitch_name = _df.set_index('pitch_name').sort_index()
260
  _df = df.filter(pl.col('name') == player)
 
 
 
 
 
 
 
 
 
261
 
262
  # usage_fig = px.pie(_df['pitch_name'], names='pitch_name')
263
  usage_fig = px.pie(_df.select('pitch_name'), names='pitch_name')
@@ -267,8 +278,8 @@ def get_data(player):
267
  pitch_counts = _df['pitch_name'].value_counts().sort('count', descending=True)
268
 
269
  # pitch_velo_summary = plot_all_pitch_velo(player=player, player_df=_df_by_pitch_name, pitch_counts=pitch_counts.sort_values(ascending=True))
270
- pitch_velo_summary = plot_all_pitch_velo(player=player, player_df=_df.filter(pl.col('release_speed').is_not_null()), pitch_counts=pitch_counts.sort('count', descending=False))
271
- pitch_loc_summary = plot_pitch_map(player, all_pitches=True)
272
 
273
  pitch_groups = []
274
  pitch_names = []
@@ -295,7 +306,7 @@ def get_data(player):
295
  visible=True
296
  ))
297
  pitch_maps.append(gr.update(
298
- value=plot_pitch_map(player, pitch_name=pitch_name),
299
  label='Pitch location',
300
  visible=True
301
  ))
@@ -322,4 +333,4 @@ def get_data(player):
322
  .drop('Count')
323
  )
324
 
325
- return player_name, 'files/npb.csv', usage_fig, pitch_velo_summary, pitch_loc_summary, *pitch_groups, *pitch_names, *pitch_infos, *pitch_velos, *pitch_maps, velo_stats
 
49
  ]
50
 
51
 
52
+ def plot_pitch_map(df, player=None, loc=None, pitch_type=None, pitch_name=None, all_pitches=False, min_pitches=2):
53
  assert not ((loc is None and player is None) or (loc is not None and player is not None)), 'exactly one of `player` or `loc` must be specified'
54
 
55
  if loc is None and player is not None:
 
109
 
110
 
111
  # velo distribution
112
+ def plot_pitch_velo(df=None, player=None, velos=None, pitch_type=None, pitch_name=None, min_pitches=2):
113
+ assert not ((velos is None and player is None) or (velos is not None and player is not None)), 'exactly one of `player` or `velos` must be specified'
114
 
115
  if velos is None and player is not None:
116
  assert not ((pitch_type is None and pitch_name is None) or (pitch_type is not None and pitch_name is not None)), 'exactly one of `pitch_type` or `pitch_name` must be specified'
117
+ assert df is not None, '`df` must be provided if `velos` not provided'
118
  pitch_val = pitch_type or pitch_name
119
  pitch_col = 'pitch_type' if pitch_type else 'pitch_name'
120
  # velos = df.set_index(['name', pitch_col]).sort_index().loc[(player, pitch_val), 'release_speed']
121
  velos = df.filter((pl.col('name') == player) & (pl.col(pitch_col) == pitch_val))['release_speed']
122
 
123
  if isinstance(velos, int):
124
+ velos = [velos] # is this line still necessary after porting to polars?
125
 
126
  fig = go.Figure()
127
  if len(velos) >= min_pitches:
 
158
  return fig
159
 
160
 
161
+ def plot_all_pitch_velo(df=None, player=None, player_df=None, pitch_counts=None, min_pitches=2):
162
  # assert not ((player is None and player_df is None) or (player is not None and player_df is not None)), 'exactly one of `player` or `player_df` must be specified'
163
 
164
  if player_df is None and player is not None:
165
  assert pitch_counts is None, '`pitch_counts` must be `None` if `player_df` is None'
166
+ assert df is not None, '`df` must be provided if `player_df` is None'
167
  # player_df = df.set_index('name').sort_index().loc[player].sort_values('pitch_name').set_index('pitch_name')
168
  # pitch_counts = player_df.index.value_counts(ascending=True)
169
  player_df = df.filter((pl.col('name') == player) & (pl.col('release_speed').is_not_null()))
 
253
  return fig
254
 
255
 
256
+ def get_data(player, handedness):
257
  player_name = f'# {player}'
258
 
259
  # _df = df.set_index('name').sort_index().loc[player]
260
  # _df.to_csv(f'files/npb.csv', index=False)
261
  # _df_by_pitch_name = _df.set_index('pitch_name').sort_index()
262
  _df = df.filter(pl.col('name') == player)
263
+ league_df = df
264
+ if handedness == 'Right':
265
+ _df = _df.filter(pl.col('stand') == 'R')
266
+ league_df = league_df.filter(pl.col('stand') == 'R')
267
+ elif handedness == 'Left':
268
+ _df = _df.filter(pl.col('stand') == 'L')
269
+ league_df = league_df.filter(pl.col('stand') == 'L')
270
+
271
+ handedness = gr.update(value=handedness, interactive=True)
272
 
273
  # usage_fig = px.pie(_df['pitch_name'], names='pitch_name')
274
  usage_fig = px.pie(_df.select('pitch_name'), names='pitch_name')
 
278
  pitch_counts = _df['pitch_name'].value_counts().sort('count', descending=True)
279
 
280
  # pitch_velo_summary = plot_all_pitch_velo(player=player, player_df=_df_by_pitch_name, pitch_counts=pitch_counts.sort_values(ascending=True))
281
+ pitch_velo_summary = plot_all_pitch_velo(df=league_df, player=player, player_df=_df.filter(pl.col('release_speed').is_not_null()), pitch_counts=pitch_counts.sort('count', descending=False))
282
+ pitch_loc_summary = plot_pitch_map(df=_df, player=player, all_pitches=True)
283
 
284
  pitch_groups = []
285
  pitch_names = []
 
306
  visible=True
307
  ))
308
  pitch_maps.append(gr.update(
309
+ value=plot_pitch_map(df=_df, player=player, pitch_name=pitch_name),
310
  label='Pitch location',
311
  visible=True
312
  ))
 
333
  .drop('Count')
334
  )
335
 
336
+ return player_name, handedness, 'files/npb.csv', usage_fig, pitch_velo_summary, pitch_loc_summary, *pitch_groups, *pitch_names, *pitch_infos, *pitch_velos, *pitch_maps, velo_stats