James McCool commited on
Commit
e568f6d
·
1 Parent(s): f0e935b

Refactor game prediction settings in app.py to support multiple games. Introduced dynamic tab creation for each game, allowing users to input win/loss settings and kill/death predictions individually. This enhances the user experience by providing a more organized and intuitive interface for managing predictions across multiple games.

Browse files
Files changed (1) hide show
  1. app.py +97 -76
app.py CHANGED
@@ -80,40 +80,56 @@ with st.sidebar:
80
  index=0
81
  )
82
 
83
- col1, col2 = st.columns(2)
84
- with col1:
85
- win_loss = st.selectbox(
86
- "Select Win/Loss",
87
- options=["Win", "Loss"],
88
- index=0
89
- )
90
- with col2:
91
- game_settings = st.selectbox(
92
- "Predict kills/deaths or use average?",
93
- options=["Average", "Predict"],
94
- index=0
95
- )
96
-
97
- if game_settings == "Average":
98
- kill_prediction = 0
99
- death_prediction = 0
100
- else:
101
- col1, col2 = st.columns(2)
102
- with col1:
103
- kill_prediction = st.number_input(
104
- "Predicted Team Kills",
105
- min_value=1,
106
- max_value=100,
107
- value=20
108
- )
109
- with col2:
110
- death_prediction = st.number_input(
111
- "Predicted Team Deaths",
112
- min_value=1,
113
- max_value=100,
114
- value=5
115
  )
116
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
117
  @st.cache_data(ttl = 60)
118
  def simulate_stats(row, num_sims=1000):
119
  """Simulate stats using normal distribution"""
@@ -133,8 +149,9 @@ def simulate_stats(row, num_sims=1000):
133
  return pd.Series(results)
134
 
135
  @st.cache_data(ttl = 60)
136
- def init_team_data(team, opponent, win_loss, kill_prediction, death_prediction, start_date, end_date):
137
-
 
138
  # Convert date objects to datetime strings in the correct format
139
  start_datetime = datetime.combine(start_date, datetime.min.time()).strftime("%Y-%m-%d %H:%M:%S")
140
  end_datetime = datetime.combine(end_date, datetime.max.time()).strftime("%Y-%m-%d %H:%M:%S")
@@ -282,51 +299,55 @@ def init_team_data(team, opponent, win_loss, kill_prediction, death_prediction,
282
  'opp_pos_cs_boost_loss': opp_pos_cs_boost_loss
283
  }).set_index(pd.Index(list(opp_pos_kills_boost_win.keys()), name='position'))
284
 
285
- if kill_prediction > 0:
286
- player_tables = player_tables[['playername', 'teamname', 'position', 'playername_avg_kill_share_win', 'playername_avg_death_share_win','playername_avg_assist_share_win',
287
- 'playername_avg_total_cs_win', 'playername_avg_kill_share_loss', 'playername_avg_death_share_loss', 'playername_avg_assist_share_loss', 'playername_avg_total_cs_loss']]
288
- player_tables = player_tables.rename(columns = {'playername_avg_kill_share_win': 'wKill%', 'playername_avg_death_share_win': 'wDeath%', 'playername_avg_assist_share_win': 'wAssist%',
289
- 'playername_avg_total_cs_win': 'wCS', 'playername_avg_kill_share_loss': 'lKill%', 'playername_avg_death_share_loss': 'lDeath%',
290
- 'playername_avg_assist_share_loss': 'lAssist%', 'playername_avg_total_cs_loss': 'lCS'})
291
- team_data = player_tables.drop_duplicates(subset = ['playername'])
292
-
293
- if win_loss == "Win":
294
- team_data['Kill_Proj'] = team_data.apply(lambda row: row['wKill%'] * opp_pos_kills_boost_win.get(row['position'], 1), axis=1) * kill_prediction
295
- team_data['Death_Proj'] = team_data.apply(lambda row: row['wDeath%'] * opp_pos_deaths_boost_win.get(row['position'], 1), axis=1) * death_prediction
296
- team_data['Assist_Proj'] = team_data.apply(lambda row: row['wAssist%'] * opp_pos_assists_boost_win.get(row['position'], 1), axis=1) * kill_prediction
297
- team_data['CS_Proj'] = team_data.apply(lambda row: row['wCS'] * opp_pos_cs_boost_win.get(row['position'], 1), axis=1)
298
- team_data = team_data[['playername', 'teamname', 'position', 'Kill_Proj', 'Death_Proj', 'Assist_Proj', 'CS_Proj']]
 
 
 
 
 
 
 
