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 = []
|