CoolFace
Apppublic

TrueDFS/NBA_DFS_Contest_Sims_Origin

sourceHugging Faceupdated 2y agoView on Hugging Face
0likes
app.py740 linesDownload Raw Back to root
1import streamlit as st2st.set_page_config(layout="wide")3import numpy as np4import pandas as pd5import pymongo6import time7 8@st.cache_resource9def init_conn():10        11        uri = st.secrets['mongo_uri']12        client = pymongo.MongoClient(uri, retryWrites=True, serverSelectionTimeoutMS=500000)13        db = client["NBA_DFS"]14 15        return db16    17db = init_conn()18 19percentages_format = {'Exposure': '{:.2%}'}20freq_format = {'Proj Own': '{:.2%}', 'Exposure': '{:.2%}', 'Edge': '{:.2%}'}21dk_columns = ['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']22fd_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C1', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']23 24@st.cache_data(ttl = 60)25def init_DK_seed_frames(load_size):  26        27        collection = db['DK_NBA_name_map']28        cursor = collection.find()29        raw_data = pd.DataFrame(list(cursor))30        names_dict = dict(zip(raw_data['key'], raw_data['value']))31    32        collection = db["DK_NBA_seed_frame"] 33        cursor = collection.find().limit(load_size)34    35        raw_display = pd.DataFrame(list(cursor))36        raw_display = raw_display[['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]37        dict_columns = ['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX']38        st.write("converting names")39        for col in dict_columns:40            raw_display[col] = raw_display[col].map(names_dict)41        DK_seed = raw_display.to_numpy()42 43        return DK_seed44 45@st.cache_data(ttl = 60)46def init_DK_secondary_seed_frames(load_size):  47        48        collection = db['DK_NBA_Secondary_name_map']49        cursor = collection.find()50        raw_data = pd.DataFrame(list(cursor))51        names_dict = dict(zip(raw_data['key'], raw_data['value']))52    53        collection = db["DK_NBA_Secondary_seed_frame"] 54        cursor = collection.find().limit(load_size)55    56        raw_display = pd.DataFrame(list(cursor))57        raw_display = raw_display[['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]58        dict_columns = ['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX']59        st.write("converting names")60        for col in dict_columns:61            raw_display[col] = raw_display[col].map(names_dict)62        DK_seed = raw_display.to_numpy()63 64        return DK_seed65 66@st.cache_data(ttl = 60)67def init_FD_seed_frames(load_size):  68        69        collection = db['FD_NBA_name_map']70        cursor = collection.find()71        raw_data = pd.DataFrame(list(cursor))72        names_dict = dict(zip(raw_data['key'], raw_data['value']))73    74        collection = db["FD_NBA_seed_frame"] 75        cursor = collection.find().limit(load_size)76    77        raw_display = pd.DataFrame(list(cursor))78        raw_display = raw_display[['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C1', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]79        dict_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C1']80        st.write("converting names")81        for col in dict_columns:82            raw_display[col] = raw_display[col].map(names_dict)83        FD_seed = raw_display.to_numpy()84 85        return FD_seed86 87@st.cache_data(ttl = 60)88def init_FD_secondary_seed_frames(load_size):  89        90        collection = db['FD_NBA_Secondary_name_map']91        cursor = collection.find()92        raw_data = pd.DataFrame(list(cursor))93        names_dict = dict(zip(raw_data['key'], raw_data['value']))94    95        collection = db["FD_NBA_Secondary_seed_frame"] 96        cursor = collection.find().limit(load_size)97    98        raw_display = pd.DataFrame(list(cursor))99        raw_display = raw_display[['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C1', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]100        dict_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C1']101        st.write("converting names")102        for col in dict_columns:103            raw_display[col] = raw_display[col].map(names_dict)104        FD_seed = raw_display.to_numpy()105 106        return FD_seed107 108@st.cache_resource(ttl = 60)109def init_baselines():110    collection = db["Player_Range_Of_Outcomes"] 111    cursor = collection.find()112 113    load_display = pd.DataFrame(list(cursor))114 115    load_display.replace('', np.nan, inplace=True)116    load_display.rename(columns={"Fantasy": "Median", 'Name': 'Player', 'player_ID': 'player_id'}, inplace = True)117    load_display = load_display[load_display['Median'] > 0]118 119    dk_roo_raw = load_display[load_display['site'] == 'Draftkings']120    dk_roo_raw = dk_roo_raw[dk_roo_raw['slate'] == 'Main Slate']121    dk_roo_raw['STDev'] = dk_roo_raw['Median'] / 4122    dk_raw = dk_roo_raw.dropna(subset=['Median'])123 124    fd_roo_raw = load_display[load_display['site'] == 'Fanduel']125    fd_roo_raw = fd_roo_raw[fd_roo_raw['slate'] == 'Main Slate']126    fd_roo_raw['STDev'] = fd_roo_raw['Median'] / 4127    fd_raw = fd_roo_raw.dropna(subset=['Median'])128 129    dk_secondary_roo_raw = load_display[load_display['site'] == 'Draftkings']130    dk_secondary_roo_raw = dk_secondary_roo_raw[dk_secondary_roo_raw['slate'] == 'Secondary Slate']131    dk_secondary_roo_raw['STDev'] = dk_secondary_roo_raw['Median'] / 4132    dk_secondary = dk_secondary_roo_raw.dropna(subset=['Median'])133 134    fd_secondary_roo_raw = load_display[load_display['site'] == 'Fanduel']135    fd_secondary_roo_raw = fd_secondary_roo_raw[fd_secondary_roo_raw['slate'] == 'Secondary Slate']136    fd_secondary_roo_raw['STDev'] = fd_secondary_roo_raw['Median'] / 4137    fd_secondary = fd_secondary_roo_raw.dropna(subset=['Median'])138 139    return dk_raw, fd_raw, dk_secondary, fd_secondary140 141@st.cache_data142def convert_df(array):143    array = pd.DataFrame(array, columns=column_names)144    return array.to_csv().encode('utf-8')145 146@st.cache_data147def calculate_DK_value_frequencies(np_array):148    unique, counts = np.unique(np_array[:, :8], return_counts=True)149    frequencies = counts / len(np_array)  # Normalize by the number of rows 150    combined_array = np.column_stack((unique, frequencies))  151    return combined_array 152 153@st.cache_data154def calculate_FD_value_frequencies(np_array):155    unique, counts = np.unique(np_array[:, :9], return_counts=True)156    frequencies = counts / len(np_array)  # Normalize by the number of rows 157    combined_array = np.column_stack((unique, frequencies))  158    return combined_array159 160@st.cache_data161def sim_contest(Sim_size, seed_frame, maps_dict, Contest_Size):162    SimVar = 1163    Sim_Winners = []164    165    # Pre-vectorize functions166    vec_projection_map = np.vectorize(maps_dict['Projection_map'].__getitem__)167    vec_stdev_map = np.vectorize(maps_dict['STDev_map'].__getitem__)168    169    st.write('Simulating contest on frames')170    171    while SimVar <= Sim_size:172        fp_random = seed_frame[np.random.choice(seed_frame.shape[0], Contest_Size)]173            174        sample_arrays1 = np.c_[175            fp_random, 176            np.sum(np.random.normal(177                loc=vec_projection_map(fp_random[:, :-7]),178                scale=vec_stdev_map(fp_random[:, :-7])),179            axis=1)180        ]181 182        sample_arrays = sample_arrays1183        if sim_site_var1 == 'Draftkings':184            final_array = sample_arrays[sample_arrays[:, 9].argsort()[::-1]]185        elif sim_site_var1 == 'Fanduel':186            final_array = sample_arrays[sample_arrays[:, 10].argsort()[::-1]]187        best_lineup = final_array[final_array[:, -1].argsort(kind='stable')[::-1][:1]]188        Sim_Winners.append(best_lineup)189        SimVar += 1190        191    return Sim_Winners192 193dk_raw, fd_raw, dk_secondary, fd_secondary = init_baselines()194dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id))195fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))196 197tab1, tab2 = st.tabs(['Contest Sims', 'Data Export'])198 199with tab2:200    col1, col2 = st.columns([1, 7])201    with col1:202        if st.button("Load/Reset Data", key='reset1'):203              st.cache_data.clear()204              for key in st.session_state.keys():205                  del st.session_state[key]206              DK_seed = init_DK_seed_frames(10000)207              FD_seed = init_FD_seed_frames(10000)208              DK_secondary = init_DK_secondary_seed_frames(10000)209              FD_secondary = init_FD_secondary_seed_frames(10000)210              dk_raw, fd_raw, dk_secondary, fd_secondary = init_baselines()211              dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id))212              fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))213              214        slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate'), key='slate_var1')215        site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'), key='site_var1')216        sharp_split_var = st.number_input("How many lineups do you want?", value=10000, max_value=500000, min_value=10000, step=10000)217        lineup_num_var = st.number_input("How many lineups do you want to display?", min_value=1, max_value=500, value=10, step=1)218 219        if site_var1 == 'Draftkings':220            221            player_var1 = st.radio("Do you want a frame with specific Players?", ('Full Slate', 'Specific Players'), key='player_var1')222            if player_var1 == 'Specific Players':223                    player_var2 = st.multiselect('Which players do you want?', options = dk_raw['Player'].unique())224            elif player_var1 == 'Full Slate':225                    player_var2 = dk_raw.Player.values.tolist()226                    227            raw_baselines = dk_raw228            column_names = dk_columns229            230        elif site_var1 == 'Fanduel':231            232            player_var1 = st.radio("Do you want a frame with specific Players?", ('Full Slate', 'Specific Players'), key='player_var1')233            if player_var1 == 'Specific Players':234                    player_var2 = st.multiselect('Which players do you want?', options = fd_raw['Player'].unique())235            elif player_var1 == 'Full Slate':236                    player_var2 = fd_raw.Player.values.tolist()237            238            raw_baselines = fd_raw239            column_names = fd_columns240 241        if st.button("Prepare data export", key='data_export'):242            if site_var1 == 'Draftkings':243                if 'working_seed' in st.session_state:244                    st.session_state.working_seed = st.session_state.working_seed245                    if player_var1 == 'Specific Players':246                        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)]247                    st.session_state.data_export_display = st.session_state.working_seed[0:lineup_num_var]248                    export_column_var = 8249                elif 'working_seed' not in st.session_state:250                    if slate_var1 == 'Main Slate':251                        st.session_state.working_seed = init_DK_seed_frames(sharp_split_var)252                        dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id))253 254                        raw_baselines = dk_raw255                        column_names = dk_columns256                    elif slate_var1 == 'Secondary Slate':257                        st.session_state.working_seed = init_DK_secondary_seed_frames(sharp_split_var)258                        dk_id_dict = dict(zip(dk_secondary.Player, dk_secondary.player_id))259 260                        raw_baselines = dk_secondary261                        column_names = dk_columns262                263                    if player_var1 == 'Specific Players':264                        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)]265                    st.session_state.data_export_display = st.session_state.working_seed[0:lineup_num_var]266                    export_column_var = 8267                data_export = st.session_state.data_export_display.copy()268                for col in range(export_column_var):269                        data_export[:, col] = np.array([dk_id_dict.get(x, x) for x in data_export[:, col]])270                271            elif site_var1 == 'Fanduel':272                if 'working_seed' in st.session_state:273                    st.session_state.working_seed = st.session_state.working_seed274                    if player_var1 == 'Specific Players':275                        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)]276                    st.session_state.data_export_display = st.session_state.working_seed[0:lineup_num_var]277                    export_column_var = 9278                elif 'working_seed' not in st.session_state:279                    if slate_var1 == 'Main Slate':280                        st.session_state.working_seed = init_FD_seed_frames(sharp_split_var)281                        fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))282 283                        raw_baselines = fd_raw284                        column_names = fd_columns285                    elif slate_var1 == 'Secondary Slate':286                        st.session_state.working_seed = init_FD_secondary_seed_frames(sharp_split_var)287                        fd_id_dict = dict(zip(fd_secondary.Player, fd_secondary.player_id))288                    289                        raw_baselines = fd_secondary290                        column_names = fd_columns291 292                    if player_var1 == 'Specific Players':293                        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)]294                    st.session_state.data_export_display = st.session_state.working_seed[0:lineup_num_var]295                    export_column_var = 9296                data_export = st.session_state.data_export_display.copy()297                for col in range(export_column_var):298                        data_export[:, col] = np.array([fd_id_dict.get(x, x) for x in fd_id_dict[:, col]])299            st.download_button(300                label="Export optimals set",301                data=convert_df(data_export),302                file_name='NBA_optimals_export.csv',303                mime='text/csv',304            )305            306    with col2:307        if st.button("Load Data", key='load_data'):308            if site_var1 == 'Draftkings':309                if 'working_seed' in st.session_state:310                    st.session_state.working_seed = st.session_state.working_seed311                    if player_var1 == 'Specific Players':312                        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)]313                    st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)314                elif 'working_seed' not in st.session_state:315                    if slate_var1 == 'Main Slate':316                        st.session_state.working_seed = init_DK_seed_frames(sharp_split_var)317                        dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id))318 319                        raw_baselines = dk_raw320                        column_names = dk_columns321                    elif slate_var1 == 'Secondary Slate':322                        st.session_state.working_seed = init_DK_secondary_seed_frames(sharp_split_var)323                        dk_id_dict = dict(zip(dk_secondary.Player, dk_secondary.player_id))324 325                        raw_baselines = dk_secondary326                        column_names = dk_columns327                328                    if player_var1 == 'Specific Players':329                        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)]330                    st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)331                332            elif site_var1 == 'Fanduel':333                if 'working_seed' in st.session_state:334                    st.session_state.working_seed = st.session_state.working_seed335                    if player_var1 == 'Specific Players':336                        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)]337                    st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)338                elif 'working_seed' not in st.session_state:339                    if slate_var1 == 'Main Slate':340                        st.session_state.working_seed = init_FD_seed_frames(sharp_split_var)341                        fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))342 343                        raw_baselines = fd_raw344                        column_names = fd_columns345                    elif slate_var1 == 'Secondary Slate':346                        st.session_state.working_seed = init_FD_secondary_seed_frames(sharp_split_var)347                        fd_id_dict = dict(zip(fd_secondary.Player, fd_secondary.player_id))348                    349                        raw_baselines = fd_secondary350                        column_names = fd_columns351 352                    if player_var1 == 'Specific Players':353                        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)]354                    st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)355                356            if 'data_export_display' in st.session_state:357                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)358            359with tab1:360    col1, col2 = st.columns([1, 7])361    with col1:362        if st.button("Load/Reset Data", key='reset2'):363              st.cache_data.clear()364              for key in st.session_state.keys():365                  del st.session_state[key]366              DK_seed = init_DK_seed_frames(10000)367              FD_seed = init_FD_seed_frames(10000)368              DK_secondary = init_DK_secondary_seed_frames(10000)369              FD_secondary = init_FD_secondary_seed_frames(10000)370              dk_raw, fd_raw, dk_secondary, fd_secondary = init_baselines()371              dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id))372              fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))373 374        sim_slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate'), key='sim_slate_var1')375        sim_site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'), key='sim_site_var1')376            377        contest_var1 = st.selectbox("What contest size are you simulating?", ('Small', 'Medium', 'Large', 'Custom'))378        if contest_var1 == 'Small':379            Contest_Size = 1000380        elif contest_var1 == 'Medium':381            Contest_Size = 5000382        elif contest_var1 == 'Large':383            Contest_Size = 10000384        elif contest_var1 == 'Custom':385            Contest_Size = st.number_input("Insert contest size", value=100, min_value=100, max_value=100000, step=50)386        strength_var1 = st.selectbox("How sharp is the field in the contest?", ('Very', 'Above Average', 'Average', 'Below Average', 'Not Very'))387        if strength_var1 == 'Not Very':388            sharp_split = 5000000389        elif strength_var1 == 'Below Average':390            sharp_split = 2500000391        elif strength_var1 == 'Average':392            sharp_split = 100000393        elif strength_var1 == 'Above Average':394            sharp_split = 50000395        elif strength_var1 == 'Very':396            sharp_split = 10000397 398    399    with col2:400        if st.button("Run Contest Sim"):401            if 'working_seed' in st.session_state:402                st.session_state.maps_dict = {403                        'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),404                        'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)),405                        'Pos_map':dict(zip(raw_baselines.Player,raw_baselines.Position)),406                        'Own_map':dict(zip(raw_baselines.Player,raw_baselines['Own'])),407                        'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)),408                        'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev))409                        }410                Sim_Winners = sim_contest(1000, st.session_state.working_seed, st.session_state.maps_dict, Contest_Size)411                Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))412                            413                # Initial setup414                Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=column_names + ['Fantasy'])415                Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['proj'] + Sim_Winner_Frame['Fantasy']) / 2416                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)417                Sim_Winner_Frame = Sim_Winner_Frame.assign(win_count=Sim_Winner_Frame['unique_id'].map(Sim_Winner_Frame['unique_id'].value_counts()))418                419                # Type Casting420                type_cast_dict = {'salary': int, 'proj': np.float16, 'Fantasy': np.float16, 'GPP_Proj': np.float32, 'Own': np.float32}421                Sim_Winner_Frame = Sim_Winner_Frame.astype(type_cast_dict)422                423                # Sorting424                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)425                st.session_state.Sim_Winner_Frame.drop(columns='unique_id', inplace=True)426                427                # Data Copying428                st.session_state.Sim_Winner_Export = Sim_Winner_Frame.copy()429                430                # Data Copying431                st.session_state.Sim_Winner_Display = Sim_Winner_Frame.copy()432                433            else:434                if sim_site_var1 == 'Draftkings':435                    if sim_slate_var1 == 'Main Slate':436                        st.session_state.working_seed = init_DK_seed_frames(sharp_split)437                        dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id))438                        raw_baselines = dk_raw439                        column_names = dk_columns440                    elif sim_slate_var1 == 'Secondary Slate':441                        st.session_state.working_seed = init_DK_secondary_seed_frames(sharp_split)442                        dk_id_dict = dict(zip(dk_secondary.Player, dk_secondary.player_id))443                        raw_baselines = dk_secondary444                        column_names = dk_columns445 446                elif sim_site_var1 == 'Fanduel':447                    if sim_slate_var1 == 'Main Slate':448                        st.session_state.working_seed = init_FD_seed_frames(sharp_split)449                        fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))450                        raw_baselines = fd_raw451                        column_names = fd_columns452                    elif sim_slate_var1 == 'Secondary Slate':453                        st.session_state.working_seed = init_FD_secondary_seed_frames(sharp_split)454                        fd_id_dict = dict(zip(fd_secondary.Player, fd_secondary.player_id))455                        raw_baselines = fd_secondary456                        column_names = fd_columns457 458                st.session_state.maps_dict = {459                        'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),460                        'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)),461                        'Pos_map':dict(zip(raw_baselines.Player,raw_baselines.Position)),462                        'Own_map':dict(zip(raw_baselines.Player,raw_baselines['Own'])),463                        'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)),464                        'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev))465                        }466                Sim_Winners = sim_contest(1000, st.session_state.working_seed, st.session_state.maps_dict, Contest_Size)467                Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))468                            469                # Initial setup470                Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=column_names + ['Fantasy'])471                Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['proj'] + Sim_Winner_Frame['Fantasy']) / 2472                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)473                Sim_Winner_Frame = Sim_Winner_Frame.assign(win_count=Sim_Winner_Frame['unique_id'].map(Sim_Winner_Frame['unique_id'].value_counts()))474                475                # Type Casting476                type_cast_dict = {'salary': int, 'proj': np.float16, 'Fantasy': np.float16, 'GPP_Proj': np.float32, 'Own': np.float32}477                Sim_Winner_Frame = Sim_Winner_Frame.astype(type_cast_dict)478                479                # Sorting480                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)481                st.session_state.Sim_Winner_Frame.drop(columns='unique_id', inplace=True)482                483               # Data Copying484                st.session_state.Sim_Winner_Export = Sim_Winner_Frame.copy()485                486                # Data Copying487                st.session_state.Sim_Winner_Display = Sim_Winner_Frame.copy()488                st.session_state.freq_copy = st.session_state.Sim_Winner_Display489                490            if sim_site_var1 == 'Draftkings':491                freq_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:8].values, return_counts=True)),492                                                columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)493            elif sim_site_var1 == 'Fanduel':494                freq_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:9].values, return_counts=True)),495                                                columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)496            freq_working['Freq'] = freq_working['Freq'].astype(int)497            freq_working['Position'] = freq_working['Player'].map(st.session_state.maps_dict['Pos_map'])498            freq_working['Salary'] = freq_working['Player'].map(st.session_state.maps_dict['Salary_map'])499            freq_working['Proj Own'] = freq_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100500            freq_working['Exposure'] = freq_working['Freq']/(1000)501            freq_working['Edge'] = freq_working['Exposure'] - freq_working['Proj Own']502            freq_working['Team'] = freq_working['Player'].map(st.session_state.maps_dict['Team_map'])503            st.session_state.player_freq = freq_working.copy()504 505            if sim_site_var1 == 'Draftkings':506                pg_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:1].values, return_counts=True)),507                                                columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)508            elif sim_site_var1 == 'Fanduel':509                pg_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:2].values, return_counts=True)),510                                                columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)511            pg_working['Freq'] = pg_working['Freq'].astype(int)512            pg_working['Position'] = pg_working['Player'].map(st.session_state.maps_dict['Pos_map'])513            pg_working['Salary'] = pg_working['Player'].map(st.session_state.maps_dict['Salary_map'])514            pg_working['Proj Own'] = pg_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100515            pg_working['Exposure'] = pg_working['Freq']/(1000)516            pg_working['Edge'] = pg_working['Exposure'] - pg_working['Proj Own']517            pg_working['Team'] = pg_working['Player'].map(st.session_state.maps_dict['Team_map'])518            st.session_state.pg_freq = pg_working.copy()519            520            if sim_site_var1 == 'Draftkings':521                sg_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,1:2].values, return_counts=True)),522                                                columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)523            elif sim_site_var1 == 'Fanduel':524                sg_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,2:4].values, return_counts=True)),525                                                columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)526            sg_working['Freq'] = sg_working['Freq'].astype(int)527            sg_working['Position'] = sg_working['Player'].map(st.session_state.maps_dict['Pos_map'])528            sg_working['Salary'] = sg_working['Player'].map(st.session_state.maps_dict['Salary_map'])529            sg_working['Proj Own'] = sg_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100530            sg_working['Exposure'] = sg_working['Freq']/(1000)531            sg_working['Edge'] = sg_working['Exposure'] - sg_working['Proj Own']532            sg_working['Team'] = sg_working['Player'].map(st.session_state.maps_dict['Team_map'])533            st.session_state.sg_freq = sg_working.copy()534            535            if sim_site_var1 == 'Draftkings':536                sf_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,2:3].values, return_counts=True)),537                                                columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)538            elif sim_site_var1 == 'Fanduel':539                sf_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,4:6].values, return_counts=True)),540                                                columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)541            sf_working['Freq'] = sf_working['Freq'].astype(int)542            sf_working['Position'] = sf_working['Player'].map(st.session_state.maps_dict['Pos_map'])543            sf_working['Salary'] = sf_working['Player'].map(st.session_state.maps_dict['Salary_map'])544            sf_working['Proj Own'] = sf_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100545            sf_working['Exposure'] = sf_working['Freq']/(1000)546            sf_working['Edge'] = sf_working['Exposure'] - sf_working['Proj Own']547            sf_working['Team'] = sf_working['Player'].map(st.session_state.maps_dict['Team_map'])548            st.session_state.sf_freq = sf_working.copy()549            550            if sim_site_var1 == 'Draftkings':551                pf_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,3:4].values, return_counts=True)),552                                                columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)553            elif sim_site_var1 == 'Fanduel':554                pf_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,6:8].values, return_counts=True)),555                                                columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)556            pf_working['Freq'] = pf_working['Freq'].astype(int)557            pf_working['Position'] = pf_working['Player'].map(st.session_state.maps_dict['Pos_map'])558            pf_working['Salary'] = pf_working['Player'].map(st.session_state.maps_dict['Salary_map'])559            pf_working['Proj Own'] = pf_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100560            pf_working['Exposure'] = pf_working['Freq']/(1000)561            pf_working['Edge'] = pf_working['Exposure'] - pf_working['Proj Own']562            pf_working['Team'] = pf_working['Player'].map(st.session_state.maps_dict['Team_map'])563            st.session_state.pf_freq = pf_working.copy()564            565            if sim_site_var1 == 'Draftkings':566                c_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,4:5].values, return_counts=True)),567                                                columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)568            elif sim_site_var1 == 'Fanduel':569                c_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,8:9].values, return_counts=True)),570                                                columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)571            c_working['Freq'] = c_working['Freq'].astype(int)572            c_working['Position'] = c_working['Player'].map(st.session_state.maps_dict['Pos_map'])573            c_working['Salary'] = c_working['Player'].map(st.session_state.maps_dict['Salary_map'])574            c_working['Proj Own'] = c_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100575            c_working['Exposure'] = c_working['Freq']/(1000)576            c_working['Edge'] = c_working['Exposure'] - c_working['Proj Own']577            c_working['Team'] = c_working['Player'].map(st.session_state.maps_dict['Team_map'])578            st.session_state.c_freq = c_working.copy()579            580            if sim_site_var1 == 'Draftkings':581                g_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,5:6].values, return_counts=True)),582                                                columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)583            elif sim_site_var1 == 'Fanduel':584                g_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:4].values, return_counts=True)),585                                                columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)586            g_working['Freq'] = g_working['Freq'].astype(int)587            g_working['Position'] = g_working['Player'].map(st.session_state.maps_dict['Pos_map'])588            g_working['Salary'] = g_working['Player'].map(st.session_state.maps_dict['Salary_map'])589            g_working['Proj Own'] = g_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100590            g_working['Exposure'] = g_working['Freq']/(1000)591            g_working['Edge'] = g_working['Exposure'] - g_working['Proj Own']592            g_working['Team'] = g_working['Player'].map(st.session_state.maps_dict['Team_map'])593            st.session_state.g_freq = g_working.copy()594            595            if sim_site_var1 == 'Draftkings':596                f_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,6:7].values, return_counts=True)),597                                                columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)598            elif sim_site_var1 == 'Fanduel':599                f_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,4:8].values, return_counts=True)),600                                                columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)601            f_working['Freq'] = f_working['Freq'].astype(int)602            f_working['Position'] = f_working['Player'].map(st.session_state.maps_dict['Pos_map'])603            f_working['Salary'] = f_working['Player'].map(st.session_state.maps_dict['Salary_map'])604            f_working['Proj Own'] = f_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100605            f_working['Exposure'] = f_working['Freq']/(1000)606            f_working['Edge'] = f_working['Exposure'] - f_working['Proj Own']607            f_working['Team'] = f_working['Player'].map(st.session_state.maps_dict['Team_map'])608            st.session_state.f_freq = f_working.copy()609 610            if sim_site_var1 == 'Draftkings':611                flex_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,7:8].values, return_counts=True)),612                                                columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)613            elif sim_site_var1 == 'Fanduel':614                flex_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:9].values, return_counts=True)),615                                                columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)616            flex_working['Freq'] = flex_working['Freq'].astype(int)617            flex_working['Position'] = flex_working['Player'].map(st.session_state.maps_dict['Pos_map'])618            flex_working['Salary'] = flex_working['Player'].map(st.session_state.maps_dict['Salary_map'])619            flex_working['Proj Own'] = flex_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100620            flex_working['Exposure'] = flex_working['Freq']/(1000)621            flex_working['Edge'] = flex_working['Exposure'] - flex_working['Proj Own']622            flex_working['Team'] = flex_working['Player'].map(st.session_state.maps_dict['Team_map'])623            st.session_state.flex_freq = flex_working.copy()624 625            if sim_site_var1 == 'Draftkings':626                team_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,10:11].values, return_counts=True)),627                                                columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)628            elif sim_site_var1 == 'Fanduel':629                team_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,11:12].values, return_counts=True)),630                                                columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)631            team_working['Freq'] = team_working['Freq'].astype(int)632            team_working['Exposure'] = team_working['Freq']/(1000)633            st.session_state.team_freq = team_working.copy()634            635        with st.container():636            if st.button("Reset Sim", key='reset_sim'):637                for key in st.session_state.keys():638                    del st.session_state[key]639            if 'player_freq' in st.session_state: 640                player_split_var2 = st.radio("Are you wanting to isolate any lineups with specific players?", ('Full Players', 'Specific Players'), key='player_split_var2')641                if player_split_var2 == 'Specific Players':642                          find_var2 = st.multiselect('Which players must be included in the lineups?', options = st.session_state.player_freq['Player'].unique())643                elif player_split_var2 == 'Full Players':644                          find_var2 = st.session_state.player_freq.Player.values.tolist()645    646                if player_split_var2 == 'Specific Players':647                          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)]648                if player_split_var2 == 'Full Players':649                          st.session_state.Sim_Winner_Display = st.session_state.Sim_Winner_Frame650            if 'Sim_Winner_Display' in st.session_state:651                st.dataframe(st.session_state.Sim_Winner_Display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), use_container_width = True)652            if 'Sim_Winner_Export' in st.session_state:653                st.download_button(654                    label="Export Full Frame",655                    data=st.session_state.Sim_Winner_Export.to_csv().encode('utf-8'),656                    file_name='MLB_consim_export.csv',657                    mime='text/csv',658                )  659        tab1, tab2 = st.tabs(['Winning Frame Statistics', 'Flex Exposure Statistics'])660        661        with tab1:662            if 'Sim_Winner_Display' in st.session_state:663                # Create a new dataframe with summary statistics664                summary_df = pd.DataFrame({665                    'Metric': ['Min', 'Average', 'Max', 'STDdev'],666                    'Salary': [667                        st.session_state.Sim_Winner_Display['salary'].min(),668                        st.session_state.Sim_Winner_Display['salary'].mean(),669                        st.session_state.Sim_Winner_Display['salary'].max(),670                        st.session_state.Sim_Winner_Display['salary'].std()671                    ],672                    'Proj': [673                        st.session_state.Sim_Winner_Display['proj'].min(),674                        st.session_state.Sim_Winner_Display['proj'].mean(),675                        st.session_state.Sim_Winner_Display['proj'].max(),676                        st.session_state.Sim_Winner_Display['proj'].std()677                    ],678                    'Own': [679                        st.session_state.Sim_Winner_Display['Own'].min(),680                        st.session_state.Sim_Winner_Display['Own'].mean(),681                        st.session_state.Sim_Winner_Display['Own'].max(),682                        st.session_state.Sim_Winner_Display['Own'].std()683                    ],684                    'Fantasy': [685                        st.session_state.Sim_Winner_Display['Fantasy'].min(),686                        st.session_state.Sim_Winner_Display['Fantasy'].mean(),687                        st.session_state.Sim_Winner_Display['Fantasy'].max(),688                        st.session_state.Sim_Winner_Display['Fantasy'].std()689                    ],690                    'GPP_Proj': [691                        st.session_state.Sim_Winner_Display['GPP_Proj'].min(),692                        st.session_state.Sim_Winner_Display['GPP_Proj'].mean(),693                        st.session_state.Sim_Winner_Display['GPP_Proj'].max(),694                        st.session_state.Sim_Winner_Display['GPP_Proj'].std()695                    ]696                })697 698                # Set the index of the summary dataframe as the "Metric" column699                summary_df = summary_df.set_index('Metric')700 701                # Display the summary dataframe702                st.subheader("Winning Frame Statistics")703                st.dataframe(summary_df.style.format({704                    'Salary': '{:.2f}',705                    'Proj': '{:.2f}',706                    'Fantasy': '{:.2f}',707                    'GPP_Proj': '{:.2f}'708                }).background_gradient(cmap='RdYlGn', axis=0, subset=['Salary', 'Proj', 'Own', 'Fantasy', 'GPP_Proj']), use_container_width=True)709 710        with tab2:711            if 'Sim_Winner_Display' in st.session_state:712                st.write("Yeah man that's crazy")713                714            else:715                st.write("Simulation data or position mapping not available.")716        with st.container():717            tab1, tab2 = st.tabs(['Overall Exposures', 'Team Exposures'])718            with tab1:719                if 'player_freq' in st.session_state:720                    721                    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)722                    st.download_button(723                        label="Export Exposures",724                        data=st.session_state.player_freq.to_csv().encode('utf-8'),725                        file_name='player_freq_export.csv',726                        mime='text/csv',727                        key='overall'728                    )729            730            with tab2:731                if 'team_freq' in st.session_state:732                    733                    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)734                    st.download_button(735                        label="Export Exposures",736                        data=st.session_state.team_freq.to_csv().encode('utf-8'),737                        file_name='team_freq.csv',738                        mime='text/csv',739                        key='team'740                    )