299
  else:
300
- team_data['Kill_Proj'] = team_data.apply(lambda row: row['lKill%'] * opp_pos_kills_boost_loss.get(row['position'], 1), axis=1) * kill_prediction
301
- team_data['Death_Proj'] = team_data.apply(lambda row: row['lDeath%'] * opp_pos_deaths_boost_loss.get(row['position'], 1), axis=1) * death_prediction
302
- team_data['Assist_Proj'] = team_data.apply(lambda row: row['lAssist%'] * opp_pos_assists_boost_loss.get(row['position'], 1), axis=1) * kill_prediction
303
- team_data['CS_Proj'] = team_data.apply(lambda row: row['lCS'] * opp_pos_cs_boost_loss.get(row['position'], 1), axis=1)
304
- team_data = team_data[['playername', 'teamname', 'position', 'Kill_Proj', 'Death_Proj', 'Assist_Proj', 'CS_Proj']]
305
- else:
306
- player_tables = player_tables[['playername', 'teamname', 'position', 'playername_avg_kills_win', 'playername_avg_deaths_win', 'playername_avg_assists_win', 'playername_avg_total_cs_win',
307
- 'playername_avg_kills_loss', 'playername_avg_deaths_loss', 'playername_avg_assists_loss', 'playername_avg_total_cs_loss']]
308
- player_tables = player_tables.rename(columns = {'playername_avg_kills_win': 'wKill%', 'playername_avg_deaths_win': 'wDeath%', 'playername_avg_assists_win': 'wAssist%',
309
- 'playername_avg_total_cs_win': 'wCS', 'playername_avg_kills_loss': 'lKill%', 'playername_avg_deaths_loss': 'lDeath%',
310
- 'playername_avg_assists_loss': 'lAssist%', 'playername_avg_total_cs_loss': 'lCS'})
311
- team_data = player_tables.drop_duplicates(subset = ['playername'])
312
-
313
- if win_loss == "Win":
314
- team_data['Kill_Proj'] = team_data.apply(lambda row: row['wKill%'] * opp_pos_kills_boost_win.get(row['position'], 1), axis=1)
315
- team_data['Death_Proj'] = team_data.apply(lambda row: row['wDeath%'] * opp_pos_deaths_boost_win.get(row['position'], 1), axis=1)
316
- team_data['Assist_Proj'] = team_data.apply(lambda row: row['wAssist%'] * opp_pos_assists_boost_win.get(row['position'], 1), axis=1)
317
- team_data['CS_Proj'] = team_data.apply(lambda row: row['wCS'] * opp_pos_cs_boost_win.get(row['position'], 1), axis=1)
318
- team_data = team_data[['playername', 'teamname', 'position', 'Kill_Proj', 'Death_Proj', 'Assist_Proj', 'CS_Proj']]
319
- else:
320
- team_data['Kill_Proj'] = team_data.apply(lambda row: row['lKill%'] * opp_pos_kills_boost_loss.get(row['position'], 1), axis=1)
321
- team_data['Death_Proj'] = team_data.apply(lambda row: row['lDeath%'] * opp_pos_deaths_boost_loss.get(row['position'], 1), axis=1)
322
- team_data['Assist_Proj'] = team_data.apply(lambda row: row['lAssist%'] * opp_pos_assists_boost_loss.get(row['position'], 1), axis=1)
323
- team_data['CS_Proj'] = team_data.apply(lambda row: row['lCS'] * opp_pos_cs_boost_loss.get(row['position'], 1), axis=1)
324
- team_data = team_data[['playername', 'teamname', 'position', 'Kill_Proj', 'Death_Proj', 'Assist_Proj', 'CS_Proj']]
325
-
326
- return team_data.dropna().set_index('playername'), opp_boosts
327
 
328
  if st.button("Run"):
329
- team_data, opp_boost = init_team_data(selected_team, selected_opponent, win_loss, kill_prediction, death_prediction, start_date, end_date)
330
 
331
  # Create simulated percentiles
332
  sim_results = []
 
80
  index=0
81
  )
82
 
