Spaces:
Running
Running
James McCool
commited on
Commit
·
6aa2078
1
Parent(s):
f7a9234
restrucuring to NBA
Browse files- src/database.py +1 -1
- src/sim_func_hold/regular_functions.py +18 -19
- src/sim_func_hold/showdown_functions.py +4 -19
- src/streamlit_app.py +192 -293
src/database.py
CHANGED
|
@@ -8,7 +8,7 @@ def init_conn():
|
|
| 8 |
if not uri:
|
| 9 |
uri = st.secrets['mongo_uri']
|
| 10 |
client = pymongo.MongoClient(uri, retryWrites=True, serverSelectionTimeoutMS=500000)
|
| 11 |
-
db = client["
|
| 12 |
return db
|
| 13 |
|
| 14 |
# Initialize the database connection
|
|
|
|
| 8 |
if not uri:
|
| 9 |
uri = st.secrets['mongo_uri']
|
| 10 |
client = pymongo.MongoClient(uri, retryWrites=True, serverSelectionTimeoutMS=500000)
|
| 11 |
+
db = client["NBA_Database"]
|
| 12 |
return db
|
| 13 |
|
| 14 |
# Initialize the database connection
|
src/sim_func_hold/regular_functions.py
CHANGED
|
@@ -30,8 +30,8 @@ def init_DK_seed_frames(slate_var, sharp_split):
|
|
| 30 |
cursor = collection.find().limit(sharp_split)
|
| 31 |
|
| 32 |
raw_display = pd.DataFrame(list(cursor))
|
| 33 |
-
raw_display = raw_display[['
|
| 34 |
-
dict_columns = ['
|
| 35 |
for col in dict_columns:
|
| 36 |
raw_display[col] = raw_display[col].map(names_dict)
|
| 37 |
DK_seed = raw_display.to_numpy()
|
|
@@ -39,7 +39,7 @@ def init_DK_seed_frames(slate_var, sharp_split):
|
|
| 39 |
return DK_seed
|
| 40 |
|
| 41 |
@st.cache_data(ttl = 599)
|
| 42 |
-
def init_FD_seed_frames(slate_var, sharp_split):
|
| 43 |
|
| 44 |
if slate_var == 'Main Slate':
|
| 45 |
collection = db['FD_NFL_name_map']
|
|
@@ -64,8 +64,8 @@ def init_FD_seed_frames(slate_var, sharp_split):
|
|
| 64 |
cursor = collection.find().limit(sharp_split)
|
| 65 |
|
| 66 |
raw_display = pd.DataFrame(list(cursor))
|
| 67 |
-
raw_display = raw_display[['
|
| 68 |
-
dict_columns = ['
|
| 69 |
for col in dict_columns:
|
| 70 |
raw_display[col] = raw_display[col].map(names_dict)
|
| 71 |
FD_seed = raw_display.to_numpy()
|
|
@@ -74,24 +74,20 @@ def init_FD_seed_frames(slate_var, sharp_split):
|
|
| 74 |
|
| 75 |
@st.cache_data(ttl = 599)
|
| 76 |
def init_baselines(slate_var):
|
| 77 |
-
collection = db["
|
| 78 |
cursor = collection.find()
|
| 79 |
|
| 80 |
raw_display = pd.DataFrame(list(cursor))
|
| 81 |
raw_display = raw_display[raw_display['slate'] == slate_var]
|
| 82 |
raw_display = raw_display[raw_display['version'] == 'overall']
|
| 83 |
-
dk_raw = raw_display[['
|
| 84 |
-
|
|
|
|
| 85 |
dk_raw['STDev'] = (dk_raw['Ceiling'] - dk_raw['Floor']) / 4
|
| 86 |
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
raw_display = pd.DataFrame(list(cursor))
|
| 91 |
-
raw_display = raw_display[raw_display['slate'] == slate_var]
|
| 92 |
-
raw_display = raw_display[raw_display['version'] == 'overall']
|
| 93 |
-
fd_raw = raw_display[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%',
|
| 94 |
-
'Own', 'Small_Field_Own', 'Large_Field_Own', 'Cash_Field_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_ID', 'site']]
|
| 95 |
fd_raw['STDev'] = (fd_raw['Ceiling'] - fd_raw['Floor']) / 4
|
| 96 |
|
| 97 |
return dk_raw, fd_raw
|
|
@@ -103,7 +99,7 @@ def convert_df(array):
|
|
| 103 |
|
| 104 |
@st.cache_data
|
| 105 |
def calculate_DK_value_frequencies(np_array):
|
| 106 |
-
unique, counts = np.unique(np_array[:, :
|
| 107 |
frequencies = counts / len(np_array) # Normalize by the number of rows
|
| 108 |
combined_array = np.column_stack((unique, frequencies))
|
| 109 |
return combined_array
|
|
@@ -116,7 +112,7 @@ def calculate_FD_value_frequencies(np_array):
|
|
| 116 |
return combined_array
|
| 117 |
|
| 118 |
@st.cache_data
|
| 119 |
-
def sim_contest(Sim_size, seed_frame, maps_dict, Contest_Size):
|
| 120 |
SimVar = 1
|
| 121 |
Sim_Winners = []
|
| 122 |
fp_array = seed_frame.copy()
|
|
@@ -139,7 +135,10 @@ def sim_contest(Sim_size, seed_frame, maps_dict, Contest_Size):
|
|
| 139 |
|
| 140 |
sample_arrays = sample_arrays1
|
| 141 |
|
| 142 |
-
|
|
|
|
|
|
|
|
|
|
| 143 |
best_lineup = final_array[final_array[:, -1].argsort(kind='stable')[::-1][:1]]
|
| 144 |
Sim_Winners.append(best_lineup)
|
| 145 |
SimVar += 1
|
|
|
|
| 30 |
cursor = collection.find().limit(sharp_split)
|
| 31 |
|
| 32 |
raw_display = pd.DataFrame(list(cursor))
|
| 33 |
+
raw_display = raw_display[['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
|
| 34 |
+
dict_columns = ['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX']
|
| 35 |
for col in dict_columns:
|
| 36 |
raw_display[col] = raw_display[col].map(names_dict)
|
| 37 |
DK_seed = raw_display.to_numpy()
|
|
|
|
| 39 |
return DK_seed
|
| 40 |
|
| 41 |
@st.cache_data(ttl = 599)
|
| 42 |
+
def init_FD_seed_frames(slate_var, sharp_split):
|
| 43 |
|
| 44 |
if slate_var == 'Main Slate':
|
| 45 |
collection = db['FD_NFL_name_map']
|
|
|
|
| 64 |
cursor = collection.find().limit(sharp_split)
|
| 65 |
|
| 66 |
raw_display = pd.DataFrame(list(cursor))
|
| 67 |
+
raw_display = raw_display[['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
|
| 68 |
+
dict_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C']
|
| 69 |
for col in dict_columns:
|
| 70 |
raw_display[col] = raw_display[col].map(names_dict)
|
| 71 |
FD_seed = raw_display.to_numpy()
|
|
|
|
| 74 |
|
| 75 |
@st.cache_data(ttl = 599)
|
| 76 |
def init_baselines(slate_var):
|
| 77 |
+
collection = db["Player_Range_Of_Outcomes"]
|
| 78 |
cursor = collection.find()
|
| 79 |
|
| 80 |
raw_display = pd.DataFrame(list(cursor))
|
| 81 |
raw_display = raw_display[raw_display['slate'] == slate_var]
|
| 82 |
raw_display = raw_display[raw_display['version'] == 'overall']
|
| 83 |
+
dk_raw = raw_display[raw_display['site'] == 'Draftkings']
|
| 84 |
+
dk_raw = raw_display[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%',
|
| 85 |
+
'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_ID', 'site']]
|
| 86 |
dk_raw['STDev'] = (dk_raw['Ceiling'] - dk_raw['Floor']) / 4
|
| 87 |
|
| 88 |
+
fd_raw = raw_display[raw_display['site'] == 'FanDuel']
|
| 89 |
+
fd_raw = fd_raw[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%',
|
| 90 |
+
'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_ID', 'site']]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 91 |
fd_raw['STDev'] = (fd_raw['Ceiling'] - fd_raw['Floor']) / 4
|
| 92 |
|
| 93 |
return dk_raw, fd_raw
|
|
|
|
| 99 |
|
| 100 |
@st.cache_data
|
| 101 |
def calculate_DK_value_frequencies(np_array):
|
| 102 |
+
unique, counts = np.unique(np_array[:, :8], return_counts=True)
|
| 103 |
frequencies = counts / len(np_array) # Normalize by the number of rows
|
| 104 |
combined_array = np.column_stack((unique, frequencies))
|
| 105 |
return combined_array
|
|
|
|
| 112 |
return combined_array
|
| 113 |
|
| 114 |
@st.cache_data
|
| 115 |
+
def sim_contest(site_var, Sim_size, seed_frame, maps_dict, Contest_Size):
|
| 116 |
SimVar = 1
|
| 117 |
Sim_Winners = []
|
| 118 |
fp_array = seed_frame.copy()
|
|
|
|
| 135 |
|
| 136 |
sample_arrays = sample_arrays1
|
| 137 |
|
| 138 |
+
if site_var == 'Draftkings':
|
| 139 |
+
final_array = sample_arrays[sample_arrays[:, 9].argsort()[::-1]]
|
| 140 |
+
elif site_var == 'FanDuel':
|
| 141 |
+
final_array = sample_arrays[sample_arrays[:, 10].argsort()[::-1]]
|
| 142 |
best_lineup = final_array[final_array[:, -1].argsort(kind='stable')[::-1][:1]]
|
| 143 |
Sim_Winners.append(best_lineup)
|
| 144 |
SimVar += 1
|
src/sim_func_hold/showdown_functions.py
CHANGED
|
@@ -30,7 +30,7 @@ def init_FD_SD_seed_frames(slate, split, translation_dict):
|
|
| 30 |
|
| 31 |
@st.cache_data(ttl = 599)
|
| 32 |
def init_SD_baselines(slate_var):
|
| 33 |
-
collection = db['
|
| 34 |
cursor = collection.find()
|
| 35 |
|
| 36 |
raw_display = pd.DataFrame(list(cursor))
|
|
@@ -46,25 +46,10 @@ def init_SD_baselines(slate_var):
|
|
| 46 |
raw_display['STDev'] = raw_display['Median'] / 4
|
| 47 |
raw_display['CPT_STDev'] = raw_display['cpt_Median'] / 4
|
| 48 |
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
collection = db['FD_SD_NFL_ROO']
|
| 52 |
-
cursor = collection.find()
|
| 53 |
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
raw_display = raw_display[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%',
|
| 57 |
-
'Own', 'Small_Field_Own', 'Large_Field_Own', 'Cash_Field_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_id', 'site']]
|
| 58 |
-
raw_display = raw_display.rename(columns={'player_id': 'player_ID'})
|
| 59 |
-
raw_display['Small_Field_Own'] = raw_display['Large_Field_Own']
|
| 60 |
-
raw_display['small_CPT_Own_raw'] = (raw_display['Small_Field_Own'] / 2) * ((100 - (100-raw_display['Small_Field_Own']))/100)
|
| 61 |
-
small_cpt_own_var = 300 / raw_display['small_CPT_Own_raw'].sum()
|
| 62 |
-
raw_display['small_CPT_Own'] = raw_display['small_CPT_Own_raw'] * small_cpt_own_var
|
| 63 |
-
raw_display['cpt_Median'] = raw_display['Median'] * 1.25
|
| 64 |
-
raw_display['STDev'] = raw_display['Median'] / 4
|
| 65 |
-
raw_display['CPT_STDev'] = raw_display['cpt_Median'] / 4
|
| 66 |
-
|
| 67 |
-
fd_raw = raw_display.dropna(subset=['Median'])
|
| 68 |
|
| 69 |
return dk_raw, fd_raw
|
| 70 |
|
|
|
|
| 30 |
|
| 31 |
@st.cache_data(ttl = 599)
|
| 32 |
def init_SD_baselines(slate_var):
|
| 33 |
+
collection = db['Player_SD_Range_Of_Outcomes']
|
| 34 |
cursor = collection.find()
|
| 35 |
|
| 36 |
raw_display = pd.DataFrame(list(cursor))
|
|
|
|
| 46 |
raw_display['STDev'] = raw_display['Median'] / 4
|
| 47 |
raw_display['CPT_STDev'] = raw_display['cpt_Median'] / 4
|
| 48 |
|
| 49 |
+
raw_display = raw_display.dropna(subset=['Median'])
|
|
|
|
|
|
|
|
|
|
| 50 |
|
| 51 |
+
dk_raw = raw_display[raw_display['site'] == 'Draftkings']
|
| 52 |
+
fd_raw = raw_display[raw_display['site'] == 'FanDuel']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 53 |
|
| 54 |
return dk_raw, fd_raw
|
| 55 |
|
src/streamlit_app.py
CHANGED
|
@@ -15,18 +15,18 @@ from sim_func_hold.showdown_functions import *
|
|
| 15 |
|
| 16 |
percentages_format = {'Exposure': '{:.2%}'}
|
| 17 |
freq_format = {'Exposure': '{:.2%}', 'Proj Own': '{:.2%}', 'Edge': '{:.2%}'}
|
| 18 |
-
dk_columns = ['
|
| 19 |
-
fd_columns = ['
|
| 20 |
dk_sd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
|
| 21 |
fd_sd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
|
| 22 |
|
| 23 |
showdown_selections = ['Showdown #1', 'Showdown #2', 'Showdown #3', 'Showdown #4', 'Showdown #5', 'Showdown #6', 'Showdown #7', 'Showdown #8', 'Showdown #9', 'Showdown #10', 'Showdown #11', 'Showdown #12', 'Showdown #13', 'Showdown #14', 'Showdown #15']
|
| 24 |
-
dk_db_showdown_selections = ['
|
| 25 |
-
'
|
| 26 |
-
'
|
| 27 |
-
fd_db_showdown_selections = ['
|
| 28 |
-
'
|
| 29 |
-
'
|
| 30 |
|
| 31 |
dk_showdown_db_translation = dict(zip(showdown_selections, dk_db_showdown_selections))
|
| 32 |
fd_showdown_db_translation = dict(zip(showdown_selections, fd_db_showdown_selections))
|
|
@@ -80,9 +80,10 @@ st.markdown("""
|
|
| 80 |
|
| 81 |
@st.cache_resource(ttl=60)
|
| 82 |
def define_dk_showdown_slates():
|
| 83 |
-
collection = db["
|
| 84 |
cursor = collection.find()
|
| 85 |
raw_display = pd.DataFrame(list(cursor))
|
|
|
|
| 86 |
unique_slates = raw_display['slate'].unique()
|
| 87 |
|
| 88 |
slate_names = []
|
|
@@ -97,9 +98,10 @@ def define_dk_showdown_slates():
|
|
| 97 |
|
| 98 |
@st.cache_resource(ttl=60)
|
| 99 |
def define_fd_showdown_slates():
|
| 100 |
-
collection = db["
|
| 101 |
cursor = collection.find()
|
| 102 |
raw_display = pd.DataFrame(list(cursor))
|
|
|
|
| 103 |
unique_slates = raw_display['slate'].unique()
|
| 104 |
|
| 105 |
slate_names = []
|
|
@@ -268,101 +270,116 @@ if selected_tab == "Regular Slate Contest Sims":
|
|
| 268 |
st.session_state.Sim_Winner_Display = Sim_Winner_Frame.copy()
|
| 269 |
|
| 270 |
if sim_site_var1 == 'Draftkings':
|
| 271 |
-
|
| 272 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 273 |
elif sim_site_var1 == 'Fanduel':
|
| 274 |
-
|
| 275 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 276 |
-
|
| 277 |
-
|
| 278 |
-
|
| 279 |
-
|
| 280 |
-
|
| 281 |
-
|
| 282 |
-
|
| 283 |
-
st.session_state.
|
| 284 |
-
|
| 285 |
if sim_site_var1 == 'Draftkings':
|
| 286 |
-
|
| 287 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 288 |
elif sim_site_var1 == 'Fanduel':
|
| 289 |
-
|
| 290 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 291 |
-
|
| 292 |
-
|
| 293 |
-
|
| 294 |
-
|
| 295 |
-
|
| 296 |
-
|
| 297 |
-
|
| 298 |
-
st.session_state.
|
| 299 |
|
| 300 |
if sim_site_var1 == 'Draftkings':
|
| 301 |
-
|
| 302 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 303 |
elif sim_site_var1 == 'Fanduel':
|
| 304 |
-
|
| 305 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 306 |
-
|
| 307 |
-
|
| 308 |
-
|
| 309 |
-
|
| 310 |
-
|
| 311 |
-
|
| 312 |
-
|
| 313 |
-
st.session_state.
|
| 314 |
|
| 315 |
if sim_site_var1 == 'Draftkings':
|
| 316 |
-
|
| 317 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 318 |
elif sim_site_var1 == 'Fanduel':
|
| 319 |
-
|
| 320 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 321 |
-
|
| 322 |
-
|
| 323 |
-
|
| 324 |
-
|
| 325 |
-
|
| 326 |
-
|
| 327 |
-
|
| 328 |
-
st.session_state.
|
| 329 |
|
| 330 |
if sim_site_var1 == 'Draftkings':
|
| 331 |
-
|
| 332 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 333 |
elif sim_site_var1 == 'Fanduel':
|
| 334 |
-
|
| 335 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 336 |
-
|
| 337 |
-
|
| 338 |
-
|
| 339 |
-
|
| 340 |
-
|
| 341 |
-
|
| 342 |
-
|
| 343 |
-
st.session_state.
|
| 344 |
|
| 345 |
if sim_site_var1 == 'Draftkings':
|
| 346 |
-
|
| 347 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 348 |
elif sim_site_var1 == 'Fanduel':
|
| 349 |
-
|
| 350 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 351 |
-
|
| 352 |
-
|
| 353 |
-
|
| 354 |
-
|
| 355 |
-
|
| 356 |
-
|
| 357 |
-
|
| 358 |
-
st.session_state.
|
| 359 |
|
| 360 |
if sim_site_var1 == 'Draftkings':
|
| 361 |
-
|
| 362 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 363 |
elif sim_site_var1 == 'Fanduel':
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 364 |
flex_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,7:8].values, return_counts=True)),
|
| 365 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
|
|
|
|
|
|
|
|
|
| 366 |
flex_working['Freq'] = flex_working['Freq'].astype(int)
|
| 367 |
flex_working['Position'] = flex_working['Player'].map(st.session_state.maps_dict['Pos_map'])
|
| 368 |
flex_working['Salary'] = flex_working['Player'].map(st.session_state.maps_dict['Salary_map'])
|
|
@@ -371,24 +388,9 @@ if selected_tab == "Regular Slate Contest Sims":
|
|
| 371 |
flex_working['Edge'] = flex_working['Exposure'] - flex_working['Proj Own']
|
| 372 |
flex_working['Team'] = flex_working['Player'].map(st.session_state.maps_dict['Team_map'])
|
| 373 |
st.session_state.flex_freq = flex_working.copy()
|
| 374 |
-
|
| 375 |
-
if sim_site_var1 == 'Draftkings':
|
| 376 |
-
dst_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,8:9].values, return_counts=True)),
|
| 377 |
-
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 378 |
-
elif sim_site_var1 == 'Fanduel':
|
| 379 |
-
dst_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,8:9].values, return_counts=True)),
|
| 380 |
-
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 381 |
-
dst_working['Freq'] = dst_working['Freq'].astype(int)
|
| 382 |
-
dst_working['Position'] = dst_working['Player'].map(st.session_state.maps_dict['Pos_map'])
|
| 383 |
-
dst_working['Salary'] = dst_working['Player'].map(st.session_state.maps_dict['Salary_map'])
|
| 384 |
-
dst_working['Proj Own'] = dst_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
|
| 385 |
-
dst_working['Exposure'] = dst_working['Freq']/(1000)
|
| 386 |
-
dst_working['Edge'] = dst_working['Exposure'] - dst_working['Proj Own']
|
| 387 |
-
dst_working['Team'] = dst_working['Player'].map(st.session_state.maps_dict['Team_map'])
|
| 388 |
-
st.session_state.dst_freq = dst_working.copy()
|
| 389 |
|
| 390 |
if sim_site_var1 == 'Draftkings':
|
| 391 |
-
team_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,11
|
| 392 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 393 |
elif sim_site_var1 == 'Fanduel':
|
| 394 |
team_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,11:12].values, return_counts=True)),
|
|
@@ -397,215 +399,112 @@ if selected_tab == "Regular Slate Contest Sims":
|
|
| 397 |
team_working['Exposure'] = team_working['Freq']/(1000)
|
| 398 |
st.session_state.team_freq = team_working.copy()
|
| 399 |
|
| 400 |
-
|
| 401 |
-
|
| 402 |
-
|
| 403 |
-
|
| 404 |
-
|
| 405 |
-
|
| 406 |
-
|
| 407 |
-
|
| 408 |
-
|
| 409 |
-
|
| 410 |
-
|
| 411 |
-
|
| 412 |
-
|
| 413 |
-
|
| 414 |
-
|
| 415 |
-
|
| 416 |
-
|
| 417 |
-
|
| 418 |
-
st.download_button(
|
| 419 |
-
label="Export Full Frame",
|
| 420 |
-
data=st.session_state.Sim_Winner_Export.to_csv().encode('utf-8'),
|
| 421 |
-
file_name='MLB_consim_export.csv',
|
| 422 |
-
mime='text/csv',
|
| 423 |
-
)
|
| 424 |
-
tab1, tab2 = st.tabs(['Winning Frame Statistics', 'Flex Exposure Statistics'])
|
| 425 |
-
|
| 426 |
-
with tab1:
|
| 427 |
-
if 'Sim_Winner_Display' in st.session_state:
|
| 428 |
-
# Create a new dataframe with summary statistics
|
| 429 |
-
summary_df = pd.DataFrame({
|
| 430 |
-
'Metric': ['Min', 'Average', 'Max', 'STDdev'],
|
| 431 |
-
'Salary': [
|
| 432 |
-
st.session_state.Sim_Winner_Display['salary'].min(),
|
| 433 |
-
st.session_state.Sim_Winner_Display['salary'].mean(),
|
| 434 |
-
st.session_state.Sim_Winner_Display['salary'].max(),
|
| 435 |
-
st.session_state.Sim_Winner_Display['salary'].std()
|
| 436 |
-
],
|
| 437 |
-
'Proj': [
|
| 438 |
-
st.session_state.Sim_Winner_Display['proj'].min(),
|
| 439 |
-
st.session_state.Sim_Winner_Display['proj'].mean(),
|
| 440 |
-
st.session_state.Sim_Winner_Display['proj'].max(),
|
| 441 |
-
st.session_state.Sim_Winner_Display['proj'].std()
|
| 442 |
-
],
|
| 443 |
-
'Own': [
|
| 444 |
-
st.session_state.Sim_Winner_Display['Own'].min(),
|
| 445 |
-
st.session_state.Sim_Winner_Display['Own'].mean(),
|
| 446 |
-
st.session_state.Sim_Winner_Display['Own'].max(),
|
| 447 |
-
st.session_state.Sim_Winner_Display['Own'].std()
|
| 448 |
-
],
|
| 449 |
-
'Fantasy': [
|
| 450 |
-
st.session_state.Sim_Winner_Display['Fantasy'].min(),
|
| 451 |
-
st.session_state.Sim_Winner_Display['Fantasy'].mean(),
|
| 452 |
-
st.session_state.Sim_Winner_Display['Fantasy'].max(),
|
| 453 |
-
st.session_state.Sim_Winner_Display['Fantasy'].std()
|
| 454 |
-
],
|
| 455 |
-
'GPP_Proj': [
|
| 456 |
-
st.session_state.Sim_Winner_Display['GPP_Proj'].min(),
|
| 457 |
-
st.session_state.Sim_Winner_Display['GPP_Proj'].mean(),
|
| 458 |
-
st.session_state.Sim_Winner_Display['GPP_Proj'].max(),
|
| 459 |
-
st.session_state.Sim_Winner_Display['GPP_Proj'].std()
|
| 460 |
-
]
|
| 461 |
-
})
|
| 462 |
-
|
| 463 |
-
# Set the index of the summary dataframe as the "Metric" column
|
| 464 |
-
summary_df = summary_df.set_index('Metric')
|
| 465 |
-
|
| 466 |
-
# Display the summary dataframe
|
| 467 |
-
st.subheader("Winning Frame Statistics")
|
| 468 |
-
st.dataframe(summary_df.style.format({
|
| 469 |
-
'Salary': '{:.2f}',
|
| 470 |
-
'Proj': '{:.2f}',
|
| 471 |
-
'Fantasy': '{:.2f}',
|
| 472 |
-
'GPP_Proj': '{:.2f}'
|
| 473 |
-
}).background_gradient(cmap='RdYlGn', axis=0, subset=['Salary', 'Proj', 'Own', 'Fantasy', 'GPP_Proj']), use_container_width=True)
|
| 474 |
-
|
| 475 |
-
with tab2:
|
| 476 |
-
if 'Sim_Winner_Display' in st.session_state:
|
| 477 |
-
# Apply position mapping to FLEX column
|
| 478 |
-
flex_positions = st.session_state.freq_copy['FLEX'].map(st.session_state.maps_dict['Pos_map'])
|
| 479 |
-
|
| 480 |
-
# Count occurrences of each position in FLEX
|
| 481 |
-
flex_counts = flex_positions.value_counts()
|
| 482 |
-
|
| 483 |
-
# Calculate average statistics for each FLEX position
|
| 484 |
-
flex_stats = st.session_state.freq_copy.groupby(flex_positions).agg({
|
| 485 |
-
'proj': 'mean',
|
| 486 |
-
'Own': 'mean',
|
| 487 |
-
'Fantasy': 'mean',
|
| 488 |
-
'GPP_Proj': 'mean'
|
| 489 |
-
})
|
| 490 |
-
|
| 491 |
-
# Combine counts and average statistics
|
| 492 |
-
flex_summary = pd.concat([flex_counts, flex_stats], axis=1)
|
| 493 |
-
flex_summary.columns = ['Count', 'Avg Proj', 'Avg Own', 'Avg Fantasy', 'Avg GPP_Proj']
|
| 494 |
-
flex_summary = flex_summary.reset_index()
|
| 495 |
-
flex_summary.columns = ['Position', 'Count', 'Avg Proj', 'Avg Own', 'Avg Fantasy', 'Avg GPP_Proj']
|
| 496 |
-
|
| 497 |
-
# Display the summary dataframe
|
| 498 |
-
st.subheader("FLEX Position Statistics")
|
| 499 |
-
st.dataframe(flex_summary.style.format({
|
| 500 |
-
'Count': '{:.0f}',
|
| 501 |
-
'Avg Proj': '{:.2f}',
|
| 502 |
-
'Avg Fantasy': '{:.2f}',
|
| 503 |
-
'Avg GPP_Proj': '{:.2f}'
|
| 504 |
-
}).background_gradient(cmap='RdYlGn', axis=0, subset=['Count', 'Avg Proj', 'Avg Own', 'Avg Fantasy', 'Avg GPP_Proj']), use_container_width=True)
|
| 505 |
-
|
| 506 |
-
else:
|
| 507 |
-
st.write("Simulation data or position mapping not available.")
|
| 508 |
-
with st.container():
|
| 509 |
-
tab1, tab2, tab3, tab4, tab5, tab6, tab7, tab8, tab9 = st.tabs(['Overall Exposures', 'QB Exposures', 'RB-WR-TE Exposures', 'RB Exposures', 'WR Exposures', 'TE Exposures', 'FLEX Exposures', 'DST Exposures', 'Team Exposures'])
|
| 510 |
-
with tab1:
|
| 511 |
-
if 'player_freq' in st.session_state:
|
| 512 |
-
|
| 513 |
-
st.dataframe(st.session_state.player_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
|
| 514 |
st.download_button(
|
| 515 |
-
label="Export
|
| 516 |
-
data=st.session_state.
|
| 517 |
-
file_name='
|
| 518 |
mime='text/csv',
|
| 519 |
-
|
| 520 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 521 |
with tab2:
|
| 522 |
-
if '
|
| 523 |
-
|
| 524 |
-
st.dataframe(st.session_state.qb_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
|
| 525 |
-
st.download_button(
|
| 526 |
-
label="Export Exposures",
|
| 527 |
-
data=st.session_state.qb_freq.to_csv().encode('utf-8'),
|
| 528 |
-
file_name='qb_freq.csv',
|
| 529 |
-
mime='text/csv',
|
| 530 |
-
key='qb'
|
| 531 |
-
)
|
| 532 |
-
with tab3:
|
| 533 |
-
if 'rbwrte_freq' in st.session_state:
|
| 534 |
-
|
| 535 |
-
st.dataframe(st.session_state.rbwrte_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
|
| 536 |
-
st.download_button(
|
| 537 |
-
label="Export Exposures",
|
| 538 |
-
data=st.session_state.rbwrte_freq.to_csv().encode('utf-8'),
|
| 539 |
-
file_name='rbwrte_freq.csv',
|
| 540 |
-
mime='text/csv',
|
| 541 |
-
key='rbwrte'
|
| 542 |
-
)
|
| 543 |
-
with tab4:
|
| 544 |
-
if 'rb_freq' in st.session_state:
|
| 545 |
-
|
| 546 |
-
st.dataframe(st.session_state.rb_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
|
| 547 |
-
st.download_button(
|
| 548 |
-
label="Export Exposures",
|
| 549 |
-
data=st.session_state.rb_freq.to_csv().encode('utf-8'),
|
| 550 |
-
file_name='rb_freq.csv',
|
| 551 |
-
mime='text/csv',
|
| 552 |
-
key='rb'
|
| 553 |
-
)
|
| 554 |
-
with tab5:
|
| 555 |
-
if 'wr_freq' in st.session_state:
|
| 556 |
-
|
| 557 |
-
st.dataframe(st.session_state.wr_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
|
| 558 |
-
st.download_button(
|
| 559 |
-
label="Export Exposures",
|
| 560 |
-
data=st.session_state.wr_freq.to_csv().encode('utf-8'),
|
| 561 |
-
file_name='wr_freq.csv',
|
| 562 |
-
mime='text/csv',
|
| 563 |
-
key='wr'
|
| 564 |
-
)
|
| 565 |
-
with tab6:
|
| 566 |
-
if 'te_freq' in st.session_state:
|
| 567 |
-
|
| 568 |
-
st.dataframe(st.session_state.te_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
|
| 569 |
-
st.download_button(
|
| 570 |
-
label="Export Exposures",
|
| 571 |
-
data=st.session_state.te_freq.to_csv().encode('utf-8'),
|
| 572 |
-
file_name='te_freq.csv',
|
| 573 |
-
mime='text/csv',
|
| 574 |
-
key='te'
|
| 575 |
-
)
|
| 576 |
-
with tab7:
|
| 577 |
-
if 'flex_freq' in st.session_state:
|
| 578 |
-
|
| 579 |
-
st.dataframe(st.session_state.flex_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
|
| 580 |
-
st.download_button(
|
| 581 |
-
label="Export Exposures",
|
| 582 |
-
data=st.session_state.flex_freq.to_csv().encode('utf-8'),
|
| 583 |
-
file_name='flex_freq.csv',
|
| 584 |
-
mime='text/csv',
|
| 585 |
-
key='flex'
|
| 586 |
-
)
|
| 587 |
-
with tab8:
|
| 588 |
-
if 'dst_freq' in st.session_state:
|
| 589 |
-
|
| 590 |
-
st.dataframe(st.session_state.dst_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
|
| 591 |
-
st.download_button(
|
| 592 |
-
label="Export Exposures",
|
| 593 |
-
data=st.session_state.dst_freq.to_csv().encode('utf-8'),
|
| 594 |
-
file_name='dst_freq.csv',
|
| 595 |
-
mime='text/csv',
|
| 596 |
-
key='dst'
|
| 597 |
-
)
|
| 598 |
-
with tab9:
|
| 599 |
-
if 'team_freq' in st.session_state:
|
| 600 |
|
| 601 |
-
|
| 602 |
-
st.
|
| 603 |
-
|
| 604 |
-
|
| 605 |
-
|
| 606 |
-
|
| 607 |
-
|
| 608 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 609 |
|
| 610 |
if selected_tab == "Showdown Contest Sims":
|
| 611 |
dk_sd_raw, fd_sd_raw = init_SD_baselines('Showdown #1')
|
|
|
|
| 15 |
|
| 16 |
percentages_format = {'Exposure': '{:.2%}'}
|
| 17 |
freq_format = {'Exposure': '{:.2%}', 'Proj Own': '{:.2%}', 'Edge': '{:.2%}'}
|
| 18 |
+
dk_columns = ['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
|
| 19 |
+
fd_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
|
| 20 |
dk_sd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
|
| 21 |
fd_sd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
|
| 22 |
|
| 23 |
showdown_selections = ['Showdown #1', 'Showdown #2', 'Showdown #3', 'Showdown #4', 'Showdown #5', 'Showdown #6', 'Showdown #7', 'Showdown #8', 'Showdown #9', 'Showdown #10', 'Showdown #11', 'Showdown #12', 'Showdown #13', 'Showdown #14', 'Showdown #15']
|
| 24 |
+
dk_db_showdown_selections = ['DK_NBA_SD_seed_frame_Showdown #1', 'DK_NBA_SD_seed_frame_Showdown #2', 'DK_NBA_SD_seed_frame_Showdown #3', 'DK_NBA_SD_seed_frame_Showdown #4', 'DK_NBA_SD_seed_frame_Showdown #5', 'DK_NBA_SD_seed_frame_Showdown #6',
|
| 25 |
+
'DK_NBA_SD_seed_frame_Showdown #7', 'DK_NBA_SD_seed_frame_Showdown #8', 'DK_NBA_SD_seed_frame_Showdown #9', 'DK_NBA_SD_seed_frame_Showdown #10', 'DK_NBA_SD_seed_frame_Showdown #11', 'DK_NBA_SD_seed_frame_Showdown #12', 'DK_NBA_SD_seed_frame_Showdown #13',
|
| 26 |
+
'DK_NBA_SD_seed_frame_Showdown #14', 'DK_NBA_SD_seed_frame_Showdown #15']
|
| 27 |
+
fd_db_showdown_selections = ['FD_NBA_SD_seed_frame_Showdown #1', 'FD_NBA_SD_seed_frame_Showdown #2', 'FD_NBA_SD_seed_frame_Showdown #3', 'FD_NBA_SD_seed_frame_Showdown #4', 'FD_NBA_SD_seed_frame_Showdown #5', 'FD_NBA_SD_seed_frame_Showdown #6',
|
| 28 |
+
'FD_NBA_SD_seed_frame_Showdown #7', 'FD_NBA_SD_seed_frame_Showdown #8', 'FD_NBA_SD_seed_frame_Showdown #9', 'FD_NBA_SD_seed_frame_Showdown #10', 'FD_NBA_SD_seed_frame_Showdown #11', 'FD_NBA_SD_seed_frame_Showdown #12', 'FD_NBA_SD_seed_frame_Showdown #13',
|
| 29 |
+
'FD_NBA_SD_seed_frame_Showdown #14', 'FD_NBA_SD_seed_frame_Showdown #15']
|
| 30 |
|
| 31 |
dk_showdown_db_translation = dict(zip(showdown_selections, dk_db_showdown_selections))
|
| 32 |
fd_showdown_db_translation = dict(zip(showdown_selections, fd_db_showdown_selections))
|
|
|
|
| 80 |
|
| 81 |
@st.cache_resource(ttl=60)
|
| 82 |
def define_dk_showdown_slates():
|
| 83 |
+
collection = db["Player_SD_Range_Of_Outcomes"]
|
| 84 |
cursor = collection.find()
|
| 85 |
raw_display = pd.DataFrame(list(cursor))
|
| 86 |
+
raw_display = raw_display[raw_display['site'] == 'Draftkings']
|
| 87 |
unique_slates = raw_display['slate'].unique()
|
| 88 |
|
| 89 |
slate_names = []
|
|
|
|
| 98 |
|
| 99 |
@st.cache_resource(ttl=60)
|
| 100 |
def define_fd_showdown_slates():
|
| 101 |
+
collection = db["Player_SD_Range_Of_Outcomes"]
|
| 102 |
cursor = collection.find()
|
| 103 |
raw_display = pd.DataFrame(list(cursor))
|
| 104 |
+
raw_display = raw_display[raw_display['site'] == 'FanDuel']
|
| 105 |
unique_slates = raw_display['slate'].unique()
|
| 106 |
|
| 107 |
slate_names = []
|
|
|
|
| 270 |
st.session_state.Sim_Winner_Display = Sim_Winner_Frame.copy()
|
| 271 |
|
| 272 |
if sim_site_var1 == 'Draftkings':
|
| 273 |
+
pg_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:1].values, return_counts=True)),
|
| 274 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 275 |
elif sim_site_var1 == 'Fanduel':
|
| 276 |
+
pg_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:2].values, return_counts=True)),
|
| 277 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 278 |
+
pg_working['Freq'] = pg_working['Freq'].astype(int)
|
| 279 |
+
pg_working['Position'] = pg_working['Player'].map(st.session_state.maps_dict['Pos_map'])
|
| 280 |
+
pg_working['Salary'] = pg_working['Player'].map(st.session_state.maps_dict['Salary_map'])
|
| 281 |
+
pg_working['Proj Own'] = pg_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
|
| 282 |
+
pg_working['Exposure'] = pg_working['Freq']/(1000)
|
| 283 |
+
pg_working['Edge'] = pg_working['Exposure'] - pg_working['Proj Own']
|
| 284 |
+
pg_working['Team'] = pg_working['Player'].map(st.session_state.maps_dict['Team_map'])
|
| 285 |
+
st.session_state.pg_freq = pg_working.copy()
|
| 286 |
+
|
| 287 |
if sim_site_var1 == 'Draftkings':
|
| 288 |
+
sg_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,1:2].values, return_counts=True)),
|
| 289 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 290 |
elif sim_site_var1 == 'Fanduel':
|
| 291 |
+
sg_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,2:4].values, return_counts=True)),
|
| 292 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 293 |
+
sg_working['Freq'] = sg_working['Freq'].astype(int)
|
| 294 |
+
sg_working['Position'] = sg_working['Player'].map(st.session_state.maps_dict['Pos_map'])
|
| 295 |
+
sg_working['Salary'] = sg_working['Player'].map(st.session_state.maps_dict['Salary_map'])
|
| 296 |
+
sg_working['Proj Own'] = sg_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
|
| 297 |
+
sg_working['Exposure'] = sg_working['Freq']/(1000)
|
| 298 |
+
sg_working['Edge'] = sg_working['Exposure'] - sg_working['Proj Own']
|
| 299 |
+
sg_working['Team'] = sg_working['Player'].map(st.session_state.maps_dict['Team_map'])
|
| 300 |
+
st.session_state.sg_freq = sg_working.copy()
|
| 301 |
|
| 302 |
if sim_site_var1 == 'Draftkings':
|
| 303 |
+
sf_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,2:3].values, return_counts=True)),
|
| 304 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 305 |
elif sim_site_var1 == 'Fanduel':
|
| 306 |
+
sf_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,4:6].values, return_counts=True)),
|
| 307 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 308 |
+
sf_working['Freq'] = sf_working['Freq'].astype(int)
|
| 309 |
+
sf_working['Position'] = sf_working['Player'].map(st.session_state.maps_dict['Pos_map'])
|
| 310 |
+
sf_working['Salary'] = sf_working['Player'].map(st.session_state.maps_dict['Salary_map'])
|
| 311 |
+
sf_working['Proj Own'] = sf_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
|
| 312 |
+
sf_working['Exposure'] = sf_working['Freq']/(1000)
|
| 313 |
+
sf_working['Edge'] = sf_working['Exposure'] - sf_working['Proj Own']
|
| 314 |
+
sf_working['Team'] = sf_working['Player'].map(st.session_state.maps_dict['Team_map'])
|
| 315 |
+
st.session_state.sf_freq = sf_working.copy()
|
| 316 |
|
| 317 |
if sim_site_var1 == 'Draftkings':
|
| 318 |
+
pf_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,3:4].values, return_counts=True)),
|
| 319 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 320 |
elif sim_site_var1 == 'Fanduel':
|
| 321 |
+
pf_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,6:8].values, return_counts=True)),
|
| 322 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 323 |
+
pf_working['Freq'] = pf_working['Freq'].astype(int)
|
| 324 |
+
pf_working['Position'] = pf_working['Player'].map(st.session_state.maps_dict['Pos_map'])
|
| 325 |
+
pf_working['Salary'] = pf_working['Player'].map(st.session_state.maps_dict['Salary_map'])
|
| 326 |
+
pf_working['Proj Own'] = pf_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
|
| 327 |
+
pf_working['Exposure'] = pf_working['Freq']/(1000)
|
| 328 |
+
pf_working['Edge'] = pf_working['Exposure'] - pf_working['Proj Own']
|
| 329 |
+
pf_working['Team'] = pf_working['Player'].map(st.session_state.maps_dict['Team_map'])
|
| 330 |
+
st.session_state.pf_freq = pf_working.copy()
|
| 331 |
|
| 332 |
if sim_site_var1 == 'Draftkings':
|
| 333 |
+
c_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,4:5].values, return_counts=True)),
|
| 334 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 335 |
elif sim_site_var1 == 'Fanduel':
|
| 336 |
+
c_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,8:9].values, return_counts=True)),
|
| 337 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 338 |
+
c_working['Freq'] = c_working['Freq'].astype(int)
|
| 339 |
+
c_working['Position'] = c_working['Player'].map(st.session_state.maps_dict['Pos_map'])
|
| 340 |
+
c_working['Salary'] = c_working['Player'].map(st.session_state.maps_dict['Salary_map'])
|
| 341 |
+
c_working['Proj Own'] = c_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
|
| 342 |
+
c_working['Exposure'] = c_working['Freq']/(1000)
|
| 343 |
+
c_working['Edge'] = c_working['Exposure'] - c_working['Proj Own']
|
| 344 |
+
c_working['Team'] = c_working['Player'].map(st.session_state.maps_dict['Team_map'])
|
| 345 |
+
st.session_state.c_freq = c_working.copy()
|
| 346 |
|
| 347 |
if sim_site_var1 == 'Draftkings':
|
| 348 |
+
g_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,5:6].values, return_counts=True)),
|
| 349 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 350 |
elif sim_site_var1 == 'Fanduel':
|
| 351 |
+
g_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:4].values, return_counts=True)),
|
| 352 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 353 |
+
g_working['Freq'] = g_working['Freq'].astype(int)
|
| 354 |
+
g_working['Position'] = g_working['Player'].map(st.session_state.maps_dict['Pos_map'])
|
| 355 |
+
g_working['Salary'] = g_working['Player'].map(st.session_state.maps_dict['Salary_map'])
|
| 356 |
+
g_working['Proj Own'] = g_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
|
| 357 |
+
g_working['Exposure'] = g_working['Freq']/(1000)
|
| 358 |
+
g_working['Edge'] = g_working['Exposure'] - g_working['Proj Own']
|
| 359 |
+
g_working['Team'] = g_working['Player'].map(st.session_state.maps_dict['Team_map'])
|
| 360 |
+
st.session_state.g_freq = g_working.copy()
|
| 361 |
|
| 362 |
if sim_site_var1 == 'Draftkings':
|
| 363 |
+
f_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,6:7].values, return_counts=True)),
|
| 364 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 365 |
elif sim_site_var1 == 'Fanduel':
|
| 366 |
+
f_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,4:8].values, return_counts=True)),
|
| 367 |
+
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 368 |
+
f_working['Freq'] = f_working['Freq'].astype(int)
|
| 369 |
+
f_working['Position'] = f_working['Player'].map(st.session_state.maps_dict['Pos_map'])
|
| 370 |
+
f_working['Salary'] = f_working['Player'].map(st.session_state.maps_dict['Salary_map'])
|
| 371 |
+
f_working['Proj Own'] = f_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
|
| 372 |
+
f_working['Exposure'] = f_working['Freq']/(1000)
|
| 373 |
+
f_working['Edge'] = f_working['Exposure'] - f_working['Proj Own']
|
| 374 |
+
f_working['Team'] = f_working['Player'].map(st.session_state.maps_dict['Team_map'])
|
| 375 |
+
st.session_state.f_freq = f_working.copy()
|
| 376 |
+
|
| 377 |
+
if sim_site_var1 == 'Draftkings':
|
| 378 |
flex_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,7:8].values, return_counts=True)),
|
| 379 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 380 |
+
elif sim_site_var1 == 'Fanduel':
|
| 381 |
+
flex_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:9].values, return_counts=True)),
|
| 382 |
+
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 383 |
flex_working['Freq'] = flex_working['Freq'].astype(int)
|
| 384 |
flex_working['Position'] = flex_working['Player'].map(st.session_state.maps_dict['Pos_map'])
|
| 385 |
flex_working['Salary'] = flex_working['Player'].map(st.session_state.maps_dict['Salary_map'])
|
|
|
|
| 388 |
flex_working['Edge'] = flex_working['Exposure'] - flex_working['Proj Own']
|
| 389 |
flex_working['Team'] = flex_working['Player'].map(st.session_state.maps_dict['Team_map'])
|
| 390 |
st.session_state.flex_freq = flex_working.copy()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 391 |
|
| 392 |
if sim_site_var1 == 'Draftkings':
|
| 393 |
+
team_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,10:11].values, return_counts=True)),
|
| 394 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
| 395 |
elif sim_site_var1 == 'Fanduel':
|
| 396 |
team_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,11:12].values, return_counts=True)),
|
|
|
|
| 399 |
team_working['Exposure'] = team_working['Freq']/(1000)
|
| 400 |
st.session_state.team_freq = team_working.copy()
|
| 401 |
|
| 402 |
+
with st.container():
|
| 403 |
+
if st.button("Reset Sim", key='reset_sim'):
|
| 404 |
+
for key in st.session_state.keys():
|
| 405 |
+
del st.session_state[key]
|
| 406 |
+
if 'player_freq' in st.session_state:
|
| 407 |
+
player_split_var2 = st.radio("Are you wanting to isolate any lineups with specific players?", ('Full Players', 'Specific Players'), key='player_split_var2')
|
| 408 |
+
if player_split_var2 == 'Specific Players':
|
| 409 |
+
find_var2 = st.multiselect('Which players must be included in the lineups?', options = st.session_state.player_freq['Player'].unique())
|
| 410 |
+
elif player_split_var2 == 'Full Players':
|
| 411 |
+
find_var2 = st.session_state.player_freq.Player.values.tolist()
|
| 412 |
+
|
| 413 |
+
if player_split_var2 == 'Specific Players':
|
| 414 |
+
st.session_state.Sim_Winner_Display = st.session_state.Sim_Winner_Frame[np.equal.outer(st.session_state.Sim_Winner_Frame.to_numpy(), find_var2).any(axis=1).all(axis=1)]
|
| 415 |
+
if player_split_var2 == 'Full Players':
|
| 416 |
+
st.session_state.Sim_Winner_Display = st.session_state.Sim_Winner_Frame
|
| 417 |
+
if 'Sim_Winner_Display' in st.session_state:
|
| 418 |
+
st.dataframe(st.session_state.Sim_Winner_Display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), use_container_width = True)
|
| 419 |
+
if 'Sim_Winner_Export' in st.session_state:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 420 |
st.download_button(
|
| 421 |
+
label="Export Full Frame",
|
| 422 |
+
data=st.session_state.Sim_Winner_Export.to_csv().encode('utf-8'),
|
| 423 |
+
file_name='MLB_consim_export.csv',
|
| 424 |
mime='text/csv',
|
| 425 |
+
)
|
| 426 |
+
tab1, tab2 = st.tabs(['Winning Frame Statistics', 'Flex Exposure Statistics'])
|
| 427 |
+
|
| 428 |
+
with tab1:
|
| 429 |
+
if 'Sim_Winner_Display' in st.session_state:
|
| 430 |
+
# Create a new dataframe with summary statistics
|
| 431 |
+
summary_df = pd.DataFrame({
|
| 432 |
+
'Metric': ['Min', 'Average', 'Max', 'STDdev'],
|
| 433 |
+
'Salary': [
|
| 434 |
+
st.session_state.Sim_Winner_Display['salary'].min(),
|
| 435 |
+
st.session_state.Sim_Winner_Display['salary'].mean(),
|
| 436 |
+
st.session_state.Sim_Winner_Display['salary'].max(),
|
| 437 |
+
st.session_state.Sim_Winner_Display['salary'].std()
|
| 438 |
+
],
|
| 439 |
+
'Proj': [
|
| 440 |
+
st.session_state.Sim_Winner_Display['proj'].min(),
|
| 441 |
+
st.session_state.Sim_Winner_Display['proj'].mean(),
|
| 442 |
+
st.session_state.Sim_Winner_Display['proj'].max(),
|
| 443 |
+
st.session_state.Sim_Winner_Display['proj'].std()
|
| 444 |
+
],
|
| 445 |
+
'Own': [
|
| 446 |
+
st.session_state.Sim_Winner_Display['Own'].min(),
|
| 447 |
+
st.session_state.Sim_Winner_Display['Own'].mean(),
|
| 448 |
+
st.session_state.Sim_Winner_Display['Own'].max(),
|
| 449 |
+
st.session_state.Sim_Winner_Display['Own'].std()
|
| 450 |
+
],
|
| 451 |
+
'Fantasy': [
|
| 452 |
+
st.session_state.Sim_Winner_Display['Fantasy'].min(),
|
| 453 |
+
st.session_state.Sim_Winner_Display['Fantasy'].mean(),
|
| 454 |
+
st.session_state.Sim_Winner_Display['Fantasy'].max(),
|
| 455 |
+
st.session_state.Sim_Winner_Display['Fantasy'].std()
|
| 456 |
+
],
|
| 457 |
+
'GPP_Proj': [
|
| 458 |
+
st.session_state.Sim_Winner_Display['GPP_Proj'].min(),
|
| 459 |
+
st.session_state.Sim_Winner_Display['GPP_Proj'].mean(),
|
| 460 |
+
st.session_state.Sim_Winner_Display['GPP_Proj'].max(),
|
| 461 |
+
st.session_state.Sim_Winner_Display['GPP_Proj'].std()
|
| 462 |
+
]
|
| 463 |
+
})
|
| 464 |
+
|
| 465 |
+
# Set the index of the summary dataframe as the "Metric" column
|
| 466 |
+
summary_df = summary_df.set_index('Metric')
|
| 467 |
+
|
| 468 |
+
# Display the summary dataframe
|
| 469 |
+
st.subheader("Winning Frame Statistics")
|
| 470 |
+
st.dataframe(summary_df.style.format({
|
| 471 |
+
'Salary': '{:.2f}',
|
| 472 |
+
'Proj': '{:.2f}',
|
| 473 |
+
'Fantasy': '{:.2f}',
|
| 474 |
+
'GPP_Proj': '{:.2f}'
|
| 475 |
+
}).background_gradient(cmap='RdYlGn', axis=0, subset=['Salary', 'Proj', 'Own', 'Fantasy', 'GPP_Proj']), use_container_width=True)
|
| 476 |
+
|
| 477 |
with tab2:
|
| 478 |
+
if 'Sim_Winner_Display' in st.session_state:
|
| 479 |
+
st.write("Yeah man that's crazy")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 480 |
|
| 481 |
+
else:
|
| 482 |
+
st.write("Simulation data or position mapping not available.")
|
| 483 |
+
with st.container():
|
| 484 |
+
tab1, tab2 = st.tabs(['Overall Exposures', 'Team Exposures'])
|
| 485 |
+
with tab1:
|
| 486 |
+
if 'player_freq' in st.session_state:
|
| 487 |
+
|
| 488 |
+
st.dataframe(st.session_state.player_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
|
| 489 |
+
st.download_button(
|
| 490 |
+
label="Export Exposures",
|
| 491 |
+
data=st.session_state.player_freq.to_csv().encode('utf-8'),
|
| 492 |
+
file_name='player_freq_export.csv',
|
| 493 |
+
mime='text/csv',
|
| 494 |
+
key='overall'
|
| 495 |
+
)
|
| 496 |
+
|
| 497 |
+
with tab2:
|
| 498 |
+
if 'team_freq' in st.session_state:
|
| 499 |
+
|
| 500 |
+
st.dataframe(st.session_state.team_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
|
| 501 |
+
st.download_button(
|
| 502 |
+
label="Export Exposures",
|
| 503 |
+
data=st.session_state.team_freq.to_csv().encode('utf-8'),
|
| 504 |
+
file_name='team_freq.csv',
|
| 505 |
+
mime='text/csv',
|
| 506 |
+
key='team'
|
| 507 |
+
)
|
| 508 |
|
| 509 |
if selected_tab == "Showdown Contest Sims":
|
| 510 |
dk_sd_raw, fd_sd_raw = init_SD_baselines('Showdown #1')
|