Spaces:
Running
Running
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
app.py
CHANGED
@@ -80,40 +80,56 @@ with st.sidebar:
|
|
80 |
index=0
|
81 |
)
|
82 |
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
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,
|
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 |
-
|
286 |
-
|
287 |
-
|
288 |
-
|
289 |
-
|
290 |
-
|
291 |
-
|
292 |
-
|
293 |
-
|
294 |
-
|
295 |
-
|
296 |
-
|
297 |
-
|
298 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
299 |
else:
|
300 |
-
|
301 |
-
|
302 |
-
|
303 |
-
|
304 |
-
|
305 |
-
|
306 |
-
|
307 |
-
|
308 |
-
|
309 |
-
|
310 |
-
|
311 |
-
|
312 |
-
|
313 |
-
|
314 |
-
|
315 |
-
|
316 |
-
|
317 |
-
|
318 |
-
|
319 |
-
|
320 |
-
|
321 |
-
|
322 |
-
|
323 |
-
|
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,
|
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 = []
|