83
+ # Convert BO format to number of games
84
+ game_count = int(num_games[2])
85
+
86
+ # Create lists to store settings for each game
87
+ win_loss_settings = []
88
+ game_settings_list = []
89
+ kill_predictions = []
90
+ death_predictions = []
91
+
92
+ # Create a tab for each game
93
+ game_tabs = st.tabs([f"Game {i+1}" for i in range(game_count)])
94
+
95
+ for game_num, game_tab in enumerate(game_tabs, 1):
96
+ with game_tab:
97
+
98
+ win_loss_settings.append(st.selectbox(
99
+ f"Game {game_num} Win/Loss",
100
+ options=["Win", "Loss"],
101
+ index=0,
102
+ key=f"win_loss_{game_num}"
103
+ ))
104
+ game_setting = st.selectbox(
105
+ f"Game {game_num} Prediction Type",
106
+ options=["Average", "Predict"],
107
+ index=0,
108
+ key=f"game_settings_{game_num}"
 
 
 
 
 
 
109
  )
110
 
111
+ if game_setting == "Average":
112
+ kill_predictions.append(0)
113
+ death_predictions.append(0)
114
+ else:
115
+ col1, col2 = st.columns(2)
116
+ with col1:
117
+ kill_predictions.append(st.number_input(
118
+ f"Game {game_num} Predicted Team Kills",
119
+ min_value=1,
120
+ max_value=100,
121
+ value=20,
122
+ key=f"kills_{game_num}"
123
+ ))
124
+ with col2:
125
+ death_predictions.append(st.number_input(
126
+ f"Game {game_num} Predicted Team Deaths",
127
+ min_value=1,
128
+ max_value=100,
129
+ value=5,
130
+ key=f"deaths_{game_num}"
131
+ ))
132
+
133
  @st.cache_data(ttl = 60)
134
  def simulate_stats(row, num_sims=1000):
135
  """Simulate stats using normal distribution"""
 
149
  return pd.Series(results)
150
 
151
  @st.cache_data(ttl = 60)
152
+ def init_team_data(team, opponent, win_loss_settings, kill_predictions, death_predictions, start_date, end_date):
153
+ game_count = len(kill_predictions)
154
+ overall_team_data = pd.DataFrame(columns = ['playername', 'teamname', 'position', 'league', 'Opponent', 'result', 'Kill_Proj', 'Death_Proj', 'Assist_Proj', 'CS_Proj', 'game'])
155
  # Convert date objects to datetime strings in the correct format
156
  start_datetime = datetime.combine(start_date, datetime.min.time()).strftime("%Y-%m-%d %H:%M:%S")
157
  end_datetime = datetime.combine(end_date, datetime.max.time()).strftime("%Y-%m-%d %H:%M:%S")
 
299
  'opp_pos_cs_boost_loss': opp_pos_cs_boost_loss
300
  }).set_index(pd.Index(list(opp_pos_kills_boost_win.keys()), name='position'))
301
 
302
+ for game in range(game_count):
303
+ if kill_predictions[game] > 0:
304
+ player_tables = player_tables[['playername', 'teamname', 'position', 'playername_avg_kill_share_win', 'playername_avg_death_share_win','playername_avg_assist_share_win',
305
+ 'playername_avg_total_cs_win', 'playername_avg_kill_share_loss', 'playername_avg_death_share_loss', 'playername_avg_assist_share_loss', 'playername_avg_total_cs_loss']]
306
+ player_tables = player_tables.rename(columns = {'playername_avg_kill_share_win': 'wKill%', 'playername_avg_death_share_win': 'wDeath%', 'playername_avg_assist_share_win': 'wAssist%',
307
+ 'playername_avg_total_cs_win': 'wCS', 'playername_avg_kill_share_loss': 'lKill%', 'playername_avg_death_share_loss': 'lDeath%',
308
+ 'playername_avg_assist_share_loss': 'lAssist%', 'playername_avg_total_cs_loss': 'lCS'})
309
+ team_data = player_tables.drop_duplicates(subset = ['playername'])
310
+
311
+ if win_loss_settings[game] == "Win":
312
+ team_data['Kill_Proj'] = team_data.apply(lambda row: row['wKill%'] * opp_pos_kills_boost_win.get(row['position'], 1), axis=1) * kill_predictions[game]
313
+ team_data['Death_Proj'] = team_data.apply(lambda row: row['wDeath%'] * opp_pos_deaths_boost_win.get(row['position'], 1), axis=1) * death_predictions[game]
314
+ team_data['Assist_Proj'] = team_data.apply(lambda row: row['wAssist%'] * opp_pos_assists_boost_win.get(row['position'], 1), axis=1) * kill_predictions[game]
315
+ team_data['CS_Proj'] = team_data.apply(lambda row: row['wCS'] * opp_pos_cs_boost_win.get(row['position'], 1), axis=1)
316
+ team_data = team_data[['playername', 'teamname', 'position', 'Kill_Proj', 'Death_Proj', 'Assist_Proj', 'CS_Proj']]
317
+ else:
318
+ team_data['Kill_Proj'] = team_data.apply(lambda row: row['lKill%'] * opp_pos_kills_boost_loss.get(row['position'], 1), axis=1) * kill_predictions[game]
319
+ team_data['Death_Proj'] = team_data.apply(lambda row: row['lDeath%'] * opp_pos_deaths_boost_loss.get(row['position'], 1), axis=1) * death_predictions[game]
320
+ team_data['Assist_Proj'] = team_data.apply(lambda row: row['lAssist%'] * opp_pos_assists_boost_loss.get(row['position'], 1), axis=1) * kill_predictions[game]
321
+ team_data['CS_Proj'] = team_data.apply(lambda row: row['lCS'] * opp_pos_cs_boost_loss.get(row['position'], 1), axis=1)
322
+ team_data = team_data[['playername', 'teamname', 'position', 'Kill_Proj', 'Death_Proj', 'Assist_Proj', 'CS_Proj']]
323
  else:
