Spaces:
Running
Running
James McCool
Enhance data export functionality in app.py: Introduced export_column_var to dynamically set export column indices for specific player selections in both DraftKings and FanDuel contexts. This change improves the flexibility of data handling in session state management.
bf45afd
import streamlit as st | |
st.set_page_config(layout="wide") | |
import numpy as np | |
import pandas as pd | |
import pymongo | |
import time | |
def init_conn(): | |
uri = st.secrets['mongo_uri'] | |
client = pymongo.MongoClient(uri, retryWrites=True, serverSelectionTimeoutMS=500000) | |
db = client["NBA_DFS"] | |
return db | |
db = init_conn() | |
percentages_format = {'Exposure': '{:.2%}'} | |
freq_format = {'Proj Own': '{:.2%}', 'Exposure': '{:.2%}', 'Edge': '{:.2%}'} | |
dk_columns = ['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'] | |
fd_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C1', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'] | |
def init_DK_seed_frames(load_size): | |
collection = db["DK_NBA_seed_frame"] | |
cursor = collection.find().limit(load_size) | |
raw_display = pd.DataFrame(list(cursor)) | |
raw_display = raw_display[['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']] | |
DK_seed = raw_display.to_numpy() | |
return DK_seed | |
def init_DK_secondary_seed_frames(load_size): | |
collection = db["DK_NBA_Secondary_seed_frame"] | |
cursor = collection.find().limit(load_size) | |
raw_display = pd.DataFrame(list(cursor)) | |
raw_display = raw_display[['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']] | |
DK_seed = raw_display.to_numpy() | |
return DK_seed | |
def init_FD_seed_frames(load_size): | |
collection = db["FD_NBA_seed_frame"] | |
cursor = collection.find().limit(load_size) | |
raw_display = pd.DataFrame(list(cursor)) | |
raw_display = raw_display[['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C1', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']] | |
FD_seed = raw_display.to_numpy() | |
return FD_seed | |
def init_FD_secondary_seed_frames(load_size): | |
collection = db["FD_NBA_Secondary_seed_frame"] | |
cursor = collection.find().limit(load_size) | |
raw_display = pd.DataFrame(list(cursor)) | |
raw_display = raw_display[['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C1', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']] | |
FD_seed = raw_display.to_numpy() | |
return FD_seed | |
def init_baselines(): | |
collection = db["Player_Range_Of_Outcomes"] | |
cursor = collection.find() | |
load_display = pd.DataFrame(list(cursor)) | |
load_display.replace('', np.nan, inplace=True) | |
load_display.rename(columns={"Fantasy": "Median", 'Name': 'Player', 'player_ID': 'player_id'}, inplace = True) | |
load_display = load_display[load_display['Median'] > 0] | |
dk_roo_raw = load_display[load_display['site'] == 'Draftkings'] | |
dk_roo_raw = dk_roo_raw[dk_roo_raw['slate'] == 'Main Slate'] | |
dk_roo_raw['STDev'] = dk_roo_raw['Median'] / 4 | |
dk_raw = dk_roo_raw.dropna(subset=['Median']) | |
fd_roo_raw = load_display[load_display['site'] == 'Fanduel'] | |
fd_roo_raw = fd_roo_raw[fd_roo_raw['slate'] == 'Main Slate'] | |
fd_roo_raw['STDev'] = fd_roo_raw['Median'] / 4 | |
fd_raw = fd_roo_raw.dropna(subset=['Median']) | |
dk_secondary_roo_raw = load_display[load_display['site'] == 'Draftkings'] | |
dk_secondary_roo_raw = dk_secondary_roo_raw[dk_secondary_roo_raw['slate'] == 'Secondary Slate'] | |
dk_secondary_roo_raw['STDev'] = dk_secondary_roo_raw['Median'] / 4 | |
dk_secondary = dk_secondary_roo_raw.dropna(subset=['Median']) | |
fd_secondary_roo_raw = load_display[load_display['site'] == 'Fanduel'] | |
fd_secondary_roo_raw = fd_secondary_roo_raw[fd_secondary_roo_raw['slate'] == 'Secondary Slate'] | |
fd_secondary_roo_raw['STDev'] = fd_secondary_roo_raw['Median'] / 4 | |
fd_secondary = fd_secondary_roo_raw.dropna(subset=['Median']) | |
return dk_raw, fd_raw, dk_secondary, fd_secondary | |
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[:, :8], 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[:, :9], 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_stdev_map = np.vectorize(maps_dict['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=vec_projection_map(fp_random[:, :-7]), | |
scale=vec_stdev_map(fp_random[:, :-7])), | |
axis=1) | |
] | |
sample_arrays = sample_arrays1 | |
if sim_site_var1 == 'Draftkings': | |
final_array = sample_arrays[sample_arrays[:, 9].argsort()[::-1]] | |
elif sim_site_var1 == 'Fanduel': | |
final_array = sample_arrays[sample_arrays[:, 10].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, dk_secondary, fd_secondary = init_baselines() | |
dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id)) | |
fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id)) | |
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_seed = init_DK_seed_frames(10000) | |
FD_seed = init_FD_seed_frames(10000) | |
DK_secondary = init_DK_secondary_seed_frames(10000) | |
FD_secondary = init_FD_secondary_seed_frames(10000) | |
dk_raw, fd_raw, dk_secondary, fd_secondary = init_baselines() | |
dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id)) | |
fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id)) | |
slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate'), key='slate_var1') | |
site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'), key='site_var1') | |
sharp_split_var = st.number_input("How many lineups do you want?", value=10000, max_value=500000, min_value=10000, step=10000) | |
lineup_num_var = st.number_input("How many lineups do you want to display?", min_value=1, max_value=500, value=10, step=1) | |
if site_var1 == 'Draftkings': | |
player_var1 = st.radio("Do you want a frame with specific Players?", ('Full Slate', 'Specific Players'), key='player_var1') | |
if player_var1 == 'Specific Players': | |
player_var2 = st.multiselect('Which players do you want?', options = dk_raw['Player'].unique()) | |
elif player_var1 == 'Full Slate': | |
player_var2 = dk_raw.Player.values.tolist() | |
raw_baselines = dk_raw | |
column_names = dk_columns | |
elif site_var1 == 'Fanduel': | |
player_var1 = st.radio("Do you want a frame with specific Players?", ('Full Slate', 'Specific Players'), key='player_var1') | |
if player_var1 == 'Specific Players': | |
player_var2 = st.multiselect('Which players do you want?', options = fd_raw['Player'].unique()) | |
elif player_var1 == 'Full Slate': | |
player_var2 = fd_raw.Player.values.tolist() | |
raw_baselines = fd_raw | |
column_names = fd_columns | |
if st.button("Prepare data export", key='data_export'): | |
if site_var1 == 'Draftkings': | |
if 'working_seed' in st.session_state: | |
st.session_state.working_seed = st.session_state.working_seed | |
if player_var1 == 'Specific Players': | |
st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)] | |
st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names) | |
export_column_var = 8 | |
elif 'working_seed' not in st.session_state: | |
if slate_var1 == 'Main Slate': | |
st.session_state.working_seed = init_DK_seed_frames(sharp_split_var) | |
dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id)) | |
raw_baselines = dk_raw | |
column_names = dk_columns | |
elif slate_var1 == 'Secondary Slate': | |
st.session_state.working_seed = init_DK_secondary_seed_frames(sharp_split_var) | |
dk_id_dict = dict(zip(dk_secondary.Player, dk_secondary.player_id)) | |
raw_baselines = dk_secondary | |
column_names = dk_columns | |
if player_var1 == 'Specific Players': | |
st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)] | |
st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names) | |
export_column_var = 8 | |
data_export = st.session_state.data_export_display.copy() | |
for col in range(export_column_var): | |
data_export[:, col] = np.array([dk_id_dict.get(x, x) for x in data_export[:, col]]) | |
elif site_var1 == 'Fanduel': | |
if 'working_seed' in st.session_state: | |
st.session_state.working_seed = st.session_state.working_seed | |
if player_var1 == 'Specific Players': | |
st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)] | |
st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names) | |
export_column_var = 9 | |
elif 'working_seed' not in st.session_state: | |
if slate_var1 == 'Main Slate': | |
st.session_state.working_seed = init_FD_seed_frames(sharp_split_var) | |
fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id)) | |
raw_baselines = fd_raw | |
column_names = fd_columns | |
elif slate_var1 == 'Secondary Slate': | |
st.session_state.working_seed = init_FD_secondary_seed_frames(sharp_split_var) | |
fd_id_dict = dict(zip(fd_secondary.Player, fd_secondary.player_id)) | |
raw_baselines = fd_secondary | |
column_names = fd_columns | |
if player_var1 == 'Specific Players': | |
st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)] | |
st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names) | |
export_column_var = 9 | |
data_export = st.session_state.data_export_display.copy() | |
for col in range(export_column_var): | |
data_export[:, col] = np.array([fd_id_dict.get(x, x) for x in fd_id_dict[:, col]]) | |
st.download_button( | |
label="Export optimals set", | |
data=convert_df(data_export), | |
file_name='NBA_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 | |
if player_var1 == 'Specific Players': | |
st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)] | |
st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names) | |
elif 'working_seed' not in st.session_state: | |
if slate_var1 == 'Main Slate': | |
st.session_state.working_seed = init_DK_seed_frames(sharp_split_var) | |
dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id)) | |
raw_baselines = dk_raw | |
column_names = dk_columns | |
elif slate_var1 == 'Secondary Slate': | |
st.session_state.working_seed = init_DK_secondary_seed_frames(sharp_split_var) | |
dk_id_dict = dict(zip(dk_secondary.Player, dk_secondary.player_id)) | |
raw_baselines = dk_secondary | |
column_names = dk_columns | |
if player_var1 == 'Specific Players': | |
st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)] | |
st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names) | |
elif site_var1 == 'Fanduel': | |
if 'working_seed' in st.session_state: | |
st.session_state.working_seed = st.session_state.working_seed | |
if player_var1 == 'Specific Players': | |
st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)] | |
st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names) | |
elif 'working_seed' not in st.session_state: | |
if slate_var1 == 'Main Slate': | |
st.session_state.working_seed = init_FD_seed_frames(sharp_split_var) | |
fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id)) | |
raw_baselines = fd_raw | |
column_names = fd_columns | |
elif slate_var1 == 'Secondary Slate': | |
st.session_state.working_seed = init_FD_secondary_seed_frames(sharp_split_var) | |
fd_id_dict = dict(zip(fd_secondary.Player, fd_secondary.player_id)) | |
raw_baselines = fd_secondary | |
column_names = fd_columns | |
if player_var1 == 'Specific Players': | |
st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)] | |
st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names) | |
if 'data_export_display' in st.session_state: | |
st.dataframe(st.session_state.data_export_display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), height=500, 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_seed = init_DK_seed_frames(10000) | |
FD_seed = init_FD_seed_frames(10000) | |
DK_secondary = init_DK_secondary_seed_frames(10000) | |
FD_secondary = init_FD_secondary_seed_frames(10000) | |
dk_raw, fd_raw, dk_secondary, fd_secondary = init_baselines() | |
dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id)) | |
fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id)) | |
sim_slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate'), key='sim_slate_var1') | |
sim_site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'), key='sim_site_var1') | |
contest_var1 = st.selectbox("What contest size are you simulating?", ('Small', 'Medium', 'Large', 'Custom')) | |
if contest_var1 == 'Small': | |
Contest_Size = 1000 | |
elif contest_var1 == 'Medium': | |
Contest_Size = 5000 | |
elif contest_var1 == 'Large': | |
Contest_Size = 10000 | |
elif contest_var1 == 'Custom': | |
Contest_Size = st.number_input("Insert contest size", value=100, min_value=100, max_value=100000, step=50) | |
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: | |
st.session_state.maps_dict = { | |
'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.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'])), | |
'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)), | |
'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev)) | |
} | |
Sim_Winners = sim_contest(1000, st.session_state.working_seed, st.session_state.maps_dict, Contest_Size) | |
Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners)) | |
# 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 == 'Main Slate': | |
st.session_state.working_seed = init_DK_seed_frames(sharp_split) | |
dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id)) | |
raw_baselines = dk_raw | |
column_names = dk_columns | |
elif sim_slate_var1 == 'Secondary Slate': | |
st.session_state.working_seed = init_DK_secondary_seed_frames(sharp_split) | |
dk_id_dict = dict(zip(dk_secondary.Player, dk_secondary.player_id)) | |
raw_baselines = dk_secondary | |
column_names = dk_columns | |
elif sim_site_var1 == 'Fanduel': | |
if sim_slate_var1 == 'Main Slate': | |
st.session_state.working_seed = init_FD_seed_frames(sharp_split) | |
fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id)) | |
raw_baselines = fd_raw | |
column_names = fd_columns | |
elif sim_slate_var1 == 'Secondary Slate': | |
st.session_state.working_seed = init_FD_secondary_seed_frames(sharp_split) | |
fd_id_dict = dict(zip(fd_secondary.Player, fd_secondary.player_id)) | |
raw_baselines = fd_secondary | |
column_names = fd_columns | |
st.session_state.maps_dict = { | |
'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.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'])), | |
'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)), | |
'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev)) | |
} | |
Sim_Winners = sim_contest(1000, st.session_state.working_seed, st.session_state.maps_dict, Contest_Size) | |
Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners)) | |
# 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() | |
st.session_state.freq_copy = st.session_state.Sim_Winner_Display | |
if sim_site_var1 == 'Draftkings': | |
freq_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:8].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(st.session_state.freq_copy.iloc[:,0:9].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(st.session_state.maps_dict['Pos_map']) | |
freq_working['Salary'] = freq_working['Player'].map(st.session_state.maps_dict['Salary_map']) | |
freq_working['Proj Own'] = freq_working['Player'].map(st.session_state.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(st.session_state.maps_dict['Team_map']) | |
st.session_state.player_freq = freq_working.copy() | |
if sim_site_var1 == 'Draftkings': | |
pg_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.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': | |
pg_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:2].values, return_counts=True)), | |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True) | |
pg_working['Freq'] = pg_working['Freq'].astype(int) | |
pg_working['Position'] = pg_working['Player'].map(st.session_state.maps_dict['Pos_map']) | |
pg_working['Salary'] = pg_working['Player'].map(st.session_state.maps_dict['Salary_map']) | |
pg_working['Proj Own'] = pg_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100 | |
pg_working['Exposure'] = pg_working['Freq']/(1000) | |
pg_working['Edge'] = pg_working['Exposure'] - pg_working['Proj Own'] | |
pg_working['Team'] = pg_working['Player'].map(st.session_state.maps_dict['Team_map']) | |
st.session_state.pg_freq = pg_working.copy() | |
if sim_site_var1 == 'Draftkings': | |
sg_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,1:2].values, return_counts=True)), | |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True) | |
elif sim_site_var1 == 'Fanduel': | |
sg_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,2:4].values, return_counts=True)), | |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True) | |
sg_working['Freq'] = sg_working['Freq'].astype(int) | |
sg_working['Position'] = sg_working['Player'].map(st.session_state.maps_dict['Pos_map']) | |
sg_working['Salary'] = sg_working['Player'].map(st.session_state.maps_dict['Salary_map']) | |
sg_working['Proj Own'] = sg_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100 | |
sg_working['Exposure'] = sg_working['Freq']/(1000) | |
sg_working['Edge'] = sg_working['Exposure'] - sg_working['Proj Own'] | |
sg_working['Team'] = sg_working['Player'].map(st.session_state.maps_dict['Team_map']) | |
st.session_state.sg_freq = sg_working.copy() | |
if sim_site_var1 == 'Draftkings': | |
sf_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,2:3].values, return_counts=True)), | |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True) | |
elif sim_site_var1 == 'Fanduel': | |
sf_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,4:6].values, return_counts=True)), | |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True) | |
sf_working['Freq'] = sf_working['Freq'].astype(int) | |
sf_working['Position'] = sf_working['Player'].map(st.session_state.maps_dict['Pos_map']) | |
sf_working['Salary'] = sf_working['Player'].map(st.session_state.maps_dict['Salary_map']) | |
sf_working['Proj Own'] = sf_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100 | |
sf_working['Exposure'] = sf_working['Freq']/(1000) | |
sf_working['Edge'] = sf_working['Exposure'] - sf_working['Proj Own'] | |
sf_working['Team'] = sf_working['Player'].map(st.session_state.maps_dict['Team_map']) | |
st.session_state.sf_freq = sf_working.copy() | |
if sim_site_var1 == 'Draftkings': | |
pf_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,3:4].values, return_counts=True)), | |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True) | |
elif sim_site_var1 == 'Fanduel': | |
pf_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,6:8].values, return_counts=True)), | |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True) | |
pf_working['Freq'] = pf_working['Freq'].astype(int) | |
pf_working['Position'] = pf_working['Player'].map(st.session_state.maps_dict['Pos_map']) | |
pf_working['Salary'] = pf_working['Player'].map(st.session_state.maps_dict['Salary_map']) | |
pf_working['Proj Own'] = pf_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100 | |
pf_working['Exposure'] = pf_working['Freq']/(1000) | |
pf_working['Edge'] = pf_working['Exposure'] - pf_working['Proj Own'] | |
pf_working['Team'] = pf_working['Player'].map(st.session_state.maps_dict['Team_map']) | |
st.session_state.pf_freq = pf_working.copy() | |
if sim_site_var1 == 'Draftkings': | |
c_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,4:5].values, return_counts=True)), | |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True) | |
elif sim_site_var1 == 'Fanduel': | |
c_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,8:9].values, return_counts=True)), | |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True) | |
c_working['Freq'] = c_working['Freq'].astype(int) | |
c_working['Position'] = c_working['Player'].map(st.session_state.maps_dict['Pos_map']) | |
c_working['Salary'] = c_working['Player'].map(st.session_state.maps_dict['Salary_map']) | |
c_working['Proj Own'] = c_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100 | |
c_working['Exposure'] = c_working['Freq']/(1000) | |
c_working['Edge'] = c_working['Exposure'] - c_working['Proj Own'] | |
c_working['Team'] = c_working['Player'].map(st.session_state.maps_dict['Team_map']) | |
st.session_state.c_freq = c_working.copy() | |
if sim_site_var1 == 'Draftkings': | |
g_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,5:6].values, return_counts=True)), | |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True) | |
elif sim_site_var1 == 'Fanduel': | |
g_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:4].values, return_counts=True)), | |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True) | |
g_working['Freq'] = g_working['Freq'].astype(int) | |
g_working['Position'] = g_working['Player'].map(st.session_state.maps_dict['Pos_map']) | |
g_working['Salary'] = g_working['Player'].map(st.session_state.maps_dict['Salary_map']) | |
g_working['Proj Own'] = g_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100 | |
g_working['Exposure'] = g_working['Freq']/(1000) | |
g_working['Edge'] = g_working['Exposure'] - g_working['Proj Own'] | |
g_working['Team'] = g_working['Player'].map(st.session_state.maps_dict['Team_map']) | |
st.session_state.g_freq = g_working.copy() | |
if sim_site_var1 == 'Draftkings': | |
f_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,6:7].values, return_counts=True)), | |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True) | |
elif sim_site_var1 == 'Fanduel': | |
f_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,4:8].values, return_counts=True)), | |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True) | |
f_working['Freq'] = f_working['Freq'].astype(int) | |
f_working['Position'] = f_working['Player'].map(st.session_state.maps_dict['Pos_map']) | |
f_working['Salary'] = f_working['Player'].map(st.session_state.maps_dict['Salary_map']) | |
f_working['Proj Own'] = f_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100 | |
f_working['Exposure'] = f_working['Freq']/(1000) | |
f_working['Edge'] = f_working['Exposure'] - f_working['Proj Own'] | |
f_working['Team'] = f_working['Player'].map(st.session_state.maps_dict['Team_map']) | |
st.session_state.f_freq = f_working.copy() | |
if sim_site_var1 == 'Draftkings': | |
flex_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,7:8].values, return_counts=True)), | |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True) | |
elif sim_site_var1 == 'Fanduel': | |
flex_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:9].values, return_counts=True)), | |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True) | |
flex_working['Freq'] = flex_working['Freq'].astype(int) | |
flex_working['Position'] = flex_working['Player'].map(st.session_state.maps_dict['Pos_map']) | |
flex_working['Salary'] = flex_working['Player'].map(st.session_state.maps_dict['Salary_map']) | |
flex_working['Proj Own'] = flex_working['Player'].map(st.session_state.maps_dict['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(st.session_state.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(st.session_state.freq_copy.iloc[:,10:11].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(st.session_state.freq_copy.iloc[:,11:12].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='MLB_consim_export.csv', | |
mime='text/csv', | |
) | |
tab1, tab2 = st.tabs(['Winning Frame Statistics', 'Flex Exposure Statistics']) | |
with tab1: | |
if 'Sim_Winner_Display' in st.session_state: | |
# Create a new dataframe with summary statistics | |
summary_df = pd.DataFrame({ | |
'Metric': ['Min', 'Average', 'Max', 'STDdev'], | |
'Salary': [ | |
st.session_state.Sim_Winner_Display['salary'].min(), | |
st.session_state.Sim_Winner_Display['salary'].mean(), | |
st.session_state.Sim_Winner_Display['salary'].max(), | |
st.session_state.Sim_Winner_Display['salary'].std() | |
], | |
'Proj': [ | |
st.session_state.Sim_Winner_Display['proj'].min(), | |
st.session_state.Sim_Winner_Display['proj'].mean(), | |
st.session_state.Sim_Winner_Display['proj'].max(), | |
st.session_state.Sim_Winner_Display['proj'].std() | |
], | |
'Own': [ | |
st.session_state.Sim_Winner_Display['Own'].min(), | |
st.session_state.Sim_Winner_Display['Own'].mean(), | |
st.session_state.Sim_Winner_Display['Own'].max(), | |
st.session_state.Sim_Winner_Display['Own'].std() | |
], | |
'Fantasy': [ | |
st.session_state.Sim_Winner_Display['Fantasy'].min(), | |
st.session_state.Sim_Winner_Display['Fantasy'].mean(), | |
st.session_state.Sim_Winner_Display['Fantasy'].max(), | |
st.session_state.Sim_Winner_Display['Fantasy'].std() | |
], | |
'GPP_Proj': [ | |
st.session_state.Sim_Winner_Display['GPP_Proj'].min(), | |
st.session_state.Sim_Winner_Display['GPP_Proj'].mean(), | |
st.session_state.Sim_Winner_Display['GPP_Proj'].max(), | |
st.session_state.Sim_Winner_Display['GPP_Proj'].std() | |
] | |
}) | |
# Set the index of the summary dataframe as the "Metric" column | |
summary_df = summary_df.set_index('Metric') | |
# Display the summary dataframe | |
st.subheader("Winning Frame Statistics") | |
st.dataframe(summary_df.style.format({ | |
'Salary': '{:.2f}', | |
'Proj': '{:.2f}', | |
'Fantasy': '{:.2f}', | |
'GPP_Proj': '{:.2f}' | |
}).background_gradient(cmap='RdYlGn', axis=0, subset=['Salary', 'Proj', 'Own', 'Fantasy', 'GPP_Proj']), use_container_width=True) | |
with tab2: | |
if 'Sim_Winner_Display' in st.session_state: | |
st.write("Yeah man that's crazy") | |
else: | |
st.write("Simulation data or position mapping not available.") | |
with st.container(): | |
tab1, tab2 = st.tabs(['Overall 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 'team_freq' in st.session_state: | |
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) | |
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' | |
) |