Spaces:
Running
Running
James McCool
commited on
Commit
·
0a2d441
1
Parent(s):
3c21b7e
Lots of changes to stat specifc loop, added pick6 functionality
Browse files
app.py
CHANGED
@@ -52,10 +52,11 @@ def init_conn():
|
|
52 |
|
53 |
gcservice_account, gcservice_account2, NHL_Data = init_conn()
|
54 |
|
55 |
-
|
56 |
prop_format = {'L5 Success': '{:.2%}', 'L10_Success': '{:.2%}', 'L20_success': '{:.2%}', 'Matchup Boost': '{:.2%}', 'Trending Over': '{:.2%}', 'Trending Under': '{:.2%}',
|
57 |
'Implied Over': '{:.2%}', 'Implied Under': '{:.2%}', 'Over Edge': '{:.2%}', 'Under Edge': '{:.2%}'}
|
58 |
all_sim_vars = ['NHL_GAME_PLAYER_SHOTS_ON_GOAL', 'NHL_GAME_PLAYER_POINTS', 'NHL_GAME_PLAYER_BLOCKED_SHOTS', 'NHL_GAME_PLAYER_ASSISTS']
|
|
|
59 |
sim_all_hold = pd.DataFrame(columns=['Player', 'Prop type', 'Prop', 'Mean_Outcome', 'Imp Over', 'Over%', 'Imp Under', 'Under%', 'Bet?', 'Edge'])
|
60 |
|
61 |
@st.cache_resource(ttl=300)
|
@@ -63,7 +64,7 @@ def pull_baselines():
|
|
63 |
sh = gcservice_account.open_by_url(NHL_Data)
|
64 |
worksheet = sh.worksheet('Prop_Betting_Table')
|
65 |
raw_display = pd.DataFrame(worksheet.get_all_records())
|
66 |
-
prop_display = raw_display
|
67 |
prop_display['Player Blocks'].replace("", np.nan, inplace=True)
|
68 |
prop_display['SOG Edge'].replace("", np.nan, inplace=True)
|
69 |
prop_display['Assist Edge'].replace("", np.nan, inplace=True)
|
@@ -159,12 +160,16 @@ with tab3:
|
|
159 |
export_container = st.empty()
|
160 |
|
161 |
with col1:
|
162 |
-
game_select_var = st.selectbox('Select prop source', options = ['
|
163 |
-
|
164 |
-
|
|
|
|
|
|
|
|
|
|
|
165 |
elif game_select_var == 'Pick6':
|
166 |
-
prop_df = pick_frame[['
|
167 |
-
prop_df.rename(columns={"Full_name": "Player"}, inplace = True)
|
168 |
st.download_button(
|
169 |
label="Download Prop Source",
|
170 |
data=convert_df_to_csv(prop_df),
|
@@ -172,61 +177,72 @@ with tab3:
|
|
172 |
mime='text/csv',
|
173 |
key='prop_source',
|
174 |
)
|
175 |
-
|
176 |
-
|
177 |
-
|
|
|
178 |
|
179 |
if st.button('Simulate Prop Category'):
|
180 |
with col2:
|
181 |
with df_hold_container.container():
|
182 |
if prop_type_var == 'All Props':
|
183 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
184 |
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
prop_df_raw = pick_frame[['Full_name', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
189 |
-
prop_df_raw.rename(columns={"Full_name": "Player"}, inplace = True)
|
190 |
-
|
191 |
-
for books in ['FANDUEL', 'DRAFTKINGS', 'BET365', 'CONSENSUS']:
|
192 |
-
prop_df = prop_df_raw.loc[prop_df_raw['book'] == books]
|
193 |
-
prop_df = prop_df.loc[prop_df['prop_type'] == prop]
|
194 |
-
prop_df = prop_df[['Player', 'book', 'over_prop', 'over_line', 'under_line']]
|
195 |
prop_df.rename(columns={"over_prop": "Prop"}, inplace = True)
|
196 |
-
prop_df = prop_df.loc[prop_df['Prop'] != 0]
|
197 |
-
st.table(prop_df)
|
198 |
prop_df['Over'] = 1 / prop_df['over_line']
|
199 |
prop_df['Under'] = 1 / prop_df['under_line']
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
book_dict = dict(zip(
|
204 |
-
over_dict = dict(zip(
|
205 |
-
under_dict = dict(zip(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
206 |
|
207 |
total_sims = 1000
|
208 |
|
209 |
df.replace("", 0, inplace=True)
|
210 |
|
211 |
-
if prop == 'NHL_GAME_PLAYER_POINTS':
|
212 |
df['Median'] = df['Player TP']
|
213 |
-
elif prop == 'NHL_GAME_PLAYER_SHOTS_ON_GOAL':
|
214 |
df['Median'] = df['Player SOG']
|
215 |
-
elif prop == 'NHL_GAME_PLAYER_ASSISTS':
|
216 |
df['Median'] = df['Player Assists']
|
217 |
-
elif prop == 'NHL_GAME_PLAYER_BLOCKED_SHOTS':
|
218 |
df['Median'] = df['Player Blocks']
|
219 |
|
220 |
-
flex_file = df
|
221 |
flex_file['Floor'] = (flex_file['Median'] * .15)
|
222 |
flex_file['Ceiling'] = flex_file['Median'] + (flex_file['Median'] * 1)
|
223 |
flex_file['STD'] = (flex_file['Median']/3)
|
224 |
flex_file['Prop'] = flex_file['Player'].map(prop_dict)
|
225 |
flex_file = flex_file[['Player', 'book', 'Prop', 'Floor', 'Median', 'Ceiling', 'STD']]
|
226 |
|
227 |
-
hold_file = flex_file
|
228 |
-
overall_file = flex_file
|
229 |
-
prop_file = flex_file
|
230 |
|
231 |
overall_players = overall_file[['Player']]
|
232 |
|
@@ -259,7 +275,7 @@ with tab3:
|
|
259 |
players_only['Book'] = players_only['Player'].map(book_dict)
|
260 |
players_only['Prop_avg'] = players_only['Prop'].mean() / 100
|
261 |
players_only['prop_threshold'] = .10
|
262 |
-
players_only = players_only
|
263 |
players_only['Over_diff'] = players_only['Over%'] - players_only['Imp Over']
|
264 |
players_only['Under_diff'] = players_only['Under%'] - players_only['Imp Under']
|
265 |
players_only['Bet_check'] = np.where(players_only['Over_diff'] > players_only['Under_diff'], players_only['Over_diff'] , players_only['Under_diff'])
|
@@ -275,87 +291,79 @@ with tab3:
|
|
275 |
sim_all_hold = pd.concat([sim_all_hold, leg_outcomes], ignore_index=True)
|
276 |
|
277 |
final_outcomes = sim_all_hold
|
|
|
278 |
|
279 |
elif prop_type_var != 'All Props':
|
280 |
|
281 |
-
|
|
|
|
|
282 |
prop_df_raw = prop_trends[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
283 |
elif game_select_var == 'Pick6':
|
284 |
-
prop_df_raw = pick_frame[['
|
285 |
-
prop_df_raw.rename(columns={"Full_name": "Player"}, inplace = True)
|
286 |
|
287 |
-
for books in
|
288 |
-
prop_df = prop_df_raw
|
289 |
-
|
290 |
-
|
291 |
-
prop_df = prop_df[['
|
292 |
-
|
293 |
-
prop_df = prop_df
|
294 |
-
|
295 |
-
prop_df['
|
296 |
-
|
297 |
-
|
298 |
-
|
299 |
-
|
300 |
-
|
301 |
-
prop_df = prop_df[['
|
302 |
-
|
303 |
-
prop_df = prop_df
|
304 |
-
|
305 |
-
prop_df['
|
306 |
-
|
307 |
-
|
308 |
-
|
309 |
-
|
310 |
-
|
311 |
-
|
312 |
-
|
313 |
-
|
314 |
-
|
315 |
-
|
316 |
-
|
317 |
-
|
318 |
-
|
319 |
-
|
320 |
-
|
321 |
-
|
322 |
-
|
323 |
-
|
324 |
-
|
325 |
-
prop_df['Over'] = 1 / prop_df['over_line']
|
326 |
-
prop_df['Under'] = 1 / prop_df['under_line']
|
327 |
-
prop = 'blocked_shots'
|
328 |
-
df = pd.merge(prop_display, prop_df, how='left', left_on=['Player'], right_on = ['Player'])
|
329 |
-
|
330 |
-
st.table(df)
|
331 |
-
prop_dict = dict(zip(df.Player, df.Prop))
|
332 |
-
book_dict = dict(zip(df.Player, df.book))
|
333 |
-
over_dict = dict(zip(df.Player, df.Over))
|
334 |
-
under_dict = dict(zip(df.Player, df.Under))
|
335 |
|
336 |
total_sims = 1000
|
337 |
|
338 |
df.replace("", 0, inplace=True)
|
339 |
|
340 |
-
if
|
341 |
df['Median'] = df['Player TP']
|
342 |
-
elif
|
343 |
df['Median'] = df['Player SOG']
|
344 |
-
elif
|
345 |
df['Median'] = df['Player Assists']
|
346 |
-
elif
|
347 |
df['Median'] = df['Player Blocks']
|
348 |
|
349 |
-
flex_file = df
|
350 |
flex_file['Floor'] = (flex_file['Median'] * .15)
|
351 |
flex_file['Ceiling'] = flex_file['Median'] + (flex_file['Median'] * 1)
|
352 |
flex_file['STD'] = (flex_file['Median']/3)
|
353 |
flex_file['Prop'] = flex_file['Player'].map(prop_dict)
|
354 |
flex_file = flex_file[['Player', 'book', 'Prop', 'Floor', 'Median', 'Ceiling', 'STD']]
|
355 |
|
356 |
-
hold_file = flex_file
|
357 |
-
overall_file = flex_file
|
358 |
-
prop_file = flex_file
|
359 |
|
360 |
overall_players = overall_file[['Player']]
|
361 |
|
@@ -388,7 +396,7 @@ with tab3:
|
|
388 |
players_only['Book'] = players_only['Player'].map(book_dict)
|
389 |
players_only['Prop_avg'] = players_only['Prop'].mean() / 100
|
390 |
players_only['prop_threshold'] = .10
|
391 |
-
players_only = players_only
|
392 |
players_only['Over_diff'] = players_only['Over%'] - players_only['Imp Over']
|
393 |
players_only['Under_diff'] = players_only['Under%'] - players_only['Imp Under']
|
394 |
players_only['Bet_check'] = np.where(players_only['Over_diff'] > players_only['Under_diff'], players_only['Over_diff'] , players_only['Under_diff'])
|
@@ -403,8 +411,11 @@ with tab3:
|
|
403 |
sim_all_hold = pd.concat([sim_all_hold, leg_outcomes], ignore_index=True)
|
404 |
|
405 |
final_outcomes = sim_all_hold
|
|
|
406 |
|
407 |
final_outcomes = final_outcomes[final_outcomes['Prop'] > 0]
|
|
|
|
|
408 |
final_outcomes = final_outcomes.sort_values(by='Edge', ascending=False)
|
409 |
|
410 |
with df_hold_container:
|
|
|
52 |
|
53 |
gcservice_account, gcservice_account2, NHL_Data = init_conn()
|
54 |
|
55 |
+
all_sim_vars = ['NHL_GAME_PLAYER_SHOTS_ON_GOAL', 'NHL_GAME_PLAYER_POINTS', 'NHL_GAME_PLAYER_BLOCKED_SHOTS', 'NHL_GAME_PLAYER_ASSISTS']
|
56 |
prop_format = {'L5 Success': '{:.2%}', 'L10_Success': '{:.2%}', 'L20_success': '{:.2%}', 'Matchup Boost': '{:.2%}', 'Trending Over': '{:.2%}', 'Trending Under': '{:.2%}',
|
57 |
'Implied Over': '{:.2%}', 'Implied Under': '{:.2%}', 'Over Edge': '{:.2%}', 'Under Edge': '{:.2%}'}
|
58 |
all_sim_vars = ['NHL_GAME_PLAYER_SHOTS_ON_GOAL', 'NHL_GAME_PLAYER_POINTS', 'NHL_GAME_PLAYER_BLOCKED_SHOTS', 'NHL_GAME_PLAYER_ASSISTS']
|
59 |
+
pick6_sim_vars = ['Points', 'Shots on Goal', 'Assists', 'Blocks']
|
60 |
sim_all_hold = pd.DataFrame(columns=['Player', 'Prop type', 'Prop', 'Mean_Outcome', 'Imp Over', 'Over%', 'Imp Under', 'Under%', 'Bet?', 'Edge'])
|
61 |
|
62 |
@st.cache_resource(ttl=300)
|
|
|
64 |
sh = gcservice_account.open_by_url(NHL_Data)
|
65 |
worksheet = sh.worksheet('Prop_Betting_Table')
|
66 |
raw_display = pd.DataFrame(worksheet.get_all_records())
|
67 |
+
prop_display = raw_display[raw_display['Player'] != ""]
|
68 |
prop_display['Player Blocks'].replace("", np.nan, inplace=True)
|
69 |
prop_display['SOG Edge'].replace("", np.nan, inplace=True)
|
70 |
prop_display['Assist Edge'].replace("", np.nan, inplace=True)
|
|
|
160 |
export_container = st.empty()
|
161 |
|
162 |
with col1:
|
163 |
+
game_select_var = st.selectbox('Select prop source', options = ['Aggregate', 'Pick6'])
|
164 |
+
book_select_var = st.selectbox('Select book', options = ['ALL', 'BET_365', 'DRAFTKINGS', 'FANDUEL', 'MGM', 'UNIBET', 'WILLIAM_HILL'])
|
165 |
+
if book_select_var == 'ALL':
|
166 |
+
book_selections = ['BET_365', 'DRAFTKINGS', 'FANDUEL', 'MGM', 'UNIBET', 'WILLIAM_HILL']
|
167 |
+
else:
|
168 |
+
book_selections = [book_select_var]
|
169 |
+
if game_select_var == 'Aggregate':
|
170 |
+
prop_df = prop_trends[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
171 |
elif game_select_var == 'Pick6':
|
172 |
+
prop_df = pick_frame[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
|
|
173 |
st.download_button(
|
174 |
label="Download Prop Source",
|
175 |
data=convert_df_to_csv(prop_df),
|
|
|
177 |
mime='text/csv',
|
178 |
key='prop_source',
|
179 |
)
|
180 |
+
if game_select_var == 'Aggregate':
|
181 |
+
prop_type_var = st.selectbox('Select prop category', options = ['All Props', 'NBA_GAME_PLAYER_POINTS', 'NBA_GAME_PLAYER_REBOUNDS', 'NBA_GAME_PLAYER_ASSISTS', 'NBA_GAME_PLAYER_POINTS_REBOUNDS_ASSISTS', 'NBA_GAME_PLAYER_POINTS_REBOUNDS', 'NBA_GAME_PLAYER_POINTS_ASSISTS', 'NBA_GAME_PLAYER_REBOUNDS_ASSISTS'])
|
182 |
+
elif game_select_var == 'Pick6':
|
183 |
+
prop_type_var = st.selectbox('Select prop category', options = ['All Props', 'Points', 'Rebounds', 'Assists', 'Points + Assists + Rebounds', 'Points + Assists', 'Points + Rebounds', 'Assists + Rebounds'])
|
184 |
|
185 |
if st.button('Simulate Prop Category'):
|
186 |
with col2:
|
187 |
with df_hold_container.container():
|
188 |
if prop_type_var == 'All Props':
|
189 |
+
|
190 |
+
if game_select_var == 'Aggregate':
|
191 |
+
prop_df_raw = prop_frame[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
192 |
+
sim_vars = ['NBA_GAME_PLAYER_POINTS', 'NBA_GAME_PLAYER_REBOUNDS', 'NBA_GAME_PLAYER_ASSISTS', 'NBA_GAME_PLAYER_POINTS_REBOUNDS_ASSISTS', 'NBA_GAME_PLAYER_POINTS_REBOUNDS', 'NBA_GAME_PLAYER_POINTS_ASSISTS', 'NBA_GAME_PLAYER_REBOUNDS_ASSISTS']
|
193 |
+
elif game_select_var == 'Pick6':
|
194 |
+
prop_df_raw = pick_frame[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
195 |
+
sim_vars = ['Points', 'Rebounds', 'Assists', 'Points + Assists + Rebounds', 'Points + Assists', 'Points + Rebounds', 'Assists + Rebounds']
|
196 |
+
|
197 |
+
player_df = prop_display.copy()
|
198 |
+
|
199 |
+
for prop in sim_vars:
|
200 |
+
prop_df = prop_df_raw[prop_df_raw['prop_type'] == prop]
|
201 |
|
202 |
+
for books in book_selections:
|
203 |
+
prop_df = prop_df[prop_df['book'] == books]
|
204 |
+
prop_df = prop_df[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
205 |
prop_df.rename(columns={"over_prop": "Prop"}, inplace = True)
|
|
|
|
|
206 |
prop_df['Over'] = 1 / prop_df['over_line']
|
207 |
prop_df['Under'] = 1 / prop_df['under_line']
|
208 |
+
|
209 |
+
prop_dict = dict(zip(prop_df.Player, prop_df.Prop))
|
210 |
+
prop_type_dict = dict(zip(prop_df.Player, prop_df.prop_type))
|
211 |
+
book_dict = dict(zip(prop_df.Player, prop_df.book))
|
212 |
+
over_dict = dict(zip(prop_df.Player, prop_df.Over))
|
213 |
+
under_dict = dict(zip(prop_df.Player, prop_df.Under))
|
214 |
+
|
215 |
+
player_df['book'] = player_df['Player'].map(book_dict)
|
216 |
+
player_df['Prop'] = player_df['Player'].map(prop_dict)
|
217 |
+
player_df['prop_type'] = player_df['Player'].map(prop_type_dict)
|
218 |
+
|
219 |
+
df = player_df.reset_index(drop=True)
|
220 |
+
|
221 |
+
team_dict = dict(zip(df.Player, df.Team))
|
222 |
|
223 |
total_sims = 1000
|
224 |
|
225 |
df.replace("", 0, inplace=True)
|
226 |
|
227 |
+
if prop == 'NHL_GAME_PLAYER_POINTS' or prop == 'Points':
|
228 |
df['Median'] = df['Player TP']
|
229 |
+
elif prop == 'NHL_GAME_PLAYER_SHOTS_ON_GOAL' or prop == 'Shots on Goal':
|
230 |
df['Median'] = df['Player SOG']
|
231 |
+
elif prop == 'NHL_GAME_PLAYER_ASSISTS' or prop == 'Assists':
|
232 |
df['Median'] = df['Player Assists']
|
233 |
+
elif prop == 'NHL_GAME_PLAYER_BLOCKED_SHOTS' or prop == 'Blocks':
|
234 |
df['Median'] = df['Player Blocks']
|
235 |
|
236 |
+
flex_file = df.copy()
|
237 |
flex_file['Floor'] = (flex_file['Median'] * .15)
|
238 |
flex_file['Ceiling'] = flex_file['Median'] + (flex_file['Median'] * 1)
|
239 |
flex_file['STD'] = (flex_file['Median']/3)
|
240 |
flex_file['Prop'] = flex_file['Player'].map(prop_dict)
|
241 |
flex_file = flex_file[['Player', 'book', 'Prop', 'Floor', 'Median', 'Ceiling', 'STD']]
|
242 |
|
243 |
+
hold_file = flex_file.copy()
|
244 |
+
overall_file = flex_file.copy()
|
245 |
+
prop_file = flex_file.copy()
|
246 |
|
247 |
overall_players = overall_file[['Player']]
|
248 |
|
|
|
275 |
players_only['Book'] = players_only['Player'].map(book_dict)
|
276 |
players_only['Prop_avg'] = players_only['Prop'].mean() / 100
|
277 |
players_only['prop_threshold'] = .10
|
278 |
+
players_only = players_only[players_only['Mean_Outcome'] > 0]
|
279 |
players_only['Over_diff'] = players_only['Over%'] - players_only['Imp Over']
|
280 |
players_only['Under_diff'] = players_only['Under%'] - players_only['Imp Under']
|
281 |
players_only['Bet_check'] = np.where(players_only['Over_diff'] > players_only['Under_diff'], players_only['Over_diff'] , players_only['Under_diff'])
|
|
|
291 |
sim_all_hold = pd.concat([sim_all_hold, leg_outcomes], ignore_index=True)
|
292 |
|
293 |
final_outcomes = sim_all_hold
|
294 |
+
st.write(f'finished {prop}')
|
295 |
|
296 |
elif prop_type_var != 'All Props':
|
297 |
|
298 |
+
player_df = prop_display.copy()
|
299 |
+
|
300 |
+
if game_select_var == 'Aggregate':
|
301 |
prop_df_raw = prop_trends[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
302 |
elif game_select_var == 'Pick6':
|
303 |
+
prop_df_raw = pick_frame[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
|
|
304 |
|
305 |
+
for books in book_selections:
|
306 |
+
prop_df = prop_df_raw[prop_df_raw['book'] == books]
|
307 |
+
|
308 |
+
if prop_type_var == "NHL_GAME_PLAYER_SHOTS_ON_GOAL":
|
309 |
+
prop_df = prop_df[prop_df['prop_type'] == 'NHL_GAME_PLAYER_SHOTS_ON_GOAL']
|
310 |
+
elif prop_type_var == 'Shots on Goal':
|
311 |
+
prop_df = prop_df[prop_df['prop_type'] == 'Player SOG']
|
312 |
+
elif prop_type_var == "NHL_GAME_PLAYER_POINTS":
|
313 |
+
prop_df = prop_df[prop_df['prop_type'] == 'NHL_GAME_PLAYER_POINTS']
|
314 |
+
elif prop_type_var == "Points":
|
315 |
+
prop_df = prop_df[prop_df['prop_type'] == 'Player TP']
|
316 |
+
elif prop_type_var == "NHL_GAME_PLAYER_ASSISTS":
|
317 |
+
prop_df = prop_df[prop_df['prop_type'] == 'NHL_GAME_PLAYER_ASSISTS']
|
318 |
+
elif prop_type_var == "Assists":
|
319 |
+
prop_df = prop_df[prop_df['prop_type'] == 'Player Assists']
|
320 |
+
elif prop_type_var == "NHL_GAME_PLAYER_BLOCKED_SHOTS":
|
321 |
+
prop_df = prop_df[prop_df['prop_type'] == 'NHL_GAME_PLAYER_BLOCKED_SHOTS']
|
322 |
+
elif prop_type_var == "Blocks":
|
323 |
+
prop_df = prop_df[prop_df['prop_type'] == 'Player Blocks']
|
324 |
+
|
325 |
+
prop_df = prop_df[['Player', 'book', 'over_prop', 'over_line', 'under_line']]
|
326 |
+
prop_df.rename(columns={"over_prop": "Prop"}, inplace = True)
|
327 |
+
prop_df['Over'] = 1 / prop_df['over_line']
|
328 |
+
prop_df['Under'] = 1 / prop_df['under_line']
|
329 |
+
|
330 |
+
prop_dict = dict(zip(prop_df.Player, prop_df.Prop))
|
331 |
+
prop_type_dict = dict(zip(prop_df.Player, prop_df.prop_type))
|
332 |
+
book_dict = dict(zip(prop_df.Player, prop_df.book))
|
333 |
+
over_dict = dict(zip(prop_df.Player, prop_df.Over))
|
334 |
+
under_dict = dict(zip(prop_df.Player, prop_df.Under))
|
335 |
+
|
336 |
+
player_df['book'] = player_df['Player'].map(book_dict)
|
337 |
+
player_df['Prop'] = player_df['Player'].map(prop_dict)
|
338 |
+
player_df['prop_type'] = player_df['Player'].map(prop_type_dict)
|
339 |
+
|
340 |
+
df = player_df.reset_index(drop=True)
|
341 |
+
|
342 |
+
team_dict = dict(zip(df.Player, df.Team))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
343 |
|
344 |
total_sims = 1000
|
345 |
|
346 |
df.replace("", 0, inplace=True)
|
347 |
|
348 |
+
if prop_type_var == 'NHL_GAME_PLAYER_POINTS' or prop_type_var == 'Points':
|
349 |
df['Median'] = df['Player TP']
|
350 |
+
elif prop_type_var == 'NHL_GAME_PLAYER_SHOTS_ON_GOAL' or prop_type_var == 'Shots on Goal':
|
351 |
df['Median'] = df['Player SOG']
|
352 |
+
elif prop_type_var == 'NHL_GAME_PLAYER_ASSISTS' or prop_type_var == 'Assists':
|
353 |
df['Median'] = df['Player Assists']
|
354 |
+
elif prop_type_var == 'NHL_GAME_PLAYER_BLOCKED_SHOTS' or prop_type_var == 'Blocks':
|
355 |
df['Median'] = df['Player Blocks']
|
356 |
|
357 |
+
flex_file = df.copy()
|
358 |
flex_file['Floor'] = (flex_file['Median'] * .15)
|
359 |
flex_file['Ceiling'] = flex_file['Median'] + (flex_file['Median'] * 1)
|
360 |
flex_file['STD'] = (flex_file['Median']/3)
|
361 |
flex_file['Prop'] = flex_file['Player'].map(prop_dict)
|
362 |
flex_file = flex_file[['Player', 'book', 'Prop', 'Floor', 'Median', 'Ceiling', 'STD']]
|
363 |
|
364 |
+
hold_file = flex_file.copy()
|
365 |
+
overall_file = flex_file.copy()
|
366 |
+
prop_file = flex_file.copy()
|
367 |
|
368 |
overall_players = overall_file[['Player']]
|
369 |
|
|
|
396 |
players_only['Book'] = players_only['Player'].map(book_dict)
|
397 |
players_only['Prop_avg'] = players_only['Prop'].mean() / 100
|
398 |
players_only['prop_threshold'] = .10
|
399 |
+
players_only = players_only[players_only['Mean_Outcome'] > 0]
|
400 |
players_only['Over_diff'] = players_only['Over%'] - players_only['Imp Over']
|
401 |
players_only['Under_diff'] = players_only['Under%'] - players_only['Imp Under']
|
402 |
players_only['Bet_check'] = np.where(players_only['Over_diff'] > players_only['Under_diff'], players_only['Over_diff'] , players_only['Under_diff'])
|
|
|
411 |
sim_all_hold = pd.concat([sim_all_hold, leg_outcomes], ignore_index=True)
|
412 |
|
413 |
final_outcomes = sim_all_hold
|
414 |
+
st.write(f'finished {prop_type_var}')
|
415 |
|
416 |
final_outcomes = final_outcomes[final_outcomes['Prop'] > 0]
|
417 |
+
if game_select_var == 'Pick6':
|
418 |
+
final_outcomes = final_outcomes.drop_duplicates(subset=['Player', 'Prop Type'])
|
419 |
final_outcomes = final_outcomes.sort_values(by='Edge', ascending=False)
|
420 |
|
421 |
with df_hold_container:
|