Spaces:
Running
Running
James McCool
Enhance baseline data handling in app.py by introducing conditional logic for DraftKings and FanDuel. This update assigns the appropriate raw data and column names based on the selected site, improving the accuracy and flexibility of contest simulations.
3fbcd23
import streamlit as st | |
st.set_page_config(layout="wide") | |
import numpy as np | |
import pandas as pd | |
import gspread | |
import pymongo | |
import time | |
def init_conn(): | |
uri = st.secrets['mongo_uri'] | |
client = pymongo.MongoClient(uri, retryWrites=True, serverSelectionTimeoutMS=500000) | |
return client | |
client = init_conn() | |
percentages_format = {'Exposure': '{:.2%}'} | |
freq_format = {'Exposure': '{:.2%}', 'Proj Own': '{:.2%}', 'Edge': '{:.2%}'} | |
dk_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'] | |
fd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'] | |
def init_DK_seed_frames(sport, split): | |
if sport == 'NFL': | |
db = client["NFL_Database"] | |
elif sport == 'NBA': | |
db = client["NBA_DFS"] | |
collection = db[f"DK_{sport}_SD_seed_frame"] | |
cursor = collection.find().limit(split) | |
raw_display = pd.DataFrame(list(cursor)) | |
raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']] | |
DK_seed = raw_display.to_numpy() | |
return DK_seed | |
def init_DK_secondary_seed_frames(sport, split): | |
if sport == 'NFL': | |
db = client["NFL_Database"] | |
elif sport == 'NBA': | |
db = client["NBA_DFS"] | |
collection = db[f"DK_{sport}_Secondary_SD_seed_frame"] | |
cursor = collection.find().limit(split) | |
raw_display = pd.DataFrame(list(cursor)) | |
raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']] | |
DK_second_seed = raw_display.to_numpy() | |
return DK_second_seed | |
def init_DK_auxiliary_seed_frames(sport, split): | |
if sport == 'NFL': | |
db = client["NFL_Database"] | |
elif sport == 'NBA': | |
db = client["NBA_DFS"] | |
collection = db[f"DK_{sport}_Auxiliary_SD_seed_frame"] | |
cursor = collection.find().limit(split) | |
raw_display = pd.DataFrame(list(cursor)) | |
raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']] | |
DK_auxiliary_seed = raw_display.to_numpy() | |
return DK_auxiliary_seed | |
def init_FD_seed_frames(sport, split): | |
if sport == 'NFL': | |
db = client["NFL_Database"] | |
elif sport == 'NBA': | |
db = client["NBA_DFS"] | |
collection = db[f"FD_{sport}_SD_seed_frame"] | |
cursor = collection.find().limit(split) | |
raw_display = pd.DataFrame(list(cursor)) | |
raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']] | |
FD_seed = raw_display.to_numpy() | |
return FD_seed | |
def init_FD_secondary_seed_frames(sport, split): | |
if sport == 'NFL': | |
db = client["NFL_Database"] | |
elif sport == 'NBA': | |
db = client["NBA_DFS"] | |
collection = db[f"FD_{sport}_Secondary_SD_seed_frame"] | |
cursor = collection.find().limit(split) | |
raw_display = pd.DataFrame(list(cursor)) | |
raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']] | |
FD_second_seed = raw_display.to_numpy() | |
return FD_second_seed | |
def init_FD_auxiliary_seed_frames(sport, split): | |
if sport == 'NFL': | |
db = client["NFL_Database"] | |
elif sport == 'NBA': | |
db = client["NBA_DFS"] | |
collection = db[f"FD_{sport}_Auxiliary_SD_seed_frame"] | |
cursor = collection.find().limit(split) | |
raw_display = pd.DataFrame(list(cursor)) | |
raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']] | |
FD_auxiliary_seed = raw_display.to_numpy() | |
return FD_auxiliary_seed | |
def init_baselines(sport): | |
if sport == 'NFL': | |
db = client["NFL_Database"] | |
collection = db['DK_SD_NFL_ROO'] | |
cursor = collection.find() | |
raw_display = pd.DataFrame(list(cursor)) | |
raw_display = raw_display[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', | |
'Own', 'Small_Field_Own', 'Large_Field_Own', 'Cash_Field_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_id', 'site']] | |
raw_display['Small_Field_Own'] = raw_display['Large_Field_Own'] | |
raw_display['small_CPT_Own_raw'] = (raw_display['Small_Field_Own'] / 2) * ((100 - (100-raw_display['Small_Field_Own']))/100) | |
small_cpt_own_var = 300 / raw_display['small_CPT_Own_raw'].sum() | |
raw_display['small_CPT_Own'] = raw_display['small_CPT_Own_raw'] * small_cpt_own_var | |
raw_display['cpt_Median'] = raw_display['Median'] * 1.25 | |
raw_display['STDev'] = raw_display['Median'] / 4 | |
raw_display['CPT_STDev'] = raw_display['cpt_Median'] / 4 | |
dk_raw = raw_display.dropna(subset=['Median']) | |
collection = db['FD_SD_NFL_ROO'] | |
cursor = collection.find() | |
raw_display = pd.DataFrame(list(cursor)) | |
raw_display = raw_display[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', | |
'Own', 'Small_Field_Own', 'Large_Field_Own', 'Cash_Field_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_id', 'site']] | |
raw_display['Small_Field_Own'] = raw_display['Large_Field_Own'] | |
raw_display['small_CPT_Own'] = raw_display['CPT_Own'] | |
raw_display['cpt_Median'] = raw_display['Median'] | |
raw_display['STDev'] = raw_display['Median'] / 4 | |
raw_display['CPT_STDev'] = raw_display['cpt_Median'] / 4 | |
fd_raw = raw_display.dropna(subset=['Median']) | |
elif sport == 'NBA': | |
db = client["NBA_DFS"] | |
collection = db['Player_SD_Range_Of_Outcomes'] | |
cursor = collection.find() | |
raw_display = pd.DataFrame(list(cursor)) | |
raw_display = raw_display[['Player', 'Minutes Proj', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%', | |
'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'ValX', 'site', 'version', 'slate', 'timestamp', 'player_id']] | |
raw_display = raw_display[raw_display['site'] == 'Draftkings'] | |
raw_display['Small_Field_Own'] = raw_display['Small_Own'] | |
raw_display['small_CPT_Own_raw'] = (raw_display['Small_Field_Own'] / 2) * ((100 - (100-raw_display['Small_Field_Own']))/100) | |
small_cpt_own_var = 300 / raw_display['small_CPT_Own_raw'].sum() | |
raw_display['small_CPT_Own'] = raw_display['small_CPT_Own_raw'] * small_cpt_own_var | |
raw_display['cpt_Median'] = raw_display['Median'] * 1.25 | |
raw_display['STDev'] = raw_display['Median'] / 4 | |
raw_display['CPT_STDev'] = raw_display['cpt_Median'] / 4 | |
dk_raw = raw_display.dropna(subset=['Median']) | |
collection = db['Player_SD_Range_Of_Outcomes'] | |
cursor = collection.find() | |
raw_display = pd.DataFrame(list(cursor)) | |
raw_display = raw_display[['Player', 'Minutes Proj', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%', | |
'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'ValX', 'site', 'version', 'slate', 'timestamp', 'player_id']] | |
raw_display = raw_display[raw_display['site'] == 'Fanduel'] | |
raw_display['Small_Field_Own'] = raw_display['Large_Own'] | |
raw_display['small_CPT_Own'] = raw_display['CPT_Own'] | |
raw_display['cpt_Median'] = raw_display['Median'] | |
raw_display['STDev'] = raw_display['Median'] / 4 | |
raw_display['CPT_STDev'] = raw_display['cpt_Median'] / 4 | |
fd_raw = raw_display.dropna(subset=['Median']) | |
return dk_raw, fd_raw | |
def convert_df(array): | |
array = pd.DataFrame(array, columns=column_names) | |
return array.to_csv().encode('utf-8') | |
def calculate_DK_value_frequencies(np_array): | |
unique, counts = np.unique(np_array[:, :6], return_counts=True) | |
frequencies = counts / len(np_array) # Normalize by the number of rows | |
combined_array = np.column_stack((unique, frequencies)) | |
return combined_array | |
def calculate_FD_value_frequencies(np_array): | |
unique, counts = np.unique(np_array[:, :5], return_counts=True) | |
frequencies = counts / len(np_array) # Normalize by the number of rows | |
combined_array = np.column_stack((unique, frequencies)) | |
return combined_array | |
def sim_contest(Sim_size, seed_frame, maps_dict, Contest_Size): | |
SimVar = 1 | |
Sim_Winners = [] | |
# Pre-vectorize functions | |
vec_projection_map = np.vectorize(maps_dict['Projection_map'].__getitem__) | |
vec_cpt_projection_map = np.vectorize(maps_dict['cpt_projection_map'].__getitem__) | |
vec_stdev_map = np.vectorize(maps_dict['STDev_map'].__getitem__) | |
vec_cpt_stdev_map = np.vectorize(maps_dict['cpt_STDev_map'].__getitem__) | |
st.write('Simulating contest on frames') | |
while SimVar <= Sim_size: | |
fp_random = seed_frame[np.random.choice(seed_frame.shape[0], Contest_Size)] | |
sample_arrays1 = np.c_[ | |
fp_random, | |
np.sum(np.random.normal( | |
loc=np.concatenate([ | |
vec_cpt_projection_map(fp_random[:, 0:1]), # Apply cpt_projection_map to first column | |
vec_projection_map(fp_random[:, 1:-7]) # Apply original projection to remaining columns | |
], axis=1), | |
scale=np.concatenate([ | |
vec_cpt_stdev_map(fp_random[:, 0:1]), # Apply cpt_projection_map to first column | |
vec_stdev_map(fp_random[:, 1:-7]) # Apply original projection to remaining columns | |
], axis=1)), | |
axis=1) | |
] | |
sample_arrays = sample_arrays1 | |
final_array = sample_arrays[sample_arrays[:, 7].argsort()[::-1]] | |
best_lineup = final_array[final_array[:, -1].argsort(kind='stable')[::-1][:1]] | |
Sim_Winners.append(best_lineup) | |
SimVar += 1 | |
return Sim_Winners | |
dk_raw, fd_raw = init_baselines('NFL') | |
tab1, tab2 = st.tabs(['Contest Sims', 'Data Export']) | |
with tab2: | |
col1, col2 = st.columns([1, 7]) | |
with col1: | |
if st.button("Load/Reset Data", key='reset1'): | |
st.cache_data.clear() | |
for key in st.session_state.keys(): | |
del st.session_state[key] | |
dk_raw, fd_raw = init_baselines('NFL') | |
sport_var1 = st.radio("What sport are you working with?", ('NFL', 'NBA'), key='sport_var1') | |
slate_var1 = st.radio("Which data are you loading?", ('Showdown', 'Secondary Showdown', 'Auxiliary Showdown'), key='slate_var1') | |
sharp_split_var = st.number_input("How many lineups do you want?", value=10000, max_value=500000, min_value=10000, step=10000) | |
site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'), key='site_var1') | |
if site_var1 == 'Draftkings': | |
team_var1 = st.radio("Do you want a frame with specific teams?", ('Full Slate', 'Specific Teams'), key='team_var1') | |
if team_var1 == 'Specific Teams': | |
team_var2 = st.multiselect('Which teams do you want?', options = dk_raw['Team'].unique()) | |
elif team_var1 == 'Full Slate': | |
team_var2 = dk_raw.Team.values.tolist() | |
stack_var1 = st.radio("Do you want a frame with specific stack sizes?", ('Full Slate', 'Specific Stack Sizes'), key='stack_var1') | |
if stack_var1 == 'Specific Stack Sizes': | |
stack_var2 = st.multiselect('Which stack sizes do you want?', options = [5, 4, 3, 2, 1, 0]) | |
elif stack_var1 == 'Full Slate': | |
stack_var2 = [5, 4, 3, 2, 1, 0] | |
elif site_var1 == 'Fanduel': | |
team_var1 = st.radio("Do you want a frame with specific teams?", ('Full Slate', 'Specific Teams'), key='team_var1') | |
if team_var1 == 'Specific Teams': | |
team_var2 = st.multiselect('Which teams do you want?', options = fd_raw['Team'].unique()) | |
elif team_var1 == 'Full Slate': | |
team_var2 = fd_raw.Team.values.tolist() | |
stack_var1 = st.radio("Do you want a frame with specific stack sizes?", ('Full Slate', 'Specific Stack Sizes'), key='stack_var1') | |
if stack_var1 == 'Specific Stack Sizes': | |
stack_var2 = st.multiselect('Which stack sizes do you want?', options = [4, 3, 2, 1, 0]) | |
elif stack_var1 == 'Full Slate': | |
stack_var2 = [4, 3, 2, 1, 0] | |
if st.button("Prepare data export", key='data_export'): | |
if 'working_seed' in st.session_state: | |
data_export = st.session_state.working_seed.copy() | |
elif 'working_seed' not in st.session_state: | |
if site_var1 == 'Draftkings': | |
if slate_var1 == 'Showdown': | |
st.session_state.working_seed = init_DK_seed_frames(sport_var1, sharp_split_var) | |
if sport_var1 == 'NFL': | |
export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id'])) | |
elif sport_var1 == 'NBA': | |
export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id'])) | |
elif slate_var1 == 'Secondary Showdown': | |
st.session_state.working_seed = init_DK_secondary_seed_frames(sport_var1, sharp_split_var) | |
if sport_var1 == 'NFL': | |
export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id'])) | |
elif sport_var1 == 'NBA': | |
export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id'])) | |
elif slate_var1 == 'Auxiliary Showdown': | |
st.session_state.working_seed = init_DK_auxiliary_seed_frames(sport_var1, sharp_split_var) | |
if sport_var1 == 'NFL': | |
export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id'])) | |
elif sport_var1 == 'NBA': | |
export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id'])) | |
raw_baselines = dk_raw | |
column_names = dk_columns | |
elif site_var1 == 'Fanduel': | |
if slate_var1 == 'Showdown': | |
st.session_state.working_seed = init_FD_seed_frames(sport_var1, sharp_split_var) | |
if sport_var1 == 'NFL': | |
export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id'])) | |
elif sport_var1 == 'NBA': | |
export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id'])) | |
elif slate_var1 == 'Secondary Showdown': | |
st.session_state.working_seed = init_FD_secondary_seed_frames(sport_var1, sharp_split_var) | |
if sport_var1 == 'NFL': | |
export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id'])) | |
elif sport_var1 == 'NBA': | |
export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id'])) | |
elif slate_var1 == 'Auxiliary Showdown': | |
st.session_state.working_seed = init_FD_auxiliary_seed_frames(sport_var1, sharp_split_var) | |
if sport_var1 == 'NFL': | |
export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id'])) | |
elif sport_var1 == 'NBA': | |
export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id'])) | |
raw_baselines = fd_raw | |
column_names = fd_columns | |
data_export = st.session_state.working_seed.copy() | |
for col in range(6): | |
data_export[:, col] = np.array([export_id_dict.get(x, x) for x in data_export[:, col]]) | |
st.download_button( | |
label="Export optimals set", | |
data=convert_df(data_export), | |
file_name='NFL_SD_optimals_export.csv', | |
mime='text/csv', | |
) | |
with col2: | |
if st.button("Load Data", key='load_data'): | |
if site_var1 == 'Draftkings': | |
if 'working_seed' in st.session_state: | |
st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 9], team_var2)] | |
st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 10], stack_var2)] | |
st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names) | |
elif 'working_seed' not in st.session_state: | |
if slate_var1 == 'Showdown': | |
st.session_state.working_seed = init_DK_seed_frames(sport_var1, sharp_split_var) | |
if sport_var1 == 'NFL': | |
export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id'])) | |
elif sport_var1 == 'NBA': | |
export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id'])) | |
elif slate_var1 == 'Secondary Showdown': | |
st.session_state.working_seed = init_DK_secondary_seed_frames(sport_var1, sharp_split_var) | |
if sport_var1 == 'NFL': | |
export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id'])) | |
elif sport_var1 == 'NBA': | |
export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id'])) | |
elif slate_var1 == 'Auxiliary Showdown': | |
st.session_state.working_seed = init_DK_auxiliary_seed_frames(sport_var1, sharp_split_var) | |
if sport_var1 == 'NFL': | |
export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id'])) | |
elif sport_var1 == 'NBA': | |
export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id'])) | |
st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 9], team_var2)] | |
st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 10], stack_var2)] | |
st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names) | |
elif site_var1 == 'Fanduel': | |
if 'working_seed' in st.session_state: | |
st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 8], team_var2)] | |
st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 9], stack_var2)] | |
st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names) | |
elif 'working_seed' not in st.session_state: | |
if slate_var1 == 'Showdown': | |
st.session_state.working_seed = init_FD_seed_frames(sport_var1, sharp_split_var) | |
if sport_var1 == 'NFL': | |
export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id'])) | |
elif sport_var1 == 'NBA': | |
export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id'])) | |
elif slate_var1 == 'Secondary Showdown': | |
st.session_state.working_seed = init_FD_secondary_seed_frames(sport_var1, sharp_split_var) | |
if sport_var1 == 'NFL': | |
export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id'])) | |
elif sport_var1 == 'NBA': | |
export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id'])) | |
elif slate_var1 == 'Auxiliary Showdown': | |
st.session_state.working_seed = init_FD_auxiliary_seed_frames(sport_var1, sharp_split_var) | |
if sport_var1 == 'NFL': | |
export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id'])) | |
elif sport_var1 == 'NBA': | |
export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id'])) | |
raw_baselines = fd_raw | |
column_names = fd_columns | |
st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 8], team_var2)] | |
st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 9], stack_var2)] | |
st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names) | |
with st.container(): | |
if 'data_export_display' in st.session_state: | |
st.dataframe(st.session_state.data_export_display.style.format(freq_format, precision=2), use_container_width = True) | |
with tab1: | |
col1, col2 = st.columns([1, 7]) | |
with col1: | |
if st.button("Load/Reset Data", key='reset2'): | |
st.cache_data.clear() | |
for key in st.session_state.keys(): | |
del st.session_state[key] | |
dk_raw, fd_raw = init_baselines('NFL') | |
sim_sport_var1 = st.radio("What sport are you working with?", ('NFL', 'NBA'), key='sim_sport_var1') | |
dk_raw, fd_raw = init_baselines(sim_sport_var1) | |
sim_slate_var1 = st.radio("Which data are you loading?", ('Showdown', 'Secondary Showdown', 'Auxiliary Showdown'), key='sim_slate_var1') | |
sim_site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'), key='sim_site_var1') | |
if sim_site_var1 == 'Draftkings': | |
raw_baselines = dk_raw | |
column_names = dk_columns | |
elif sim_site_var1 == 'Fanduel': | |
raw_baselines = fd_raw | |
column_names = fd_columns | |
contest_var1 = st.selectbox("What contest size are you simulating?", ('Small', 'Medium', 'Large', 'Custom')) | |
if contest_var1 == 'Small': | |
Contest_Size = 1000 | |
st.write("Small field size is 1,000 entrants.") | |
raw_baselines['Own'] = raw_baselines['Small_Field_Own'] | |
raw_baselines['CPT_Own'] = raw_baselines['small_CPT_Own'] | |
elif contest_var1 == 'Medium': | |
Contest_Size = 5000 | |
st.write("Medium field size is 5,000 entrants.") | |
elif contest_var1 == 'Large': | |
Contest_Size = 10000 | |
st.write("Large field size is 10,000 entrants.") | |
elif contest_var1 == 'Custom': | |
Contest_Size = st.number_input("Insert contest size", value=100, min_value=1, max_value=100000) | |
strength_var1 = st.selectbox("How sharp is the field in the contest?", ('Very', 'Above Average', 'Average', 'Below Average', 'Not Very')) | |
if strength_var1 == 'Not Very': | |
sharp_split = 500000 | |
elif strength_var1 == 'Below Average': | |
sharp_split = 400000 | |
elif strength_var1 == 'Average': | |
sharp_split = 300000 | |
elif strength_var1 == 'Above Average': | |
sharp_split = 200000 | |
elif strength_var1 == 'Very': | |
sharp_split = 100000 | |
with col2: | |
if st.button("Run Contest Sim"): | |
if 'working_seed' in st.session_state: | |
maps_dict = { | |
'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)), | |
'cpt_projection_map':dict(zip(raw_baselines.Player,raw_baselines.cpt_Median)), | |
'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)), | |
'Pos_map':dict(zip(raw_baselines.Player,raw_baselines.Position)), | |
'Own_map':dict(zip(raw_baselines.Player,raw_baselines['Own'])), | |
'cpt_Own_map':dict(zip(raw_baselines.Player,raw_baselines['CPT_Own'])), | |
'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)), | |
'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev)), | |
'cpt_STDev_map':dict(zip(raw_baselines.Player,raw_baselines['CPT_STDev'])) | |
} | |
Sim_Winners = sim_contest(1000, st.session_state.working_seed, maps_dict, Contest_Size) | |
Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners)) | |
#st.table(Sim_Winner_Frame) | |
# Initial setup | |
Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=column_names + ['Fantasy']) | |
Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['proj'] + Sim_Winner_Frame['Fantasy']) / 2 | |
Sim_Winner_Frame['unique_id'] = Sim_Winner_Frame['proj'].astype(str) + Sim_Winner_Frame['salary'].astype(str) + Sim_Winner_Frame['Team'].astype(str) + Sim_Winner_Frame['Secondary'].astype(str) | |
Sim_Winner_Frame = Sim_Winner_Frame.assign(win_count=Sim_Winner_Frame['unique_id'].map(Sim_Winner_Frame['unique_id'].value_counts())) | |
# Type Casting | |
type_cast_dict = {'salary': int, 'proj': np.float16, 'Fantasy': np.float16, 'GPP_Proj': np.float32, 'Own': np.float32} | |
Sim_Winner_Frame = Sim_Winner_Frame.astype(type_cast_dict) | |
# Sorting | |
st.session_state.Sim_Winner_Frame = Sim_Winner_Frame.sort_values(by=['win_count', 'GPP_Proj'], ascending= [False, False]).copy().drop_duplicates(subset='unique_id').head(100) | |
st.session_state.Sim_Winner_Frame.drop(columns='unique_id', inplace=True) | |
# Data Copying | |
st.session_state.Sim_Winner_Export = Sim_Winner_Frame.copy() | |
# Data Copying | |
st.session_state.Sim_Winner_Display = Sim_Winner_Frame.copy() | |
else: | |
if sim_site_var1 == 'Draftkings': | |
if sim_slate_var1 == 'Showdown': | |
st.session_state.working_seed = init_DK_seed_frames(sim_sport_var1, sharp_split_var) | |
if sport_var1 == 'NFL': | |
export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id'])) | |
elif sport_var1 == 'NBA': | |
export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id'])) | |
elif sim_slate_var1 == 'Secondary Showdown': | |
st.session_state.working_seed = init_DK_secondary_seed_frames(sim_sport_var1, sharp_split_var) | |
if sport_var1 == 'NFL': | |
export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id'])) | |
elif sport_var1 == 'NBA': | |
export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id'])) | |
elif sim_slate_var1 == 'Auxiliary Showdown': | |
st.session_state.working_seed = init_DK_auxiliary_seed_frames(sim_sport_var1, sharp_split_var) | |
if sport_var1 == 'NFL': | |
export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id'])) | |
elif sport_var1 == 'NBA': | |
export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id'])) | |
raw_baselines = dk_raw | |
column_names = dk_columns | |
elif sim_site_var1 == 'Fanduel': | |
if sim_slate_var1 == 'Showdown': | |
st.session_state.working_seed = init_FD_seed_frames(sim_sport_var1, sharp_split_var) | |
if sport_var1 == 'NFL': | |
export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id'])) | |
elif sport_var1 == 'NBA': | |
export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id'])) | |
elif sim_slate_var1 == 'Secondary Showdown': | |
st.session_state.working_seed = init_FD_secondary_seed_frames(sim_sport_var1, sharp_split_var) | |
if sport_var1 == 'NFL': | |
export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id'])) | |
elif sport_var1 == 'NBA': | |
export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id'])) | |
elif sim_slate_var1 == 'Auxiliary Showdown': | |
st.session_state.working_seed = init_FD_auxiliary_seed_frames(sim_sport_var1, sharp_split_var) | |
if sport_var1 == 'NFL': | |
export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id'])) | |
elif sport_var1 == 'NBA': | |
export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id'])) | |
raw_baselines = fd_raw | |
column_names = fd_columns | |
maps_dict = { | |
'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)), | |
'cpt_projection_map':dict(zip(raw_baselines.Player,raw_baselines.cpt_Median)), | |
'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)), | |
'Pos_map':dict(zip(raw_baselines.Player,raw_baselines.Position)), | |
'Own_map':dict(zip(raw_baselines.Player,raw_baselines['Own'])), | |
'cpt_Own_map':dict(zip(raw_baselines.Player,raw_baselines['CPT_Own'])), | |
'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)), | |
'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev)), | |
'cpt_STDev_map':dict(zip(raw_baselines.Player,raw_baselines['CPT_STDev'])) | |
} | |
Sim_Winners = sim_contest(1000, st.session_state.working_seed, maps_dict, Contest_Size) | |
Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners)) | |
#st.table(Sim_Winner_Frame) | |
# Initial setup | |
Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=column_names + ['Fantasy']) | |
Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['proj'] + Sim_Winner_Frame['Fantasy']) / 2 | |
Sim_Winner_Frame['unique_id'] = Sim_Winner_Frame['proj'].astype(str) + Sim_Winner_Frame['salary'].astype(str) + Sim_Winner_Frame['Team'].astype(str) + Sim_Winner_Frame['Secondary'].astype(str) | |
# Add percent rank columns for ownership at each roster position | |
# Calculate Dupes column for Fanduel | |
if sim_site_var1 == 'Fanduel': | |
dup_count_columns = ['CPT_Own_percent_rank', 'FLEX1_Own_percent_rank', 'FLEX2_Own_percent_rank', 'FLEX3_Own_percent_rank', 'FLEX4_Own_percent_rank'] | |
own_columns = ['CPT_Own', 'FLEX1_Own', 'FLEX2_Own', 'FLEX3_Own', 'FLEX4_Own'] | |
calc_columns = ['own_product', 'avg_own_rank', 'dupes_calc'] | |
Sim_Winner_Frame['CPT_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,0].map(maps_dict['cpt_Own_map']).rank(pct=True) | |
Sim_Winner_Frame['FLEX1_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,1].map(maps_dict['Own_map']).rank(pct=True) | |
Sim_Winner_Frame['FLEX2_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,2].map(maps_dict['Own_map']).rank(pct=True) | |
Sim_Winner_Frame['FLEX3_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,3].map(maps_dict['Own_map']).rank(pct=True) | |
Sim_Winner_Frame['FLEX4_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,4].map(maps_dict['Own_map']).rank(pct=True) | |
Sim_Winner_Frame['CPT_Own'] = Sim_Winner_Frame.iloc[:,0].map(maps_dict['cpt_Own_map']) / 100 | |
Sim_Winner_Frame['FLEX1_Own'] = Sim_Winner_Frame.iloc[:,1].map(maps_dict['Own_map']) / 100 | |
Sim_Winner_Frame['FLEX2_Own'] = Sim_Winner_Frame.iloc[:,2].map(maps_dict['Own_map']) / 100 | |
Sim_Winner_Frame['FLEX3_Own'] = Sim_Winner_Frame.iloc[:,3].map(maps_dict['Own_map']) / 100 | |
Sim_Winner_Frame['FLEX4_Own'] = Sim_Winner_Frame.iloc[:,4].map(maps_dict['Own_map']) / 100 | |
# Calculate ownership product and convert to probability | |
Sim_Winner_Frame['own_product'] = (Sim_Winner_Frame[own_columns].product(axis=1)) + 0.0001 | |
# Calculate average of ownership percent rank columns | |
Sim_Winner_Frame['avg_own_rank'] = Sim_Winner_Frame[dup_count_columns].mean(axis=1) | |
# Calculate dupes formula | |
Sim_Winner_Frame['dupes_calc'] = ((Sim_Winner_Frame['own_product'] * Sim_Winner_Frame['avg_own_rank']) * (Contest_Size * 1.5)) + ((Sim_Winner_Frame['salary'] - 59800) / 100) | |
# Round and handle negative values | |
Sim_Winner_Frame['Dupes'] = np.where( | |
np.round(Sim_Winner_Frame['dupes_calc'], 0) <= 0, | |
0, | |
np.round(Sim_Winner_Frame['dupes_calc'], 0) - 1 | |
) | |
Sim_Winner_Frame['Dupes'] = (Sim_Winner_Frame['Dupes'] * (500000 / sharp_split)) / 2 | |
elif sim_site_var1 == 'Draftkings': | |
dup_count_columns = ['CPT_Own_percent_rank', 'FLEX1_Own_percent_rank', 'FLEX2_Own_percent_rank', 'FLEX3_Own_percent_rank', 'FLEX4_Own_percent_rank', 'FLEX5_Own_percent_rank'] | |
own_columns = ['CPT_Own', 'FLEX1_Own', 'FLEX2_Own', 'FLEX3_Own', 'FLEX4_Own', 'FLEX5_Own'] | |
calc_columns = ['own_product', 'avg_own_rank', 'dupes_calc'] | |
Sim_Winner_Frame['CPT_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,0].map(maps_dict['cpt_Own_map']).rank(pct=True) | |
Sim_Winner_Frame['FLEX1_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,1].map(maps_dict['Own_map']).rank(pct=True) | |
Sim_Winner_Frame['FLEX2_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,2].map(maps_dict['Own_map']).rank(pct=True) | |
Sim_Winner_Frame['FLEX3_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,3].map(maps_dict['Own_map']).rank(pct=True) | |
Sim_Winner_Frame['FLEX4_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,4].map(maps_dict['Own_map']).rank(pct=True) | |
Sim_Winner_Frame['FLEX5_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,5].map(maps_dict['Own_map']).rank(pct=True) | |
Sim_Winner_Frame['CPT_Own'] = Sim_Winner_Frame.iloc[:,0].map(maps_dict['cpt_Own_map']) / 100 | |
Sim_Winner_Frame['FLEX1_Own'] = Sim_Winner_Frame.iloc[:,1].map(maps_dict['Own_map']) / 100 | |
Sim_Winner_Frame['FLEX2_Own'] = Sim_Winner_Frame.iloc[:,2].map(maps_dict['Own_map']) / 100 | |
Sim_Winner_Frame['FLEX3_Own'] = Sim_Winner_Frame.iloc[:,3].map(maps_dict['Own_map']) / 100 | |
Sim_Winner_Frame['FLEX4_Own'] = Sim_Winner_Frame.iloc[:,4].map(maps_dict['Own_map']) / 100 | |
Sim_Winner_Frame['FLEX5_Own'] = Sim_Winner_Frame.iloc[:,5].map(maps_dict['Own_map']) / 100 | |
# Calculate ownership product and convert to probability | |
Sim_Winner_Frame['own_product'] = (Sim_Winner_Frame[own_columns].product(axis=1)) | |
# Calculate average of ownership percent rank columns | |
Sim_Winner_Frame['avg_own_rank'] = Sim_Winner_Frame[dup_count_columns].mean(axis=1) | |
# Calculate dupes formula | |
Sim_Winner_Frame['dupes_calc'] = ((Sim_Winner_Frame['own_product'] * Sim_Winner_Frame['avg_own_rank']) * (Contest_Size * 1.5)) + ((Sim_Winner_Frame['salary'] - 49800) / 100) | |
# Round and handle negative values | |
Sim_Winner_Frame['Dupes'] = np.where( | |
np.round(Sim_Winner_Frame['dupes_calc'], 0) <= 0, | |
0, | |
np.round(Sim_Winner_Frame['dupes_calc'], 0) - 1 | |
) | |
Sim_Winner_Frame['Dupes'] = (Sim_Winner_Frame['Dupes'] * (500000 / sharp_split)) / 2 | |
Sim_Winner_Frame['Dupes'] = np.round(Sim_Winner_Frame['Dupes'], 0) | |
Sim_Winner_Frame['Dupes'] = np.where( | |
np.round(Sim_Winner_Frame['dupes_calc'], 0) <= 0, | |
0, | |
np.round(Sim_Winner_Frame['dupes_calc'], 0) | |
) | |
Sim_Winner_Frame = Sim_Winner_Frame.drop(columns=dup_count_columns) | |
Sim_Winner_Frame = Sim_Winner_Frame.drop(columns=own_columns) | |
Sim_Winner_Frame = Sim_Winner_Frame.drop(columns=calc_columns) | |
Sim_Winner_Frame = Sim_Winner_Frame.assign(win_count=Sim_Winner_Frame['unique_id'].map(Sim_Winner_Frame['unique_id'].value_counts())) | |
# Type Casting | |
type_cast_dict = {'salary': int, 'proj': np.float16, 'Fantasy': np.float16, 'GPP_Proj': np.float32, 'Own': np.float32, 'Dupes': int} | |
Sim_Winner_Frame = Sim_Winner_Frame.astype(type_cast_dict) | |
# Sorting | |
st.session_state.Sim_Winner_Frame = Sim_Winner_Frame.sort_values(by=['win_count', 'GPP_Proj'], ascending= [False, False]).copy().drop_duplicates(subset='unique_id').head(100) | |
st.session_state.Sim_Winner_Frame.drop(columns='unique_id', inplace=True) | |
# Data Copying | |
st.session_state.Sim_Winner_Export = Sim_Winner_Frame.copy() | |
st.session_state.Sim_Winner_Export.iloc[:, 0:6] = st.session_state.Sim_Winner_Export.iloc[:, 0:6].apply(lambda x: x.map(export_id_dict)) | |
# Data Copying | |
st.session_state.Sim_Winner_Display = Sim_Winner_Frame.copy() | |
freq_copy = st.session_state.Sim_Winner_Display | |
if sim_site_var1 == 'Draftkings': | |
freq_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,0:6].values, return_counts=True)), | |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True) | |
elif sim_site_var1 == 'Fanduel': | |
freq_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,0:5].values, return_counts=True)), | |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True) | |
freq_working['Freq'] = freq_working['Freq'].astype(int) | |
freq_working['Position'] = freq_working['Player'].map(maps_dict['Pos_map']) | |
if sim_site_var1 == 'Draftkings': | |
if sim_sport_var1 == 'NFL': | |
freq_working['Salary'] = freq_working['Player'].map(maps_dict['Salary_map']) / 1.5 | |
elif sim_sport_var1 == 'NBA': | |
freq_working['Salary'] = freq_working['Player'].map(maps_dict['Salary_map']) | |
elif sim_site_var1 == 'Fanduel': | |
freq_working['Salary'] = freq_working['Player'].map(maps_dict['Salary_map']) | |
freq_working['Proj Own'] = freq_working['Player'].map(maps_dict['Own_map']) / 100 | |
freq_working['Exposure'] = freq_working['Freq']/(1000) | |
freq_working['Edge'] = freq_working['Exposure'] - freq_working['Proj Own'] | |
freq_working['Team'] = freq_working['Player'].map(maps_dict['Team_map']) | |
st.session_state.player_freq = freq_working.copy() | |
if sim_site_var1 == 'Draftkings': | |
cpt_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,0:1].values, return_counts=True)), | |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True) | |
elif sim_site_var1 == 'Fanduel': | |
cpt_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,0:1].values, return_counts=True)), | |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True) | |
cpt_working['Freq'] = cpt_working['Freq'].astype(int) | |
cpt_working['Position'] = cpt_working['Player'].map(maps_dict['Pos_map']) | |
if sim_sport_var1 == 'NFL': | |
cpt_working['Salary'] = cpt_working['Player'].map(maps_dict['Salary_map']) | |
elif sim_sport_var1 == 'NBA': | |
cpt_working['Salary'] = cpt_working['Player'].map(maps_dict['Salary_map']) * 1.5 | |
cpt_working['Proj Own'] = cpt_working['Player'].map(maps_dict['cpt_Own_map']) / 100 | |
cpt_working['Exposure'] = cpt_working['Freq']/(1000) | |
cpt_working['Edge'] = cpt_working['Exposure'] - cpt_working['Proj Own'] | |
cpt_working['Team'] = cpt_working['Player'].map(maps_dict['Team_map']) | |
st.session_state.sp_freq = cpt_working.copy() | |
if sim_site_var1 == 'Draftkings': | |
flex_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,1:6].values, return_counts=True)), | |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True) | |
cpt_own_div = 600 | |
elif sim_site_var1 == 'Fanduel': | |
flex_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,1:5].values, return_counts=True)), | |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True) | |
cpt_own_div = 500 | |
flex_working['Freq'] = flex_working['Freq'].astype(int) | |
flex_working['Position'] = flex_working['Player'].map(maps_dict['Pos_map']) | |
if sim_site_var1 == 'Draftkings': | |
if sim_sport_var1 == 'NFL': | |
flex_working['Salary'] = flex_working['Player'].map(maps_dict['Salary_map']) / 1.5 | |
elif sim_sport_var1 == 'NBA': | |
flex_working['Salary'] = flex_working['Player'].map(maps_dict['Salary_map']) | |
elif sim_site_var1 == 'Fanduel': | |
flex_working['Salary'] = flex_working['Player'].map(maps_dict['Salary_map']) | |
flex_working['Proj Own'] = (flex_working['Player'].map(maps_dict['Own_map']) / 100) - (flex_working['Player'].map(maps_dict['cpt_Own_map']) / 100) | |
flex_working['Exposure'] = flex_working['Freq']/(1000) | |
flex_working['Edge'] = flex_working['Exposure'] - flex_working['Proj Own'] | |
flex_working['Team'] = flex_working['Player'].map(maps_dict['Team_map']) | |
st.session_state.flex_freq = flex_working.copy() | |
if sim_site_var1 == 'Draftkings': | |
team_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,8:9].values, return_counts=True)), | |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True) | |
elif sim_site_var1 == 'Fanduel': | |
team_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,7:8].values, return_counts=True)), | |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True) | |
team_working['Freq'] = team_working['Freq'].astype(int) | |
team_working['Exposure'] = team_working['Freq']/(1000) | |
st.session_state.team_freq = team_working.copy() | |
with st.container(): | |
if st.button("Reset Sim", key='reset_sim'): | |
for key in st.session_state.keys(): | |
del st.session_state[key] | |
if 'player_freq' in st.session_state: | |
player_split_var2 = st.radio("Are you wanting to isolate any lineups with specific players?", ('Full Players', 'Specific Players'), key='player_split_var2') | |
if player_split_var2 == 'Specific Players': | |
find_var2 = st.multiselect('Which players must be included in the lineups?', options = st.session_state.player_freq['Player'].unique()) | |
elif player_split_var2 == 'Full Players': | |
find_var2 = st.session_state.player_freq.Player.values.tolist() | |
if player_split_var2 == 'Specific Players': | |
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)] | |
if player_split_var2 == 'Full Players': | |
st.session_state.Sim_Winner_Display = st.session_state.Sim_Winner_Frame | |
if 'Sim_Winner_Display' in st.session_state: | |
st.dataframe(st.session_state.Sim_Winner_Display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), use_container_width = True) | |
if 'Sim_Winner_Export' in st.session_state: | |
st.download_button( | |
label="Export Full Frame", | |
data=st.session_state.Sim_Winner_Export.to_csv().encode('utf-8'), | |
file_name='NFL_SD_consim_export.csv', | |
mime='text/csv', | |
) | |
with st.container(): | |
tab1, tab2, tab3, tab4 = st.tabs(['Overall Exposures', 'CPT Exposures', 'FLEX Exposures', 'Team Exposures']) | |
with tab1: | |
if 'player_freq' in st.session_state: | |
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) | |
st.download_button( | |
label="Export Exposures", | |
data=st.session_state.player_freq.to_csv().encode('utf-8'), | |
file_name='player_freq_export.csv', | |
mime='text/csv', | |
key='overall' | |
) | |
with tab2: | |
if 'sp_freq' in st.session_state: | |
st.dataframe(st.session_state.sp_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True) | |
st.download_button( | |
label="Export Exposures", | |
data=st.session_state.sp_freq.to_csv().encode('utf-8'), | |
file_name='cpt_freq.csv', | |
mime='text/csv', | |
key='sp' | |
) | |
with tab3: | |
if 'flex_freq' in st.session_state: | |
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) | |
st.download_button( | |
label="Export Exposures", | |
data=st.session_state.flex_freq.to_csv().encode('utf-8'), | |
file_name='flex_freq.csv', | |
mime='text/csv', | |
key='flex' | |
) | |
with tab4: | |
if 'team_freq' in st.session_state: | |
st.dataframe(st.session_state.team_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(percentages_format, precision=2), use_container_width = True) | |
st.download_button( | |
label="Export Exposures", | |
data=st.session_state.team_freq.to_csv().encode('utf-8'), | |
file_name='team_freq.csv', | |
mime='text/csv', | |
key='team' | |
) |