import streamlit as st import time # Numpy from numpy import nan as np_nan from numpy import inf as np_inf # Pandas from pandas import DataFrame from pandas import concat as pd_concat from pandas import options as pd_options from pandas import errors as pd_errors from pandas import options as poptions from pandas import set_option # Time from time import sleep as time_sleep from datetime import datetime, date from pytz import timezone as pytz_timezone # Database and configuration - imported globally from database import * # Streamlit UI Configuration st.set_page_config( page_title="Paydirt Model Updates", page_icon="🏆", layout="wide" ) # Custom CSS for consistent styling st.markdown(""" """, unsafe_allow_html=True) # Header st.title("🏆 Paydirt Model Updates") st.markdown("### Update models and generate seed frames") st.markdown("---") # Sport Selection sport_icons = { "NHL": "🏒", "NFL": "🏈", "NBA": "🏀", "MLB": "⚾", "PGA": "⛳", "MMA": "🥊", "NASCAR": "🏎", } selected_tab = st.segmented_control( "Select Tab", options=["NHL Updates", "NBA Updates", 'MLB Updates', 'NFL Updates', 'PGA Updates', 'MMA Updates', 'NASCAR Updates'], selection_mode='single', default='NHL Updates', width='stretch', label_visibility='collapsed', key='tab_selector' ) # ============================================================================ # NHL UPDATES TAB # ============================================================================ if selected_tab == "NHL Updates": from sports.nhl_functions import * st.header("🏒 NHL Model Updates") if st.button("🔄 Run NHL Updates", type="primary", use_container_width=True): with st.spinner("Updating NHL models..."): st.write("Starting prop betting table generation...") upload_betting_data(nhl_db) try: discord.post(content="NHL Prop Betting Table refreshed") except: pass st.write("Starting DraftKings player level basic outcomes generation...") roo_file, own_dicts = build_dk_player_level_basic_outcomes(slate_info, dk_player_hold, fd_player_hold, nhl_db) if roo_file is not None and len(roo_file) > 0: st.write("NHL Draftkings Player Level ROO refreshed") st.table(roo_file.head(10)) else: st.error("NHL Draftkings Player Level ROO generation failed") st.stop() st.write("Starting DraftKings stack matrix basic outcomes generation...") dk_stacks_outcomes = build_dk_stack_matrix_basic_outcomes(slate_info, dk_stacks_hold, own_dicts) st.write("Starting Fanduel stack matrix basic outcomes generation...") fd_stacks_outcomes = build_fd_stack_matrix_basic_outcomes(slate_info, fd_stacks_hold) st.write("Starting DraftKings pp stack matrix basic outcomes generation...") dk_pp_outcomes = build_dk_pp_stack_matrix_basic_outcomes(slate_info, dk_pp_stacks_hold, own_dicts) st.write("Starting Fanduel pp stack matrix basic outcomes generation...") fd_pp_outcomes = build_fd_pp_stack_matrix_basic_outcomes(slate_info, fd_pp_stacks_hold) final_stacks_Proj = pd_concat([dk_stacks_outcomes, fd_stacks_outcomes]) final_stacks_Proj.replace([np_nan, np_inf, -np_inf], 0, inplace=True) sh = gc.open_by_url(NHL_Master_hold) worksheet = sh.worksheet('Player_Lines_ROO') worksheet.batch_clear(['A:Z']) worksheet.update([final_stacks_Proj.columns.values.tolist()] + final_stacks_Proj.values.tolist()) collection = nhl_db['Player_Lines_ROO'] final_stacks_Proj.reset_index(inplace=True) chunk_size = 100000 collection.drop() for i in range(0, len(final_stacks_Proj), chunk_size): for _ in range(5): try: df_chunk = final_stacks_Proj.iloc[i:i + chunk_size] collection.insert_many(df_chunk.to_dict('records'), ordered=False) break except Exception as e: st.write(f"Retry due to error: {e}") time_sleep(1) st.write("NHL Stack Matrix refreshed") final_pp_Proj = pd_concat([dk_pp_outcomes, fd_pp_outcomes]) final_pp_Proj.replace([np_nan, np_inf, -np_inf], 0, inplace=True) worksheet = sh.worksheet('Player_PowerPlay_ROO') worksheet.batch_clear(['A:Z']) worksheet.update([final_pp_Proj.columns.values.tolist()] + final_pp_Proj.values.tolist()) collection = nhl_db['Player_Powerplay_ROO'] final_pp_Proj.reset_index(inplace=True) chunk_size = 100000 collection.drop() for i in range(0, len(final_pp_Proj), chunk_size): for _ in range(5): try: df_chunk = final_pp_Proj.iloc[i:i + chunk_size] collection.insert_many(df_chunk.to_dict('records'), ordered=False) break except Exception as e: st.write(f"Retry due to error: {e}") time_sleep(1) st.write("NHL Powerplay Stack Matrix refreshed") now = datetime.now() current_time = now.strftime("%H:%M:%S") sh = gc.open_by_url(NHL_Master_hold) worksheet = sh.worksheet('Timestamp') worksheet.batch_clear(['A:z']) worksheet.update_cell(1, 1, current_time) try: sh = gc.open_by_url(NHL_Master_hold) worksheet = sh.worksheet('Prop_Frame') prop_frame = DataFrame(worksheet.get_values()) except: sh = gc2.open_by_url(NHL_Master_hold) worksheet = sh.worksheet('Prop_Frame') prop_frame = DataFrame(worksheet.get_values()) prop_frame.columns = prop_frame.iloc[0] prop_frame = prop_frame[1:] prop_frame = prop_frame.reset_index(drop=True) prop_frame = prop_frame.replace('', np_nan) prop_frame = prop_frame.dropna(subset=['Salary']) collection = nhl_db['Player_Level_ROO'] roo_file.reset_index(inplace=True) chunk_size = 100000 collection.drop() for i in range(0, len(roo_file), chunk_size): for _ in range(5): try: df_chunk = roo_file.iloc[i:i + chunk_size] collection.insert_many(df_chunk.to_dict('records'), ordered=False) break except Exception as e: st.write(f"Retry due to error: {e}") time_sleep(1) st.write("Starting DraftKings NHL seed frame generation...") DK_NHL_seed_frame(nhl_db, roo_file) st.write("NHL Draftkings Seed Frames refreshed") st.write("Starting Fanduel NHL seed frame generation...") FD_NHL_seed_frame(nhl_db, roo_file) st.write("NHL Fanduel Seed Frames refreshed") st.success("✅ NHL updates completed successfully!") st.balloons() # ============================================================================ # NBA UPDATES TAB # ============================================================================ elif selected_tab == "NBA Updates": from sports.nba_functions import * st.header("🏀 NBA Model Updates") if st.button("🔄 Run NBA Updates", type="primary", use_container_width=True): with st.spinner("Updating NBA models..."): x = 0 high_end = 1 while x < high_end: try: sh = gc.open_by_url(NBA_Master_hold) worksheet = sh.worksheet('DK_Projections') dk_projects_raw = DataFrame(worksheet.get_values()) except: sh = gc2.open_by_url(NBA_Master_hold) worksheet = sh.worksheet('DK_Projections') dk_projects_raw = DataFrame(worksheet.get_values()) dk_projects_raw.columns = dk_projects_raw.iloc[0] dk_projects_raw = dk_projects_raw[1:] dk_projects_raw = dk_projects_raw.reset_index(drop=True) dk_projects_raw = dk_projects_raw.replace('', np_nan) dk_projects_raw = dk_projects_raw.dropna(subset=['Salary']) try: sh = gc.open_by_url(NBA_Master_hold) worksheet = sh.worksheet('FD_Projections') fd_projects_raw = DataFrame(worksheet.get_values()) except: sh = gc2.open_by_url(NBA_Master_hold) worksheet = sh.worksheet('FD_Projections') fd_projects_raw = DataFrame(worksheet.get_values()) fd_projects_raw.columns = fd_projects_raw.iloc[0] fd_projects_raw = fd_projects_raw[1:] fd_projects_raw = fd_projects_raw.reset_index(drop=True) fd_projects_raw = fd_projects_raw.replace('', np_nan) fd_projects_raw = fd_projects_raw.dropna(subset=['Salary']) st.write("Starting DraftKings player level basic outcomes generation...") dk_roo_result = DK_ROO_Structure_Creation(dk_projects_raw, short_team_acro, long_team_acro, team_only_acro) st.write("NBA Draftkings ROO structure refreshed") st.write("Starting Fanduel player level basic outcomes generation...") fd_roo_result = FD_ROO_Structure_Creation(fd_projects_raw, short_team_acro, long_team_acro, team_only_acro) st.write("NBA Fanduel ROO structure refreshed") st.write("Starting DraftKings NBA seed frame generation...") DK_NBA_seed_frame(dk_roo_result, client) st.write("NBA Draftkings Seed Frames refreshed") st.write("Starting Fanduel NBA seed frame generation...") FD_NBA_seed_frame(fd_roo_result, client) st.write("NBA Fanduel Seed Frames refreshed") try: sh = gc.open_by_url(NBA_Master_hold) worksheet = sh.worksheet('DK_SD_Projections') dk_sd_projections = DataFrame(worksheet.get_values()) except: sh = gc2.open_by_url(NBA_Master_hold) worksheet = sh.worksheet('DK_SD_Projections') dk_sd_projections = DataFrame(worksheet.get_values()) dk_sd_projections.columns = dk_sd_projections.iloc[0] dk_sd_projections = dk_sd_projections[1:] dk_sd_projections = dk_sd_projections.reset_index(drop=True) dk_sd_projections = dk_sd_projections.replace('', np_nan) dk_sd_projections = dk_sd_projections.dropna(subset=['Salary']) try: sh = gc.open_by_url(NBA_Master_hold) worksheet = sh.worksheet('FD_SD_Projections') fd_sd_projections = DataFrame(worksheet.get_values()) except: sh = gc2.open_by_url(NBA_Master_hold) worksheet = sh.worksheet('FD_SD_Projections') fd_sd_projections = DataFrame(worksheet.get_values()) fd_sd_projections.columns = fd_sd_projections.iloc[0] fd_sd_projections = fd_sd_projections[1:] fd_sd_projections = fd_sd_projections.reset_index(drop=True) fd_sd_projections = fd_sd_projections.replace('', np_nan) fd_sd_projections = fd_sd_projections.dropna(subset=['Salary']) dk_showdown_options = list(dk_sd_projections['slate'].unique()) fd_showdown_options = list(fd_sd_projections['slate'].unique()) st.write("Starting DraftKings SD ROO structure generation...") dk_sd_roo_result = DK_SD_ROO(dk_sd_projections, dk_showdown_options) st.write("NBA Draftkings SD ROO structure refreshed") st.write("Starting Fanduel SD ROO structure generation...") fd_sd_roo_result = FD_SD_ROO(fd_sd_projections, fd_showdown_options) st.write("NBA Fanduel SD ROO structure refreshed") sd_roo_final = pd_concat([dk_sd_roo_result, fd_sd_roo_result]) st.write("Starting DraftKings SD seed frame generation...") DK_NBA_SD_seed_frame(dk_showdown_options, dk_sd_projections) st.write("NBA Draftkings SD Seed Frames refreshed") st.write("Starting Fanduel SD seed frame generation...") FD_NBA_SD_seed_frame(fd_showdown_options, fd_sd_projections) st.write("NBA Fanduel SD Seed Frames refreshed") upload_sd_dfs_data(client, sd_roo_final) st.write("NBA SD DFS database refreshed") x += 1 if high_end > 1: time_sleep(600) st.success("✅ NBA updates completed successfully!") st.balloons() # ============================================================================ # NFL UPDATES TAB # ============================================================================ elif selected_tab == "NFL Updates": from sports.nfl_functions import * st.header("🏈 NFL Model Updates") if st.button("🔄 Run NFL Updates", type="primary", use_container_width=True): with st.spinner("Updating NFL models..."): try: sh = gc.open_by_url(NFL_Master_hold) worksheet = sh.worksheet('DK_Projections') dk_projects_raw = DataFrame(worksheet.get_values()) except: sh = gc2.open_by_url(NFL_Master_hold) worksheet = sh.worksheet('DK_Projections') dk_projects_raw = DataFrame(worksheet.get_values()) dk_projects_raw.columns = dk_projects_raw.iloc[0] dk_projects_raw = dk_projects_raw[1:] dk_projects_raw = dk_projects_raw.reset_index(drop=True) dk_projects_raw = dk_projects_raw.replace('', np_nan) dk_projects_raw = dk_projects_raw.dropna(subset=['Salary']) try: sh = gc.open_by_url(NFL_Master_hold) worksheet = sh.worksheet('FD_Projections') fd_projects_raw = DataFrame(worksheet.get_values()) except: sh = gc2.open_by_url(NFL_Master_hold) worksheet = sh.worksheet('FD_Projections') fd_projects_raw = DataFrame(worksheet.get_values()) fd_projects_raw.columns = fd_projects_raw.iloc[0] fd_projects_raw = fd_projects_raw[1:] fd_projects_raw = fd_projects_raw.reset_index(drop=True) fd_projects_raw = fd_projects_raw.replace('', np_nan) fd_projects_raw = fd_projects_raw.dropna(subset=['Salary']) st.write("Starting DraftKings team level stacks generation...") dk_player_hold = DK_Team_Level_Stacks(dk_projects_raw, team_only_acro, long_team_acro, short_team_acro, client) st.write("NFL Draftkings Team Level Stacks refreshed") st.write("Starting Fanduel team level stacks generation...") fd_player_hold = FD_Team_Level_Stacks(fd_projects_raw, team_only_acro, long_team_acro, short_team_acro, client) st.write("NFL Fanduel Team Level Stacks refreshed") st.write("Starting DraftKings ROO structure generation...") dk_roo_result = DK_ROO_Structure_Creation(dk_player_hold, short_team_acro, long_team_acro, team_only_acro) st.write("NFL Draftkings ROO structure refreshed") st.write("Starting Fanduel ROO structure generation...") fd_roo_result = FD_ROO_Structure_Creation(fd_player_hold, short_team_acro, long_team_acro, team_only_acro) st.write("NFL Fanduel ROO structure refreshed") st.write("Starting DraftKings seed frame generation...") DK_seed_frame(dk_roo_result, seed_team_acro, short_team_acro, client) st.write("NFL Draftkings Seed Frames refreshed") st.write("Starting Fanduel seed frame generation...") FD_seed_frame(fd_roo_result, seed_team_acro, short_team_acro, client) st.write("NFL Fanduel Seed Frames refreshed") upload_betting_data(client) st.write("NFL Player Baselines refreshed") try: sh = gc.open_by_url(NFL_Master_hold) worksheet = sh.worksheet('DK_SD_Projections') dk_sd_projections = DataFrame(worksheet.get_values()) except: sh = gc2.open_by_url(NFL_Master_hold) worksheet = sh.worksheet('DK_SD_Projections') dk_sd_projections = DataFrame(worksheet.get_values()) dk_sd_projections.columns = dk_sd_projections.iloc[0] dk_sd_projections = dk_sd_projections[1:] dk_sd_projections = dk_sd_projections.reset_index(drop=True) dk_sd_projections = dk_sd_projections.replace('', np_nan) dk_sd_projections = dk_sd_projections.dropna(subset=['Salary']) try: sh = gc.open_by_url(NFL_Master_hold) worksheet = sh.worksheet('FD_SD_Projections') fd_sd_projections = DataFrame(worksheet.get_values()) except: sh = gc2.open_by_url(NFL_Master_hold) worksheet = sh.worksheet('FD_SD_Projections') fd_sd_projections = DataFrame(worksheet.get_values()) fd_sd_projections.columns = fd_sd_projections.iloc[0] fd_sd_projections = fd_sd_projections[1:] fd_sd_projections = fd_sd_projections.reset_index(drop=True) fd_sd_projections = fd_sd_projections.replace('', np_nan) fd_sd_projections = fd_sd_projections.dropna(subset=['Salary']) dk_showdown_options = list(dk_sd_projections['slate'].unique()) fd_showdown_options = list(fd_sd_projections['slate'].unique()) st.write("Starting DraftKings SD ROO structure generation...") dk_sd_roo_result = DK_SD_ROO(dk_sd_projections, team_only_acro, long_team_acro, dk_showdown_options) st.write("NFL Draftkings SD ROO structure refreshed") st.write("Starting Fanduel SD ROO structure generation...") fd_sd_roo_result = FD_SD_ROO(fd_sd_projections, team_only_acro, long_team_acro, fd_showdown_options) st.write("NFL Fanduel SD ROO structure refreshed") for slate in dk_showdown_options: st.write(f"Processing DraftKings Showdown slate: {slate}") DK_SD_seed_frame(dk_sd_roo_result, team_only_acro, long_team_acro, client, dk_showdown_options, dk_sd_projections) for slate in fd_showdown_options: st.write(f"Processing Fanduel Showdown slate: {slate}") FD_SD_seed_frame(fd_sd_roo_result, team_only_acro, long_team_acro, client, fd_showdown_options, fd_sd_projections) st.success("✅ NFL updates completed successfully!") st.balloons() # ============================================================================ # PGA UPDATES TAB # ============================================================================ elif selected_tab == "PGA Updates": from sports.pga_functions import * st.header("⛳ PGA Model Updates") # Column definitions str_columns = ['Name', 'Roster Position', 'Site', 'Type'] float_columns = ['Cut%', 'Win Odds', 'T5 Odds', 'T10 Odds', 'T20 Odds', 'CeilingVar', 'Fantasy', 'Own%'] int_columns = ['Salary', 'ID'] stat_columns = float_columns + int_columns if st.button("🔄 Run PGA Updates", type="primary", use_container_width=True): with st.spinner("Updating PGA models..."): st.write("Loading PGA data from Google Sheets...") try: sh = gc.open_by_url(PGA_Master_hold) worksheet = sh.worksheet('Export') projects_raw = DataFrame(worksheet.get_values()) except: sh = gc2.open_by_url(PGA_Master_hold) worksheet = sh.worksheet('Export') projects_raw = DataFrame(worksheet.get_values()) projects_raw.columns = projects_raw.iloc[0] projects_raw = projects_raw[1:] projects_raw = projects_raw.reset_index(drop=True) projects_raw = projects_raw.replace('', np_nan) projects_raw = projects_raw.dropna(subset=['Salary']) projects_raw['Roster Position'] = 'FLEX' for col in str_columns: projects_raw[col] = projects_raw[col].astype(str) for col in float_columns: projects_raw[col] = projects_raw[col].str.replace('%', '').astype(float) / 100 for col in int_columns: projects_raw[col] = projects_raw[col].str.replace('%', '').astype(int) projects_raw = projects_raw[projects_raw['Fantasy'] > 0] projects_raw['Fantasy'] = projects_raw['Fantasy'] * 100 projects_raw['Own%'] = projects_raw['Own%'] * 100 projects_raw['Cut%'] = projects_raw['Cut%'] * 100 classic_proj = projects_raw[projects_raw['Type'] == 'Classic'] showdown_proj = projects_raw[projects_raw['Type'] == 'Showdown'] classic_stat_dicts = {} showdown_stat_dicts = {} for col in stat_columns: classic_stat_dicts[col] = dict(zip(classic_proj['Name'], classic_proj[col])) showdown_stat_dicts[col] = dict(zip(showdown_proj['Name'], showdown_proj[col])) classic_working_proj = classic_proj[['Name', 'Roster Position', 'Site', 'Type', 'Salary', 'ID', 'Cut%', 'Win Odds', 'T5 Odds', 'T10 Odds', 'T20 Odds', 'CeilingVar', 'Fantasy', 'Own%']] classic_working_proj = classic_working_proj.rename(columns={"Name": "Player", "Roster Position": "Position", "Fantasy": "Median", "Own%": "Own", "Cut%": "Cut_Odds", "Win Odds": "Win_Odds", "T5 Odds": "T5_Odds", "T10 Odds": "T10_Odds", "T20 Odds": "T20_Odds", "CeilingVar": "ceiling_avg"}) showdown_working_proj = showdown_proj[['Name', 'Roster Position', 'Site', 'Type', 'Salary', 'ID', 'Cut%', 'Win Odds', 'T5 Odds', 'T10 Odds', 'T20 Odds', 'CeilingVar', 'Fantasy', 'Own%']] showdown_working_proj = showdown_working_proj.rename(columns={"Name": "Player", "Roster Position": "Position", "Fantasy": "Median", "Own%": "Own", "Cut%": "Cut_Odds", "Win Odds": "Win_Odds", "T5 Odds": "T5_Odds", "T10 Odds": "T10_Odds", "T20 Odds": "T20_Odds", "CeilingVar": "ceiling_avg"}) st.write("PGA data loaded successfully!") st.write("Generating Classic PGA ROO structure...") classic_roo = player_level_classic_roo(classic_working_proj, classic_stat_dicts, client) st.write("PGA Draftkings Classic ROO structure refreshed") st.write("Generating Classic PGA seed frames...") DK_seed_frame(classic_roo, classic_stat_dicts, client, "Classic") st.write("PGA Draftkings Classic Seed Frames refreshed") st.write("Generating Showdown PGA ROO structure...") showdown_roo = player_level_showdown_roo(showdown_working_proj, showdown_stat_dicts, client) st.write("PGA Draftkings Showdown ROO structure refreshed") st.write("Generating Showdown PGA seed frames...") DK_seed_frame(showdown_roo, showdown_stat_dicts, client, "Showdown") st.write("PGA Draftkings Showdown Seed Frames refreshed") st.success("✅ PGA updates completed successfully!") st.balloons() # ============================================================================ # MLB UPDATES TAB # ============================================================================ elif selected_tab == "MLB Updates": from sports.mlb_functions import * st.header("⚾ MLB Model Updates") st.info("MLB updates coming soon!") st.write("MLB functionality will be added in a future update.") # ============================================================================ # MMA UPDATES TAB # ============================================================================ elif selected_tab == "MMA Updates": from sports.mma_functions import * st.header("🥊 MMA Model Updates") # Column definitions str_columns = ['Fighter1', 'Opp'] float_columns = ['Avg Win', 'Avg Loss', 'Avg Draw', 'ToWin', 'To Win By KO/TKO/DQ', 'To Win By Submission', 'To Win By Decision', 'Draw', 'Round 1', 'Round 2', 'Round 3', 'Round 4', 'Round 5', 'By Decision', 'Average', 'OddsProj', 'SalaryProj', 'DeviationVar', 'FloorProj', 'AggProj', 'CeilingProj', 'OwnRaw', 'OwnAdj', 'Own'] int_columns = ['Salary', 'player_id'] if st.button("🔄 Run MMA Updates", type="primary", use_container_width=True): with st.spinner("Updating MMA models..."): st.write("Loading MMA data from Google Sheets...") try: sh = gc.open_by_url(MMA_Master_hold) worksheet = sh.worksheet('Export') projects_raw = DataFrame(worksheet.get_values()) except: sh = gc2.open_by_url(MMA_Master_hold) worksheet = sh.worksheet('Export') projects_raw = DataFrame(worksheet.get_values()) projects_raw.columns = projects_raw.iloc[0] projects_raw = projects_raw[1:] projects_raw = projects_raw.reset_index(drop=True) projects_raw = projects_raw.replace('', np_nan) projects_raw = projects_raw.dropna(subset=['Salary']) projects_raw['Position'] = 'FLEX' st.write("MMA data loaded successfully!") st.table(projects_raw.head(10)) for col in str_columns: projects_raw[col] = projects_raw[col].astype(str) for col in float_columns: projects_raw[col] = projects_raw[col].astype(float) for col in int_columns: projects_raw[col] = projects_raw[col].astype(int) fighter_dicts = {} for col in float_columns: fighter_dicts[col] = dict(zip(projects_raw['Fighter1'], projects_raw[col])) fighter_dicts['Opp'] = dict(zip(projects_raw['Fighter1'], projects_raw['Opp'])) fighter_dicts['player_id'] = dict(zip(projects_raw['Fighter1'], projects_raw['player_id'])) working_proj = projects_raw[['Fighter1', 'Position', 'Opp', 'Salary', 'FloorProj', 'AggProj', 'CeilingProj', 'Own']] working_proj = working_proj.rename(columns={"Fighter1": "Player", "FloorProj": "Floor", "AggProj": "Median", "CeilingProj": "Ceiling", "Own": "Own"}) st.write("Generating MMA ROO structure...") Overall_Proj = player_level_roo(working_proj, fighter_dicts, client) st.write("MMA Draftkings ROO structure refreshed") st.table(Overall_Proj.head(10)) try: discord.post(content="MMA Draftkings ROO structure refreshed") except: pass # Upload to database collection = mma_db['Player_Level_ROO'] Overall_Proj_copy = Overall_Proj.reset_index(drop=True) chunk_size = 100000 collection.drop() for i in range(0, len(Overall_Proj_copy), chunk_size): for _ in range(5): try: df_chunk = Overall_Proj_copy.iloc[i:i + chunk_size] collection.insert_many(df_chunk.to_dict('records'), ordered=False) break except Exception as e: st.write(f"Retry due to error: {e}") time_sleep(1) st.write("Generating MMA seed frames...") DK_seed_frame(Overall_Proj, fighter_dicts, client) st.write("MMA Draftkings Seed Frames refreshed") st.success("✅ MMA updates completed successfully!") st.balloons() # ============================================================================ # NASCAR UPDATES TAB # ============================================================================ elif selected_tab == "NASCAR Updates": from sports.nascar_functions import * st.header("🏎 NASCAR Model Updates") # Column definitions str_columns = ['Name', 'Roster Position', 'Site', 'Type'] float_columns = ['Grid', 'Laps Led', 'Fast Laps', 'FloorVar', 'CeilingVar', 'Fantasy', 'Own%'] int_columns = ['Salary', 'ID'] stat_columns = float_columns + int_columns if st.button("🔄 Run NASCAR Updates", type="primary", use_container_width=True): with st.spinner("Updating NASCAR models..."): st.write("Loading NASCAR data from Google Sheets...") try: sh = gc.open_by_url(NASCAR_Master_Hold) worksheet = sh.worksheet('Export') # worksheet = sh.worksheet('Test_DK_Projections') projects_raw = DataFrame(worksheet.get_values()) except: sh = gc2.open_by_url(NASCAR_Master_Hold) worksheet = sh.worksheet('Export') # worksheet = sh.worksheet('Test_DK_Projections') projects_raw = DataFrame(worksheet.get_values()) projects_raw.columns = projects_raw.iloc[0] projects_raw = projects_raw[1:] projects_raw = projects_raw.reset_index(drop=True) projects_raw = projects_raw.replace('', np_nan) projects_raw = projects_raw.dropna(subset=['Salary']) for col in str_columns: projects_raw[col] = projects_raw[col].astype(str) for col in float_columns: projects_raw[col] = projects_raw[col].str.replace('%', '').astype(float) for col in int_columns: projects_raw[col] = projects_raw[col].str.replace('%', '').astype(int) projects_raw = projects_raw[projects_raw['Fantasy'] > 0] projects_raw['Fantasy'] = projects_raw['Fantasy'] projects_raw['Own%'] = projects_raw['Own%'] classic_proj = projects_raw[projects_raw['Type'] == 'Classic'] classic_stat_dicts = {} for col in stat_columns: classic_stat_dicts[col] = dict(zip(classic_proj['Name'], classic_proj[col])) try: sh = gc.open_by_url(NASCAR_Master_Hold) worksheet = sh.worksheet('Export_2') # worksheet = sh.worksheet('Test_DK_Projections') projects_raw = DataFrame(worksheet.get_values()) except: sh = gc2.open_by_url(NASCAR_Master_Hold) worksheet = sh.worksheet('Export_2') # worksheet = sh.worksheet('Test_DK_Projections') projects_raw = DataFrame(worksheet.get_values()) projects_raw.columns = projects_raw.iloc[0] projects_raw = projects_raw[1:] projects_raw = projects_raw.reset_index(drop=True) projects_raw = projects_raw.replace('', np_nan) projects_raw = projects_raw.dropna(subset=['Salary']) for col in str_columns: projects_raw[col] = projects_raw[col].astype(str) for col in float_columns: projects_raw[col] = projects_raw[col].str.replace('%', '').astype(float) for col in int_columns: projects_raw[col] = projects_raw[col].str.replace('%', '').astype(int) projects_raw = projects_raw[projects_raw['Fantasy'] > 0] projects_raw['Fantasy'] = projects_raw['Fantasy'] projects_raw['Own%'] = projects_raw['Own%'] classic_proj_2 = projects_raw[projects_raw['Type'] == 'Classic'] classic_stat_dicts_2 = {} for col in stat_columns: classic_stat_dicts_2[col] = dict(zip(classic_proj_2['Name'], classic_proj_2[col])) classic_working_proj = classic_proj[['Name', 'Roster Position', 'Site', 'Type', 'Salary', 'ID', 'Grid', 'Laps Led', 'Fast Laps', 'FloorVar', 'CeilingVar', 'Fantasy', 'Own%']] classic_working_proj_2 = classic_proj_2[['Name', 'Roster Position', 'Site', 'Type', 'Salary', 'ID', 'Grid', 'Laps Led', 'Fast Laps', 'FloorVar', 'CeilingVar', 'Fantasy', 'Own%']] classic_working_proj = classic_working_proj.rename(columns={"Name": "Player", "Roster Position": "Position", "Fantasy": "Median", "Own%": "Own", "FloorVar": "floor_avg", "CeilingVar": "ceiling_avg"}) classic_working_proj_2 = classic_working_proj_2.rename(columns={"Name": "Player", "Roster Position": "Position", "Fantasy": "Median", "Own%": "Own", "FloorVar": "floor_avg", "CeilingVar": "ceiling_avg"}) st.write("Generating NASCAR ROO structure...") Overall_Proj = player_level_classic_roo(classic_working_proj, classic_stat_dicts, classic_working_proj_2, classic_stat_dicts_2, client, "Main Slate") st.write("NASCAR Draftkings ROO structure refreshed") st.table(Overall_Proj.head(10)) try: discord.post(content="NASCAR Draftkings ROO structure refreshed") except: pass # Upload to database collection = nascar_db['Player_Level_ROO'] Overall_Proj_copy = Overall_Proj.reset_index(drop=True) chunk_size = 100000 collection.drop() for i in range(0, len(Overall_Proj_copy), chunk_size): for _ in range(5): try: df_chunk = Overall_Proj_copy.iloc[i:i + chunk_size] collection.insert_many(df_chunk.to_dict('records'), ordered=False) break except Exception as e: st.write(f"Retry due to error: {e}") time_sleep(1) classic_roo = Overall_Proj[Overall_Proj['slate'] == 'Main Slate'] classic_roo_2 = Overall_Proj[Overall_Proj['slate'] == 'Secondary'] st.write("Generating NASCAR seed frames for Main Slate...") DK_seed_frame(classic_roo, classic_stat_dicts, client, "Classic") st.write("NASCAR Draftkings Seed Frames refreshed") st.write("Generating NASCAR seed frames for Secondary Slate...") DK_seed_frame(classic_roo_2, classic_stat_dicts_2, client, "Secondary") st.write("NASCAR Draftkings Seed Frames refreshed") st.success("✅ NASCAR updates completed successfully!") st.balloons()