324
+ player_tables = player_tables[['playername', 'teamname', 'position', 'playername_avg_kills_win', 'playername_avg_deaths_win', 'playername_avg_assists_win', 'playername_avg_total_cs_win',
325
+ 'playername_avg_kills_loss', 'playername_avg_deaths_loss', 'playername_avg_assists_loss', 'playername_avg_total_cs_loss']]
326
+ player_tables = player_tables.rename(columns = {'playername_avg_kills_win': 'wKill%', 'playername_avg_deaths_win': 'wDeath%', 'playername_avg_assists_win': 'wAssist%',
327
+ 'playername_avg_total_cs_win': 'wCS', 'playername_avg_kills_loss': 'lKill%', 'playername_avg_deaths_loss': 'lDeath%',
328
+ 'playername_avg_assists_loss': 'lAssist%', 'playername_avg_total_cs_loss': 'lCS'})
329
+ team_data = player_tables.drop_duplicates(subset = ['playername'])
330
+
331
+ if win_loss_settings[game] == "Win":
332
+ team_data['Kill_Proj'] = team_data.apply(lambda row: row['wKill%'] * opp_pos_kills_boost_win.get(row['position'], 1), axis=1)
333
+ team_data['Death_Proj'] = team_data.apply(lambda row: row['wDeath%'] * opp_pos_deaths_boost_win.get(row['position'], 1), axis=1)
334
+ team_data['Assist_Proj'] = team_data.apply(lambda row: row['wAssist%'] * opp_pos_assists_boost_win.get(row['position'], 1), axis=1)
335
+ team_data['CS_Proj'] = team_data.apply(lambda row: row['wCS'] * opp_pos_cs_boost_win.get(row['position'], 1), axis=1)
336
+ team_data = team_data[['playername', 'teamname', 'position', 'Kill_Proj', 'Death_Proj', 'Assist_Proj', 'CS_Proj']]
337
+ else:
338
+ team_data['Kill_Proj'] = team_data.apply(lambda row: row['lKill%'] * opp_pos_kills_boost_loss.get(row['position'], 1), axis=1)
339
+ team_data['Death_Proj'] = team_data.apply(lambda row: row['lDeath%'] * opp_pos_deaths_boost_loss.get(row['position'], 1), axis=1)
340
+ team_data['Assist_Proj'] = team_data.apply(lambda row: row['lAssist%'] * opp_pos_assists_boost_loss.get(row['position'], 1), axis=1)
341
+ team_data['CS_Proj'] = team_data.apply(lambda row: row['lCS'] * opp_pos_cs_boost_loss.get(row['position'], 1), axis=1)
342
+ team_data = team_data[['playername', 'teamname', 'position', 'Kill_Proj', 'Death_Proj', 'Assist_Proj', 'CS_Proj']]
343
+ team_data['game'] = f'game {game + 1}'
344
+
345
+ overall_team_data = pd.concat([overall_team_data, team_data])
346
+
347
+ return overall_team_data.dropna().set_index('playername'), opp_boosts
 
 
 
348
 
349
  if st.button("Run"):
350
+ team_data, opp_boost = init_team_data(selected_team, selected_opponent, win_loss_settings, kill_predictions, death_predictions, start_date, end_date)
351
 
352
  # Create simulated percentiles
353
  sim_results = []