Update app.py
Browse files
app.py
CHANGED
@@ -49,6 +49,8 @@ gcservice_account = init_conn()
|
|
49 |
NBAGetGameData = 'https://docs.google.com/spreadsheets/d/1tRQrF_I5rS7Q0g9vE8NrENDZ2P3_DvtbBZzKEakwOI0/edit#gid=1373653837'
|
50 |
NBABettingModel = 'https://docs.google.com/spreadsheets/d/1WBnvOHQi_zVTGF63efejK5ho02AY00HiYrMHnMJXY1E/edit#gid=1157978351'
|
51 |
|
|
|
|
|
52 |
percentages_format = {'Playoff Odds': '{:.2%}', 'Division Odds': '{:.2%}', 'Top 4 Seed Odds': '{:.2%}', '1 Seed Odds': '{:.2%}', 'Win 1st Round': '{:.2%}',
|
53 |
'Win 2nd Round': '{:.2%}', 'Win Conference': '{:.2%}', 'Win Title': '{:.2%}', '1': '{:.2%}', '2': '{:.2%}', '3': '{:.2%}',
|
54 |
'4': '{:.2%}', '5': '{:.2%}', '6': '{:.2%}', '7': '{:.2%}', '8': '{:.2%}', '9': '{:.2%}', '10': '{:.2%}', '11': '{:.2%}',
|
@@ -67,6 +69,7 @@ def init_baselines():
|
|
67 |
cols_to_check = ['Win %', 'Injury and Rotation Adjusted Win %']
|
68 |
raw_display.loc[:, cols_to_check] = raw_display.loc[:, cols_to_check].replace({'%': ''}, regex=True).astype(float) / 100
|
69 |
raw_display = raw_display.apply(pd.to_numeric, errors='coerce').fillna(raw_display)
|
|
|
70 |
game_model = raw_display[raw_display['Injury and Rotation Adjusted Win %'] != ""]
|
71 |
game_model['Team Date'] = game_model['Team'] + " " + game_model['Date']
|
72 |
|
@@ -81,57 +84,79 @@ def init_baselines():
|
|
81 |
raw_display.loc[:, cols_to_check] = raw_display.loc[:, cols_to_check].replace({'%': ''}, regex=True).astype(float) / 100
|
82 |
raw_display = raw_display.apply(pd.to_numeric, errors='coerce').fillna(raw_display)
|
83 |
season_model = raw_display[raw_display['Team'] != ""]
|
|
|
|
|
|
|
84 |
|
85 |
-
return game_model, season_model
|
86 |
|
87 |
def convert_df_to_csv(df):
|
88 |
return df.to_csv().encode('utf-8')
|
89 |
|
90 |
-
game_model, season_model = init_baselines()
|
91 |
|
92 |
tab1, tab2 = st.tabs(["Game Betting Model", "Season and Futures"])
|
93 |
|
94 |
with tab1:
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
|
|
|
|
|
|
118 |
|
119 |
with tab2:
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
49 |
NBAGetGameData = 'https://docs.google.com/spreadsheets/d/1tRQrF_I5rS7Q0g9vE8NrENDZ2P3_DvtbBZzKEakwOI0/edit#gid=1373653837'
|
50 |
NBABettingModel = 'https://docs.google.com/spreadsheets/d/1WBnvOHQi_zVTGF63efejK5ho02AY00HiYrMHnMJXY1E/edit#gid=1157978351'
|
51 |
|
52 |
+
game_format = {'Win %', 'Injury and Rotation Adjusted Win %'}
|
53 |
+
|
54 |
percentages_format = {'Playoff Odds': '{:.2%}', 'Division Odds': '{:.2%}', 'Top 4 Seed Odds': '{:.2%}', '1 Seed Odds': '{:.2%}', 'Win 1st Round': '{:.2%}',
|
55 |
'Win 2nd Round': '{:.2%}', 'Win Conference': '{:.2%}', 'Win Title': '{:.2%}', '1': '{:.2%}', '2': '{:.2%}', '3': '{:.2%}',
|
56 |
'4': '{:.2%}', '5': '{:.2%}', '6': '{:.2%}', '7': '{:.2%}', '8': '{:.2%}', '9': '{:.2%}', '10': '{:.2%}', '11': '{:.2%}',
|
|
|
69 |
cols_to_check = ['Win %', 'Injury and Rotation Adjusted Win %']
|
70 |
raw_display.loc[:, cols_to_check] = raw_display.loc[:, cols_to_check].replace({'%': ''}, regex=True).astype(float) / 100
|
71 |
raw_display = raw_display.apply(pd.to_numeric, errors='coerce').fillna(raw_display)
|
72 |
+
raw_display = raw_display.drop(columns=['Day of season', 'Team', 'Opp', 'Date Num', 'DR Team', 'In Minutes File'])
|
73 |
game_model = raw_display[raw_display['Injury and Rotation Adjusted Win %'] != ""]
|
74 |
game_model['Team Date'] = game_model['Team'] + " " + game_model['Date']
|
75 |
|
|
|
84 |
raw_display.loc[:, cols_to_check] = raw_display.loc[:, cols_to_check].replace({'%': ''}, regex=True).astype(float) / 100
|
85 |
raw_display = raw_display.apply(pd.to_numeric, errors='coerce').fillna(raw_display)
|
86 |
season_model = raw_display[raw_display['Team'] != ""]
|
87 |
+
title_sims = season_model[['Team', 'Conference', 'Division', 'Power Rank', 'Team PointMarginPerGame', 'SeasonSimLookup', 'Win Projection Now',
|
88 |
+
'Playoff Odds', 'Division Odds', 'Top 4 Seed Odds', '1 Seed Odds', 'Win 1st Round', 'Win 2nd Round', 'Win Conference', 'Win Title']]
|
89 |
+
seed_probs = season_model[['Team', 'Conference', 'Division', 'Avg Seed', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15']]
|
90 |
|
91 |
+
return game_model, season_model, seed_probs, title_sims
|
92 |
|
93 |
def convert_df_to_csv(df):
|
94 |
return df.to_csv().encode('utf-8')
|
95 |
|
96 |
+
game_model, season_model, seed_probs, title_sims = init_baselines()
|
97 |
|
98 |
tab1, tab2 = st.tabs(["Game Betting Model", "Season and Futures"])
|
99 |
|
100 |
with tab1:
|
101 |
+
col1, col2 = st.columns([1, 9])
|
102 |
+
with col1:
|
103 |
+
if st.button("Reset Data", key='reset1'):
|
104 |
+
st.cache_data.clear()
|
105 |
+
game_model, season_model, seed_probs, title_sims = init_baselines()
|
106 |
+
split_var1 = st.radio("Would you like to view all teams or specific ones?", ('All', 'Specific Teams'), key='split_var1')
|
107 |
+
if split_var1 == 'Specific Teams':
|
108 |
+
team_var1 = st.multiselect('Which teams would you like to include in the tables?', options = game_model['Team'].unique(), key='team_var1')
|
109 |
+
elif split_var1 == 'All':
|
110 |
+
team_var1 = game_model.Team.values.tolist()
|
111 |
+
date_split_var1 = st.radio("Would you like to view all Dates or specific ones?", ('All', 'Specific Dates'), key='date_split_var1')
|
112 |
+
if date_split_var1 == 'Specific Teams':
|
113 |
+
date_var1 = st.multiselect('Which Dates would you like to include in the tables?', options = game_model['Date'].unique(), key='date_var1')
|
114 |
+
elif date_split_var1 == 'All':
|
115 |
+
date_var1 = game_model.Date.values.tolist()
|
116 |
+
with col2:
|
117 |
+
game_display = game_model[game_model['Team'].isin(team_var1)]
|
118 |
+
game_display = game_display[game_display['Date'].isin(date_var1)]
|
119 |
+
game_display = game_display.set_index('Team Date')
|
120 |
+
st.dataframe(game_display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), use_container_width = True)
|
121 |
+
st.download_button(
|
122 |
+
label="Export Game Model",
|
123 |
+
data=convert_df_to_csv(game_model),
|
124 |
+
file_name='AmericanNumbers_Game_Model_export.csv',
|
125 |
+
mime='text/csv',
|
126 |
+
)
|
127 |
|
128 |
with tab2:
|
129 |
+
col1, col2 = st.columns([1, 9])
|
130 |
+
with col1:
|
131 |
+
if st.button("Reset Data", key='reset2'):
|
132 |
+
st.cache_data.clear()
|
133 |
+
game_model, season_model, seed_probs, title_sims = init_baselines()
|
134 |
+
view_var2 = st.radio("Would you like to view title odds and win projections or seeding probabilities?", ('Win Odds', 'Seed Probabilities'), key='view_var2')
|
135 |
+
split_var2 = st.radio("Would you like to view all teams or specific ones?", ('All', 'Specific Teams'), key='split_var2')
|
136 |
+
if split_var2 == 'Specific Teams':
|
137 |
+
team_var2 = st.multiselect('Which teams would you like to include in the tables?', options = season_model['Team'].unique(), key='team_var2')
|
138 |
+
elif split_var2 == 'All':
|
139 |
+
team_var2 = season_model.Team.values.tolist()
|
140 |
+
with col2:
|
141 |
+
if view_var2 == 'Win Odds':
|
142 |
+
title_sims = title_sims[title_sims['Team'].isin(team_var2)]
|
143 |
+
season_display = title_sims.set_index('Team')
|
144 |
+
season_display = season_display.sort_values(by=['Win Projection Now'], ascending=False)
|
145 |
+
st.dataframe(season_display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(percentages_format, precision=2), use_container_width = True)
|
146 |
+
st.download_button(
|
147 |
+
label="Export Futures Model",
|
148 |
+
data=convert_df_to_csv(title_sims),
|
149 |
+
file_name='AmericanNumbers_Season_Futures.csv',
|
150 |
+
mime='text/csv',
|
151 |
+
)
|
152 |
+
elif view_var2 == 'Seed Probabilities':
|
153 |
+
seed_probs = seed_probs[seed_probs['Team'].isin(team_var2)]
|
154 |
+
season_display = seed_probs.set_index('Team')
|
155 |
+
season_display = season_display.sort_values(by=['Win Projection Now'], ascending=False)
|
156 |
+
st.dataframe(season_display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(percentages_format, precision=2), use_container_width = True)
|
157 |
+
st.download_button(
|
158 |
+
label="Export Futures Model",
|
159 |
+
data=convert_df_to_csv(seed_probs),
|
160 |
+
file_name='AmericanNumbers_Season_Futures.csv',
|
161 |
+
mime='text/csv',
|
162 |
+
)
|