Paydirt_model_updates / src /sports /nba_functions.py
James McCool
merging with local through NBA functions and GO scripts, need to do NHL and NFL as well and add MMA/PGA
51b21e0
# Numpy
from numpy import where as np_where
from numpy import random as np_random
from numpy import nan as np_nan
from numpy import array as np_array
from numpy import zeros as np_zeros
from numpy import clip as np_clip
# Pandas
from pandas import DataFrame
from pandas import merge as pd_merge
from pandas import concat as pd_concat
from pandas import Series as pd_Series
from pandas import errors as pd_errors
from pandas import merge, to_numeric
from pandas import options as poptions
from pandas import set_option as pd_set_option
# Time
import time
from datetime import datetime, timedelta
from time import sleep as time_sleep
from pytz import timezone as tz
from datetime import date
# Misc
from ortools.linear_solver import pywraplp
import re
import os
import subprocess
poptions.mode.chained_assignment = None # default='warn'
pd_set_option('future.no_silent_downcasting', True)
from warnings import simplefilter
simplefilter(action="ignore", category=pd_errors.PerformanceWarning)
from pymongo.mongo_client import MongoClient
from pymongo.server_api import ServerApi
# GO
import json
import subprocess
from random import choice
import streamlit as st
from database import *
# Ownership Models
from sports.NBA_own_regress import xgb_model, lgb_model, knn_model
#Set Timezone to Eastern time
ny = tz("America/New_York")
fmt = '%B %d, %Y %H:%M:%S'
timestart = datetime.now(ny)
# Try to connect with error handling
try:
# First attempt: Using SRV format
client = MongoClient(uri, server_api=ServerApi('1'))
# Test the connection
client.admin.command('ping')
st.write("Pinged your deployment. You successfully connected to MongoDB!")
except Exception as e:
st.write(f"SRV connection failed: {e}")
try:
# Second attempt: Try direct connection format
direct_uri = uri.replace('mongodb+srv://', 'mongodb://')
client = MongoClient(direct_uri, server_api=ServerApi('1'))
# Test the connection
client.admin.command('ping')
st.write("Pinged your deployment using direct connection!")
except Exception as e:
st.write(f"Direct connection failed: {e}")
# If both attempts fail, raise the error
raise
sh = gc.open_by_url(NBA_Master_hold)
try:
sh = gc.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Site_Info')
slate_info: DataFrame = DataFrame(worksheet.get_all_records())
slate_options: list[str] = ['Main Slate', 'Secondary Slate', 'Late Slate']
except:
sh = gc2.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Site_Info')
slate_info: DataFrame = DataFrame(worksheet.get_all_records())
slate_options: list[str] = ['Main Slate', 'Secondary Slate', 'Late Slate']
time.sleep(1)
worksheet = sh.worksheet('SD_Projections')
dk_sd_projections = DataFrame(worksheet.get_all_records())
dk_sd_projections = dk_sd_projections.replace('#N/A', np_nan)
dk_sd_projections = dk_sd_projections.dropna(subset=['Minutes'])
time.sleep(1)
worksheet = sh.worksheet('FD_SD_Projections')
fd_sd_projections = DataFrame(worksheet.get_all_records())
fd_sd_projections = fd_sd_projections.replace('#N/A', np_nan)
fd_sd_projections = fd_sd_projections.dropna(subset=['Minutes'])
dk_showdown_options = []
fd_showdown_options = []
for slates in dk_sd_projections['Slate'].unique():
dk_showdown_options.append(slates)
for slates in fd_sd_projections['Slate'].unique():
fd_showdown_options.append(slates)
nan_value: float = float("NaN")
sim_teams: list[str] = []
cut_slate: int = 0
model_version: int = 1
dk_roo_player_hold: DataFrame = DataFrame(columns=['Player', 'Minutes Proj', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish',
'20+%', '4x%', '5x%', '6x%', 'GPP%', 'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'ValX', 'player_id', 'site', 'version', 'slate'])
fd_roo_player_hold: DataFrame = DataFrame(columns=['Player', 'Minutes Proj', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish',
'20+%', '4x%', '5x%', '6x%', 'GPP%', 'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'ValX', 'player_id', 'site', 'version', 'slate'])
dk_sd_player_hold: DataFrame = DataFrame(columns=['Player', 'Minutes Proj', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish',
'20+%', '4x%', '5x%', '6x%', 'GPP%', 'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'ValX', 'player_id', 'site', 'version', 'slate'])
fd_sd_player_hold: DataFrame = DataFrame(columns=['Player', 'Minutes Proj', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish',
'20+%', '4x%', '5x%', '6x%', 'GPP%', 'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'ValX', 'player_id', 'site', 'version', 'slate'])
############----------FUNCTION FOR SHOWDOWN SEED FRAME PROCESS WITH GO PACKAGE----------############
def run_go_showdown_lineup_generator(site="DK", sport="NBA"):
"""Run the Go lineup generator after Python data processing"""
try:
st.write(f"Starting Go {sport} Showdown lineup generation...")
start_time = time.time()
# Determine the path to the Go binary
current_dir = os.path.dirname(os.path.abspath(__file__))
project_root = os.path.dirname(os.path.dirname(current_dir))
go_binary = os.path.join(project_root, "showdown_go", "showdown_seed_frames")
st.write(f"Looking for binary at: {go_binary}")
# Run the Go executable
result = subprocess.run(
[go_binary, site, sport],
capture_output=True,
text=True,
check=True,
cwd=project_root
)
end_time = time.time()
st.write(f"Go {sport} Showdown processing completed in {end_time - start_time:.2f} seconds")
if result.stdout:
st.write("Go output:", result.stdout)
if result.stderr:
st.write("Go warnings:", result.stderr)
return True
except subprocess.CalledProcessError as e:
st.write(f"Go process failed with exit code {e.returncode}")
if e.stdout:
st.write("Stdout:", e.stdout)
if e.stderr:
st.write("Error output:", e.stderr)
return False
except FileNotFoundError as e:
st.write(f"Error: Go binary not found at {go_binary}")
st.write(f"FileNotFoundError: {e}")
st.write(f"Current working directory: {os.getcwd()}")
st.write(f"Project root: {project_root}")
return False
def run_go_classic_lineup_generator(site="DK", sport="NBA"):
"""Run the Go lineup generator after Python data processing"""
try:
st.write(f"Starting Go {sport} lineup generation...")
start_time = time.time()
# Determine the path to the Go binary
# __file__ is at /app/src/sports/nba_functions.py
# Binaries are at /app/dk_nba_go/ and /app/fd_nba_go/ (per Dockerfile)
current_dir = os.path.dirname(os.path.abspath(__file__)) # /app/src/sports/
project_root = os.path.dirname(os.path.dirname(current_dir)) # /app/
if site == "DK":
go_binary = os.path.join(project_root, "dk_nba_go", "NBA_seed_frames")
else:
go_binary = os.path.join(project_root, "fd_nba_go", "NBA_seed_frames")
st.write(f"Looking for binary at: {go_binary}")
# Run the Go executable
result = subprocess.run(
[go_binary, site, sport],
capture_output=True,
text=True,
check=True,
cwd=project_root # Run from project root
)
end_time = time.time()
st.write(f"Go {sport} processing completed in {end_time - start_time:.2f} seconds")
if result.stdout:
st.write("Go output:", result.stdout)
if result.stderr:
st.write("Go warnings:", result.stderr)
return True
except subprocess.CalledProcessError as e:
st.write(f"Go process failed with exit code {e.returncode}")
if e.stdout:
st.write("Stdout:", e.stdout)
if e.stderr:
st.write("Error output:", e.stderr)
return False
except FileNotFoundError as e:
st.write(f"Error: Go binary not found at {go_binary}")
st.write(f"FileNotFoundError: {e}")
st.write(f"Current working directory: {os.getcwd()}")
st.write(f"Project root: {project_root}")
return False
except Exception as e:
st.write(f"Unexpected error: {e}")
return False
############----------FUNCTION FOR LINEUP OPTIMIZATION AND COMBO GENERATION----------############
def init_team_results(model_source: DataFrame, position_reqs: dict, salary_cap: int, max_stack_players: int, teams_to_optimize: list, combos: int):
df = model_source.copy()
# Parse eligible positions for each player
df['eligible_positions'] = df['Position'].apply(lambda x: x.split('/'))
# Store results for all teams
all_team_results = []
st.write(position_reqs)
st.write(f"Optimizing {len(teams_to_optimize)} teams")
for target_team in teams_to_optimize:
filtered_df = df.copy()
# Create a new solver for each team
solver = pywraplp.Solver.CreateSolver('SCIP')
if not solver:
raise Exception("Could not create solver.")
# Variables: x[i, pos] = 1 if player i is used at position pos
x = {}
for i, row in filtered_df.iterrows():
for pos in row['eligible_positions']:
x[(i, pos)] = solver.BoolVar(f'x_{i}_{pos}')
# Create variables for composite positions (G, F)
if 'G' in position_reqs:
for i, row in filtered_df.iterrows():
if any(p in row['eligible_positions'] for p in ['PG', 'SG']):
x[(i, 'G')] = solver.BoolVar(f'x_{i}_G')
if 'F' in position_reqs:
for i, row in filtered_df.iterrows():
if any(p in row['eligible_positions'] for p in ['SF', 'PF']):
x[(i, 'F')] = solver.BoolVar(f'x_{i}_F')
# Special FLEX variable for FanDuel
util_x = {}
if 'FLEX' in position_reqs:
for i, row in filtered_df.iterrows():
util_positions = ['PG', 'SG', 'SF', 'PF', 'C']
if any(pos in row['eligible_positions'] for pos in util_positions):
util_x[i] = solver.BoolVar(f'util_{i}')
# Each player can only be used once (including FLEX)
for i in filtered_df.index:
constraint_terms = [x[(i, pos)] for pos in filtered_df.loc[i, 'eligible_positions']]
if 'FLEX' in position_reqs and i in util_x:
constraint_terms.append(util_x[i])
if 'G' in position_reqs and (i, 'G') in x:
constraint_terms.append(x[(i, 'G')])
if 'F' in position_reqs and (i, 'F') in x:
constraint_terms.append(x[(i, 'F')])
solver.Add(solver.Sum(constraint_terms) <= 1)
# Standard DraftKings requirements
for pos, req in position_reqs.items():
if pos == 'G':
# G position can accept PG or SG
pos_players = [i for i in filtered_df.index
if any(p in filtered_df.loc[i, 'eligible_positions'] for p in ['PG', 'SG'])]
elif pos == 'F':
# F position can accept SF or PF
pos_players = [i for i in filtered_df.index
if any(p in filtered_df.loc[i, 'eligible_positions'] for p in ['SF', 'PF'])]
elif pos == 'FLEX':
# FLEX can accept any position
pos_players = [i for i in filtered_df.index
if any(p in filtered_df.loc[i, 'eligible_positions'] for p in ['PG', 'SG', 'SF', 'PF', 'C'])]
else:
# Regular positions (PG, SG, SF, PF, C) - exact match
pos_players = [i for i in filtered_df.index if pos in filtered_df.loc[i, 'eligible_positions']]
if pos_players:
if pos == 'FLEX':
# FLEX uses util_x dictionary
solver.Add(solver.Sum([util_x[i] for i in pos_players if i in util_x]) == req)
else:
# Regular positions, G, and F use x dictionary
solver.Add(solver.Sum([x[(i, pos)] for i in pos_players]) == req)
# Salary cap (include FLEX players)
salary_terms = []
for i in filtered_df.index:
for pos in filtered_df.loc[i, 'eligible_positions']:
salary_terms.append(x[(i, pos)] * filtered_df.loc[i, 'Salary'])
if 'FLEX' in position_reqs and i in util_x:
salary_terms.append(util_x[i] * filtered_df.loc[i, 'Salary'])
if 'G' in position_reqs and (i, 'G') in x:
salary_terms.append(x[(i, 'G')] * filtered_df.loc[i, 'Salary'])
if 'F' in position_reqs and (i, 'F') in x:
salary_terms.append(x[(i, 'F')] * filtered_df.loc[i, 'Salary'])
solver.Add(solver.Sum(salary_terms) <= salary_cap)
# Max hitters per team (exclude P/SP positions, include UTIL)
teams = filtered_df['Team'].unique()
for team in teams:
team_constraint_terms = []
for i in filtered_df.index:
if filtered_df.loc[i, 'Team'] == team:
for pos in filtered_df.loc[i, 'eligible_positions']:
team_constraint_terms.append(x[(i, pos)])
if 'FLEX' in position_reqs and i in util_x:
team_constraint_terms.append(util_x[i])
if 'G' in position_reqs and (i, 'G') in x:
team_constraint_terms.append(x[(i, 'G')])
if 'F' in position_reqs and (i, 'F') in x:
team_constraint_terms.append(x[(i, 'F')])
solver.Add(solver.Sum(team_constraint_terms) <= max_stack_players)
# Total players constraint (include FLEX, G, F)
total_players = solver.Sum(x[(i, pos)] for i in filtered_df.index for pos in filtered_df.loc[i, 'eligible_positions'])
if 'FLEX' in position_reqs:
total_players += solver.Sum([util_x[i] for i in util_x.keys()])
if 'G' in position_reqs:
total_players += solver.Sum([x[(i, 'G')] for i in filtered_df.index if (i, 'G') in x])
if 'F' in position_reqs:
total_players += solver.Sum([x[(i, 'F')] for i in filtered_df.index if (i, 'F') in x])
solver.Add(total_players == sum(position_reqs.values()))
# Find the highest median player from the target team
exclude_positions = []
target_team_hitters = filtered_df[filtered_df['Team'] == target_team]
if not target_team_hitters.empty:
# Get the highest median player from the target team
highest_median_player = target_team_hitters.loc[target_team_hitters['Median'].idxmax()]
highest_median_idx = highest_median_player.name
# Force the highest median player to be included in the lineup
# Find which position(s) this player is eligible for
eligible_positions = highest_median_player['eligible_positions']
# Create constraint to force this player to be used in at least one eligible position
highest_median_constraint = solver.Sum([
x[(highest_median_idx, pos)] for pos in eligible_positions
])
# Add FLEX, G, F constraint if applicable
if 'G' in position_reqs and (highest_median_idx, 'G') in x:
highest_median_constraint += x[(highest_median_idx, 'G')]
if 'F' in position_reqs and (highest_median_idx, 'F') in x:
highest_median_constraint += x[(highest_median_idx, 'F')]
if 'FLEX' in position_reqs and highest_median_idx in util_x:
highest_median_constraint += util_x[highest_median_idx]
solver.Add(highest_median_constraint >= 1)
# Force exactly max_hitters players from target team
target_team_constraint_terms = []
for i in filtered_df.index:
if filtered_df.loc[i, 'Team'] == target_team:
for pos in filtered_df.loc[i, 'eligible_positions']:
target_team_constraint_terms.append(x[(i, pos)])
if 'FLEX' in position_reqs and i in util_x:
target_team_constraint_terms.append(util_x[i])
if 'G' in position_reqs and (i, 'G') in x:
target_team_constraint_terms.append(x[(i, 'G')])
if 'F' in position_reqs and (i, 'F') in x:
target_team_constraint_terms.append(x[(i, 'F')])
solver.Add(solver.Sum(target_team_constraint_terms) == max_stack_players)
# Objective: maximize total median (include FLEX)
objective_terms = []
for i in filtered_df.index:
for pos in filtered_df.loc[i, 'eligible_positions']:
objective_terms.append(x[(i, pos)] * filtered_df.loc[i, 'Median'])
if 'FLEX' in position_reqs and i in util_x:
objective_terms.append(util_x[i] * filtered_df.loc[i, 'Median'])
if 'G' in position_reqs and (i, 'G') in x:
objective_terms.append(x[(i, 'G')] * filtered_df.loc[i, 'Median'])
if 'F' in position_reqs and (i, 'F') in x:
objective_terms.append(x[(i, 'F')] * filtered_df.loc[i, 'Median'])
solver.Maximize(solver.Sum(objective_terms))
status = solver.Solve()
if status == pywraplp.Solver.OPTIMAL or status == pywraplp.Solver.FEASIBLE:
selected = [
(i, pos)
for (i, pos), var in x.items()
if var.solution_value() > 0.5
]
# Add FLEX players to the selected list
if 'FLEX' in position_reqs:
util_selected = [
(i, 'FLEX')
for i, var in util_x.items()
if var.solution_value() > 0.5
]
selected.extend(util_selected)
lineup = DataFrame([
{**filtered_df.loc[i].to_dict(), 'assigned_position': pos}
for (i, pos) in selected
])
# Assign unique position labels for duplicate positions (e.g., OF1, OF2, OF3, SP1, SP2)
position_counts = {}
position_labels = []
for pos in lineup['assigned_position']:
if pos not in position_counts:
position_counts[pos] = 1
else:
position_counts[pos] += 1
label = f"{pos}{position_counts[pos]}" if position_counts[pos] > 1 else pos
position_labels.append(label)
lineup['position_label'] = position_labels
# Build the single-row dictionary
row_dict = {row['position_label']: row['Name'] for _, row in lineup.iterrows()}
row_dict['Total_Salary'] = lineup['Salary'].sum()
row_dict['Total_Median'] = lineup['Median'].sum()
row_dict['Own'] = lineup['Own'].sum()
row_dict['Target_Team'] = target_team
# Convert to DataFrame
result_df = DataFrame([row_dict])
st.write(result_df)
# Generate variations for this team
result_rows = [row_dict.copy()]
st.write(result_rows)
st.write(f"Generating {combos} variations for {target_team}")
for _ in range(combos):
# Copy the current optimal lineup row
new_row = row_dict.copy()
# Get all position labels (e.g., 'OF1', 'SP2', etc.)
pos_labels = [k for k in new_row.keys() if k not in ['Total_Salary', 'Total_Median', 'Target_Team', 'Own']]
# Track which positions have been swapped in this iteration
swapped_positions = []
# Determine number of positions to swap (1 or 2)
num_swaps = choice([1, 2])
for swap_num in range(num_swaps):
# Get available positions (exclude already swapped positions)
available_positions = [pos for pos in pos_labels if pos not in swapped_positions]
if not available_positions:
break
pos_to_swap = choice(available_positions)
# Add the position to our swapped tracking list
swapped_positions.append(pos_to_swap)
# ... existing code for finding replacement player ...
# Find the assigned position (e.g., 'OF', 'SP', etc.)
match = re.match(r'[A-Z]+', pos_to_swap.strip())
if match:
assigned_pos = match.group()
else:
continue
# Handle special positions
if assigned_pos == 'FLEX':
util_positions = ['PG', 'SG', 'SF', 'PF', 'C']
eligible = filtered_df[
filtered_df['eligible_positions'].apply(lambda pos_list: any(pos in pos_list for pos in util_positions)) &
(~filtered_df['Name'].isin(new_row.values()))
]
elif assigned_pos == 'G':
# G position can accept PG or SG
eligible = filtered_df[
filtered_df['eligible_positions'].apply(lambda pos_list: any(pos in pos_list for pos in ['PG', 'SG'])) &
(~filtered_df['Name'].isin(new_row.values()))
]
elif assigned_pos == 'F':
# F position can accept SF or PF
eligible = filtered_df[
filtered_df['eligible_positions'].apply(lambda pos_list: any(pos in pos_list for pos in ['SF', 'PF'])) &
(~filtered_df['Name'].isin(new_row.values()))
]
else:
# Regular position - must match exactly
eligible = filtered_df[
filtered_df['eligible_positions'].apply(lambda pos_list: assigned_pos in pos_list) &
(~filtered_df['Name'].isin(new_row.values()))
]
if eligible.empty:
continue
# Randomly select a replacement
replacement = eligible.sample(1).iloc[0]
new_row[pos_to_swap] = replacement['Name']
# Recalculate totals
# Get the DataFrame rows for all players in the new lineup
player_rows = filtered_df[filtered_df['Name'].isin([new_row[k] for k in pos_labels])]
new_row['Total_Salary'] = player_rows['Salary'].sum()
new_row['Total_Median'] = player_rows['Median'].sum()
new_row['Own'] = player_rows['Own'].sum()
result_rows.append(new_row)
# Create the final DataFrame for this team
final_df = DataFrame(result_rows)
# Get all position columns (exclude totals)
pos_labels = [col for col in final_df.columns if col not in ['Total_Salary', 'Total_Median', 'Target_Team', 'Own']]
# Create a mapping from player name to team for fast lookup
player_team_map = filtered_df.set_index('Name')['Team'].to_dict()
# Count target team players in each row
def count_target_team(row):
return sum(1 for pos in pos_labels if player_team_map.get(row[pos], None) == target_team)
final_df['Stack'] = final_df.apply(count_target_team, axis=1)
final_df = final_df.drop_duplicates(subset=['Total_Median', 'Total_Salary'])
final_df = final_df[final_df['Total_Salary'] <= salary_cap]
final_df = final_df[final_df['Stack'] <= max_stack_players]
final_df = final_df.sort_values(by='Total_Median', ascending=False)
# Add to all results
all_team_results.append(final_df)
return all_team_results
############----------FUNCTION FOR FORMATTING GENERATED COMBOS INTO SEED FRAMES----------############
def format_optimals(all_team_results: list, model_source: DataFrame, required_positions: list):
roo_frame = model_source.copy()
combined_df = pd_concat(all_team_results, ignore_index=True)
combined_df = combined_df.sort_values(by='Total_Median', ascending=False)
# Create the final DataFrame with the specified column format
final_formatted_df = DataFrame()
# Get all position columns (exclude totals and other metadata)
pos_columns = [col for col in combined_df.columns if col not in ['Total_Salary', 'Total_Median', 'Target_Team', 'Stack', 'Own']]
# Create a mapping from player name to team for fast lookup
player_team_map = roo_frame.set_index('Name')['Team'].to_dict()
player_salary_map = roo_frame.set_index('Name')['Salary'].to_dict()
player_median_map = roo_frame.set_index('Name')['Median'].to_dict()
player_own_map = roo_frame.set_index('Name')['Own'].to_dict()
# Process each row to create the formatted structure
formatted_rows = []
for _, row in combined_df.iterrows():
new_row = {}
# Basic columns
new_row['salary'] = row['Total_Salary']
new_row['proj'] = row['Total_Median']
new_row['Own'] = row['Own']
new_row['Team'] = row['Target_Team']
new_row['Team_count'] = row['Stack']
# Calculate Secondary team (second most frequent team)
team_counts = {}
for pos in pos_columns:
player = row[pos]
if player in player_team_map:
team = player_team_map[player]
team_counts[team] = team_counts.get(team, 0) + 1
# Find the second most frequent team (excluding the target team)
sorted_teams = sorted(team_counts.items(), key=lambda x: x[1], reverse=True)
secondary_team = 'None'
secondary_count = 0
for team, count in sorted_teams:
if team != row['Target_Team']:
secondary_team = team
secondary_count = count
break
new_row['Secondary'] = secondary_team
new_row['Secondary_count'] = secondary_count
# Add position columns
for pos in pos_columns:
new_row[pos] = row[pos]
formatted_rows.append(new_row)
final_formatted_df = DataFrame(formatted_rows)
# Ensure all required position columns exist (in case some are missing)
for pos in required_positions:
if pos not in final_formatted_df.columns:
final_formatted_df[pos] = ''
# Reorder columns to match the specified format
column_order = ['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'] + required_positions
final_formatted_df = final_formatted_df[column_order]
return final_formatted_df
def trending_script():
currentdt = datetime.now()
finaldt = (currentdt.strftime("%Y-%m-%d"))
past_three = date.today()-timedelta(days=3)
past_three = (past_three.strftime("%Y-%m-%d"))
past_week = date.today()-timedelta(days=7)
past_week = (past_week.strftime("%Y-%m-%d"))
past_month = date.today()-timedelta(days=90)
past_month = (past_month.strftime("%Y-%m-%d"))
start_frame = DataFrame()
boost_player = []
try:
sh = gc.open_by_url('https://docs.google.com/spreadsheets/d/1Yq0vGriWK-bS79e-bD6_u9pqrYE6Yrlbb_wEkmH-ot0/edit#gid=1459432770')
worksheet = sh.worksheet('Gamelog')
player_data = DataFrame(worksheet.get_all_records())
except:
time_sleep(3)
sh = gc2.open_by_url('https://docs.google.com/spreadsheets/d/1Yq0vGriWK-bS79e-bD6_u9pqrYE6Yrlbb_wEkmH-ot0/edit#gid=1459432770')
worksheet = sh.worksheet('Gamelog')
player_data = DataFrame(worksheet.get_all_records())
player_data = player_data.sort_values(by='GAME_DATE', ascending=False)
team_list = player_data['TEAM_NAME'].unique().tolist()
player_data['FPPM'] = player_data['FPPM'].replace('', 0)
player_data['FPPM'] = player_data['FPPM'].astype(float)
L3_frame = DataFrame(columns=player_data.columns)
L5_frame = DataFrame(columns=player_data.columns)
L10_frame = DataFrame(columns=player_data.columns)
season_frame = DataFrame(columns=player_data.columns)
for teams in team_list:
team_data = player_data[(player_data['TEAM_NAME'] == teams) & (player_data['SEASON_ID'] == 22025)]
L3_games_list = team_data['GAME_DATE'].unique().tolist()[:3]
L5_games_list = team_data['GAME_DATE'].unique().tolist()[:5]
L10_games_list = team_data['GAME_DATE'].unique().tolist()[:10]
season_games_list = team_data['GAME_DATE'].unique().tolist()
team_data_parse = team_data[team_data['GAME_DATE'].isin(L3_games_list)]
L3_frame = pd_concat([L3_frame.dropna(axis=1, how='all'), team_data_parse.dropna(axis=1, how='all')])
team_data_parse = team_data[team_data['GAME_DATE'].isin(L5_games_list)]
L5_frame = pd_concat([L5_frame.dropna(axis=1, how='all'), team_data_parse.dropna(axis=1, how='all')])
team_data_parse = team_data[team_data['GAME_DATE'].isin(L10_games_list)]
L10_frame = pd_concat([L10_frame.dropna(axis=1, how='all'), team_data_parse.dropna(axis=1, how='all')])
team_data_parse = team_data[team_data['GAME_DATE'].isin(season_games_list)]
season_frame = pd_concat([season_frame.dropna(axis=1, how='all'), team_data_parse.dropna(axis=1, how='all')])
#------ BUILD DRAFTKINGS TRENDING TABLE ------#
L3_file = L3_frame
L3_file = L3_file[['GAME_DATE', 'TEAM_NAME', 'PLAYER_NAME', 'TEAM_ABBREVIATION', 'MIN', 'Fantasy', 'FD_Fantasy', 'FPPM']]
L3_file = L3_file.sort_values(by=['TEAM_NAME', 'GAME_DATE'], ascending=[True, False])
L3_file = L3_file.groupby(by=['PLAYER_NAME']).head(3).sort_values(by='GAME_DATE', ascending=False)
L3_file_test = L3_file[L3_file['TEAM_NAME'] == 'New Orleans Pelicans']
L3_file['L3 MIN'] = L3_file.groupby(['PLAYER_NAME'])['MIN'].transform('mean')
L3_file['L3 Fantasy'] = L3_file.groupby(['PLAYER_NAME'])['Fantasy'].transform('mean')
L3_min_sum = L3_file.groupby(['PLAYER_NAME'])['MIN'].transform('sum')
L3_file['L3 FPPM'] = L3_file.groupby(['PLAYER_NAME'])['Fantasy'].transform('sum') / L3_min_sum.replace(0, np_nan)
L3_file['L3 Ceiling'] = L3_file.groupby(['PLAYER_NAME'])['Fantasy'].transform(lambda x: x.quantile(.85))
L3_file['L3 FD_Fantasy'] = L3_file.groupby(['PLAYER_NAME'])['FD_Fantasy'].transform('sum') / L3_min_sum.replace(0, np_nan)
L3_file['L3 FD_Ceiling'] = L3_file.groupby(['PLAYER_NAME'])['FD_Fantasy'].transform(lambda x: x.quantile(.85))
L3_file = L3_file.drop_duplicates(subset=['PLAYER_NAME'])
L3_file_check = L3_file[['PLAYER_NAME', 'TEAM_NAME', 'L3 MIN', 'L3 Fantasy', 'L3 FPPM', 'L3 Ceiling', 'L3 FD_Fantasy', 'L3 FD_Ceiling']]
L3_file = L3_file[['PLAYER_NAME', 'L3 MIN', 'L3 Fantasy', 'L3 FPPM', 'L3 Ceiling', 'L3 FD_Fantasy', 'L3 FD_Ceiling']]
L5_file = L5_frame
L5_file = L5_file[['GAME_DATE', 'TEAM_NAME', 'PLAYER_NAME', 'TEAM_ABBREVIATION', 'MIN', 'Fantasy', 'FD_Fantasy', 'FPPM']]
L5_file = L5_file.sort_values(by=['TEAM_NAME', 'GAME_DATE'], ascending=[True, False])
L5_file = L5_file.groupby(by=['PLAYER_NAME']).head(5).sort_values(by='GAME_DATE', ascending=False)
L5_file['L5 MIN'] = L5_file.groupby(['PLAYER_NAME'])['MIN'].transform('mean')
L5_file['L5 Fantasy'] = L5_file.groupby(['PLAYER_NAME'])['Fantasy'].transform('mean')
L5_min_sum = L5_file.groupby(['PLAYER_NAME'])['MIN'].transform('sum')
L5_file['L5 FPPM'] = L5_file.groupby(['PLAYER_NAME'])['Fantasy'].transform('sum') / L5_min_sum.replace(0, np_nan)
L5_file['L5 Ceiling'] = L5_file.groupby(['PLAYER_NAME'])['Fantasy'].transform(lambda x: x.quantile(.85))
L5_file['L5 FD_Fantasy'] = L5_file.groupby(['PLAYER_NAME'])['FD_Fantasy'].transform('sum') / L5_min_sum.replace(0, np_nan)
L5_file['L5 FD_Ceiling'] = L5_file.groupby(['PLAYER_NAME'])['FD_Fantasy'].transform(lambda x: x.quantile(.85))
L5_file = L5_file.drop_duplicates(subset=['PLAYER_NAME'])
L5_file_check = L5_file[['PLAYER_NAME', 'TEAM_NAME', 'L5 MIN', 'L5 Fantasy', 'L5 FPPM', 'L5 Ceiling', 'L5 FD_Fantasy', 'L5 FD_Ceiling']]
L5_file = L5_file[['PLAYER_NAME', 'L5 MIN', 'L5 Fantasy', 'L5 FPPM', 'L5 Ceiling', 'L5 FD_Fantasy', 'L5 FD_Ceiling']]
L10_file = L10_frame
L10_file = L10_file[['GAME_DATE', 'TEAM_NAME', 'PLAYER_NAME', 'TEAM_ABBREVIATION', 'MIN', 'Fantasy', 'FD_Fantasy', 'FPPM']]
L10_file = L10_file.sort_values(by=['TEAM_NAME', 'GAME_DATE'], ascending=[True, False])
L10_file = L10_file.groupby(by=['PLAYER_NAME']).head(10).sort_values(by='GAME_DATE', ascending=False)
L10_file['L10 MIN'] = L10_file.groupby(['PLAYER_NAME'])['MIN'].transform('mean')
L10_file['L10 Fantasy'] = L10_file.groupby(['PLAYER_NAME'])['Fantasy'].transform('mean')
L10_min_sum = L10_file.groupby(['PLAYER_NAME'])['MIN'].transform('sum')
L10_file['L10 FPPM'] = L10_file.groupby(['PLAYER_NAME'])['Fantasy'].transform('sum') / L10_min_sum.replace(0, np_nan)
L10_file['L10 Ceiling'] = L10_file.groupby(['PLAYER_NAME'])['Fantasy'].transform(lambda x: x.quantile(.85))
L10_file['L10 FD_Fantasy'] = L10_file.groupby(['PLAYER_NAME'])['FD_Fantasy'].transform('sum') / L10_min_sum.replace(0, np_nan)
L10_file['L10 FD_Ceiling'] = L10_file.groupby(['PLAYER_NAME'])['FD_Fantasy'].transform(lambda x: x.quantile(.85))
L10_file = L10_file.drop_duplicates(subset=['PLAYER_NAME'])
L10_file_check = L10_file[['PLAYER_NAME', 'TEAM_NAME', 'L10 MIN', 'L10 Fantasy', 'L10 FPPM', 'L10 Ceiling', 'L10 FD_Fantasy', 'L10 FD_Ceiling']]
L10_file = L10_file[['PLAYER_NAME', 'L10 MIN', 'L10 Fantasy', 'L10 FPPM', 'L10 Ceiling', 'L10 FD_Fantasy', 'L10 FD_Ceiling']]
season_file = season_frame
season_file = season_file[['GAME_DATE', 'TEAM_NAME', 'PLAYER_NAME', 'TEAM_ABBREVIATION', 'MIN', 'Fantasy', 'FD_Fantasy', 'FPPM']]
season_file = season_file.sort_values(by=['TEAM_NAME', 'GAME_DATE'], ascending=[True, False])
season_file['Season MIN'] = season_file.groupby(['PLAYER_NAME'])['MIN'].transform('mean')
season_file['Season Fantasy'] = season_file.groupby(['PLAYER_NAME'])['Fantasy'].transform('mean')
season_min_sum = season_file.groupby(['PLAYER_NAME'])['MIN'].transform('sum')
season_file['Season FPPM'] = season_file.groupby(['PLAYER_NAME'])['Fantasy'].transform('sum') / season_min_sum.replace(0, np_nan)
season_file['Season Ceiling'] = season_file.groupby(['PLAYER_NAME'])['Fantasy'].transform(lambda x: x.quantile(.85))
season_file['Season FD_Fantasy'] = season_file.groupby(['PLAYER_NAME'])['FD_Fantasy'].transform('sum') / season_min_sum.replace(0, np_nan)
season_file['Season FD_Ceiling'] = season_file.groupby(['PLAYER_NAME'])['FD_Fantasy'].transform(lambda x: x.quantile(.85))
season_file = season_file.drop_duplicates(subset=['PLAYER_NAME'])
season_file_check = season_file[['PLAYER_NAME', 'TEAM_NAME', 'Season MIN', 'Season Fantasy', 'Season FPPM', 'Season Ceiling', 'Season FD_Fantasy', 'Season FD_Ceiling']]
season_file = season_file[['PLAYER_NAME', 'Season MIN', 'Season Fantasy', 'Season FPPM', 'Season Ceiling', 'Season FD_Fantasy', 'Season FD_Ceiling']]
Trending_df = season_file.merge(L10_file, how='left').merge(L5_file, how ='left').merge(L3_file, how ='left')
Trending_df = Trending_df.sort_values(by='L5 Fantasy', ascending=False)
Trending_df = Trending_df.replace(np_nan, 0)
try:
worksheet = sh.worksheet('Trending')
worksheet.batch_clear(['A:S'])
worksheet.update([Trending_df.columns.values.tolist()] + Trending_df.values.tolist())
except:
worksheet = sh.worksheet('Trending')
worksheet.batch_clear(['A:S'])
worksheet.update([Trending_df.columns.values.tolist()] + Trending_df.values.tolist())
def DK_NBA_ROO_Build(dk_roo_player_hold):
total_sims = 1000
wrong_name = ['Lu Dort', 'Carlton Carrington']
right_name = ['Luguentz Dort', 'Bub Carrington']
for slates in slate_options:
if slates == 'Main Slate':
roo_team_list = slate_info['DK Main'].dropna().values.tolist()
try:
sh = gc.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('DK_Build_Up')
projects_raw = DataFrame(worksheet.get_values())
except:
sh = gc2.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('DK_Build_Up')
projects_raw = DataFrame(worksheet.get_values())
elif slates == 'Secondary Slate':
roo_team_list = slate_info['DK Secondary'].dropna().values.tolist()
try:
sh = gc.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Secondary_DK_Build')
projects_raw = DataFrame(worksheet.get_values())
except:
sh = gc2.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Secondary_DK_Build')
projects_raw = DataFrame(worksheet.get_values())
elif slates == 'Late Slate':
roo_team_list = slate_info['DK Late'].dropna().values.tolist()
try:
sh = gc.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Late_DK_Build')
projects_raw = DataFrame(worksheet.get_values())
except:
sh = gc2.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Late_DK_Build')
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[projects_raw['Team'].isin(roo_team_list)]
projects_raw = projects_raw.rename(columns={"Name": "Player", "Nickname": "Player", "Fantasy": "Median"})
for checkVar in range(len(wrong_name)):
projects_raw['Player'] = projects_raw['Player'].replace(wrong_name, right_name)
projects_raw = projects_raw.replace("", np_nan)
str_columns = ['Player', 'Position', 'Team', 'Opp', 'Sample']
numeric_columns = [col for col in projects_raw.columns if col not in str_columns]
projects_raw[numeric_columns] = projects_raw[numeric_columns].apply(to_numeric, errors='coerce')
projects_raw = projects_raw.loc[projects_raw['Salary'] > 0]
projects_raw = projects_raw.loc[projects_raw['Median'] > 0]
dk_df = projects_raw.sort_values(by='Median', ascending=False)
basic_own_df = dk_df.copy()
basic_own_df = basic_own_df[basic_own_df['Team'].isin(roo_team_list)]
basic_own_df['name_team'] = basic_own_df['Player'] + basic_own_df['Position']
# Prepare the current data with the same feature engineering
basic_own_df['Actual'] = basic_own_df['Median'] # Rename to match training
basic_own_df['value'] = basic_own_df['Actual'] / (basic_own_df['Salary'] / 1000)
basic_own_df['value_adv'] = basic_own_df['value'] - basic_own_df['value'].mean()
basic_own_df['actual_adv'] = basic_own_df['Actual'] - basic_own_df['Actual'].mean()
# Create the same engineered features
# Assuming all rows are from the same contest (current slate)
basic_own_df['contest_size'] = len(basic_own_df) # All players in current slate
# Create value_play feature (same logic as training)
basic_own_df['value_play'] = np_where(
(basic_own_df['Salary'] <= 4000) &
(basic_own_df['Actual'] / (basic_own_df['Salary'] / 1000) >= 6.0),
1, 0
)
basic_own_df['value_density'] = basic_own_df['value_play'].sum() / basic_own_df['Player'].count()
basic_own_df['base_ownership'] = 800.0 / basic_own_df['contest_size']
basic_own_df['strong_play'] = np_where((basic_own_df['Actual'] / (basic_own_df['Salary'] / 1000) >= 6.0), 1, 0)
basic_own_df['punt_play'] = np_where((basic_own_df['Salary'] < 3500) & (basic_own_df['Actual'] / (basic_own_df['Salary'] / 1000) >= 5.0), 1, 0)
basic_own_df['ownership_share'] = basic_own_df['Own'].sum() / basic_own_df['Player'].count() * 800
feature_cols = ['Salary', 'Actual', 'actual_adv', 'value', 'value_adv', 'contest_size', 'base_ownership', 'value_play', 'value_density', 'strong_play', 'punt_play']
X_current = basic_own_df[feature_cols]
# Make predictions with all your models
basic_own_df['XGB'] = np_clip(xgb_model.predict(X_current), 0, 100)
basic_own_df['LGB'] = np_clip(lgb_model.predict(X_current), 0, 100) * 100
basic_own_df['KNN'] = np_clip(knn_model.predict(X_current), 0, 100)
# Create combo prediction
basic_own_df['Combo'] = (
(basic_own_df['XGB'] * .30) +
(basic_own_df['LGB'] * .30) +
(basic_own_df['KNN'] * .40)
)
basic_own_df['Combo'] = np_where((basic_own_df['value'] < 5.0) & (basic_own_df['Salary'] < 9000), basic_own_df['Combo'] * .75, basic_own_df['Combo'])
basic_own_df['Combo'] = np_where((basic_own_df['Median'] < 18.0), basic_own_df['Combo'] * .33, basic_own_df['Combo'])
basic_own_df['Combo'] = np_where((basic_own_df['Salary'] > 5000) & (basic_own_df['value'] < 4.5), 1, basic_own_df['Combo'])
basic_own_df['Combo'] = np_where(basic_own_df['value'] > 6.0, basic_own_df['Combo'] * ((basic_own_df['value'] / 6.0)), basic_own_df['Combo'])
basic_own_df['Combo'] = np_where((basic_own_df['Salary'] > 9000), basic_own_df['Combo'] * .75, basic_own_df['Combo'])
basic_own_df['Combo'] = np_where((basic_own_df['Salary'] > 9000) & (basic_own_df['Combo'] < basic_own_df['value']), basic_own_df['value'], basic_own_df['Combo'])
basic_own_df['Combo'] = np_where((basic_own_df['Median'] > 20.0) & (basic_own_df['Salary'] < 3500), basic_own_df['Combo'] * (10 - basic_own_df['strong_play'].sum()).clip(0, 3), basic_own_df['Combo'])
basic_own_df['Combo'] = np_where(basic_own_df['Position'].str.contains('/'), basic_own_df['Combo'] * 1.25, basic_own_df['Combo'] * .75)
basic_own_df['Combo'] = (basic_own_df['Combo'] + basic_own_df['Own']) / 2
power_scale = 1.10
combo_powered = basic_own_df['Combo'] ** power_scale
norm_var = 800.0 / combo_powered.sum()
basic_own_df['Combo_powered'] = combo_powered * norm_var
own_dict = dict(zip(basic_own_df.Player, basic_own_df.Own))
pred_dict = dict(zip(basic_own_df.Player, basic_own_df.Combo_powered))
team_dict = dict(zip(basic_own_df.name_team, basic_own_df.Team))
opp_dict = dict(zip(basic_own_df.Player, basic_own_df.Opp))
min_dict = dict(zip(basic_own_df.Player, basic_own_df.Minutes))
player_id_dict = dict(zip(basic_own_df.Player, basic_own_df.player_id))
total_sims = 1000
flex_file = basic_own_df[['Player', 'Position', 'Salary', 'Median', 'Minutes']]
flex_file = flex_file.rename(columns={"Agg": "Median"})
flex_file['Floor'] = (flex_file['Median'] * .25) + (flex_file['Minutes'] * .25)
flex_file['Ceiling'] = flex_file['Median'] + 10 + (flex_file['Minutes'] * .25)
flex_file['STD'] = (flex_file['Median']/4)
flex_file = flex_file[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']]
flex_file = flex_file.reset_index(drop=True)
hold_file = flex_file.copy()
overall_file = flex_file.copy()
salary_file = flex_file.copy()
try:
overall_median_gpu = np_array(overall_file['Median'])
overall_std_gpu = np_array(overall_file['STD'])
overall_salary_gpu = np_array(overall_file['Salary'])
data_shape = (len(overall_file['Player']), total_sims) # Example: 1000 rows
salary_array = np_zeros(data_shape)
sim_array = np_zeros(data_shape)
for x in range(0, total_sims):
result_gpu = overall_salary_gpu
salary_array[:, x] = result_gpu
cupy_array = salary_array
salary_file = salary_file.reset_index(drop=True)
salary_cupy = DataFrame(cupy_array, columns=list(range(0, total_sims)))
salary_check_file = pd_concat([salary_file, salary_cupy], axis=1)
except:
for x in range(0,total_sims):
salary_file[x] = salary_file['Salary']
salary_check_file = salary_file.copy()
salary_file=salary_check_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
salary_file = salary_file.div(1000)
try:
for x in range(0, total_sims):
result_gpu = np_random.normal(overall_median_gpu, overall_std_gpu)
sim_array[:, x] = result_gpu
add_array = sim_array
overall_file = overall_file.reset_index(drop=True)
df2 = DataFrame(add_array, columns=list(range(0, total_sims)))
check_file = pd_concat([overall_file, df2], axis=1)
except:
for x in range(0,total_sims):
overall_file[x] = np_random.normal(overall_file['Median'],overall_file['STD'])
check_file = overall_file.copy()
overall_file=check_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
players_only = hold_file[['Player']]
raw_lineups_file = players_only
for x in range(0,total_sims):
maps_dict = {'proj_map':dict(zip(hold_file.Player,overall_file[x]))}
raw_lineups_file[x] = sum([raw_lineups_file['Player'].map(maps_dict['proj_map'])])
players_only[x] = raw_lineups_file[x].rank(ascending=False)
players_only=players_only.drop(['Player'], axis=1)
salary_4x_check = (overall_file - (salary_file*4))
salary_5x_check = (overall_file - (salary_file*5))
salary_6x_check = (overall_file - (salary_file*6))
gpp_check = (overall_file - ((salary_file*5)+10))
players_only['Average_Rank'] = players_only.mean(axis=1)
players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims
players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims
players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims
players_only['20+%'] = overall_file[overall_file >= 20].count(axis=1)/float(total_sims)
players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims)
players_only['5x%'] = salary_5x_check[salary_5x_check >= 1].count(axis=1)/float(total_sims)
players_only['6x%'] = salary_6x_check[salary_6x_check >= 1].count(axis=1)/float(total_sims)
players_only['GPP%'] = gpp_check[gpp_check >= 1].count(axis=1)/float(total_sims)
players_only['Player'] = hold_file[['Player']]
final_outcomes = players_only[['Player', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%']]
final_Proj = pd_merge(hold_file, final_outcomes, on="Player")
final_Proj = final_Proj[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%']]
final_Proj['name_team'] = final_Proj['Player'] + final_Proj['Position']
final_Proj['Own'] = final_Proj['Player'].map(pred_dict)
final_Proj = final_Proj.replace('', np_nan)
final_Proj = final_Proj.dropna(subset=['Own'])
final_Proj['Own'] = final_Proj['Own'].astype('float')
# own_average = final_Proj['Own'].mean()
# final_Proj['Own'] = (final_Proj['Own'] + (final_Proj['Own'] * (final_Proj['Own'] / own_average).clip(upper=1.5, lower=0.5))) / 2
final_Proj['Small_Own'] = final_Proj['Own'] + (.2 * (final_Proj['Own'] - final_Proj['Own'].mean()))
own_norm = 800 / final_Proj['Small_Own'].sum()
final_Proj['Small_Own'] = final_Proj['Small_Own'] * own_norm
final_Proj['Large_Own'] = final_Proj['Own'] - (.2 * (final_Proj['Own'] - final_Proj['Own'].mean()))
own_norm = 800 / final_Proj['Large_Own'].sum()
final_Proj['Large_Own'] = final_Proj['Large_Own'] * own_norm
final_Proj['Cash_Own'] = final_Proj['Own'] + (.33 * (final_Proj['Own'] - final_Proj['Own'].mean()))
own_norm = 800 / final_Proj['Cash_Own'].sum()
final_Proj['Cash_Own'] = final_Proj['Cash_Own'] * own_norm
final_Proj['Own'] = final_Proj['Own'].clip(upper=85, lower=0)
final_Proj['Small_Own'] = final_Proj['Small_Own'].clip(upper=95, lower=.01)
final_Proj['Large_Own'] = final_Proj['Large_Own'].clip(upper=80, lower=.1)
final_Proj['Cash_Own'] = final_Proj['Cash_Own'].clip(upper=99, lower=0)
final_Proj['Minutes Proj'] = final_Proj['Player'].map(min_dict)
final_Proj['Team'] = final_Proj['name_team'].map(team_dict)
final_Proj['Opp'] = final_Proj['Player'].map(opp_dict)
final_Proj['player_id'] = final_Proj['Player'].map(player_id_dict)
final_Proj['CPT_Own'] = final_Proj['Own'] / 6
final_Proj['LevX'] = ((final_Proj[['Top_finish', '6x%', 'Top_5_finish']].mean(axis=1))*100) - final_Proj['Own']
final_Proj['ValX'] = ((final_Proj[['5x%', '6x%']].mean(axis=1))*100) + final_Proj['LevX']
st.write(final_Proj[['Player', 'Minutes Proj', 'Position', 'Team', 'Opp', 'Salary', 'Median', 'Own', 'Small_Own', 'Large_Own']].head(10))
final_Proj = final_Proj[['Player', 'Minutes Proj', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%', 'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'ValX', 'player_id']]
final_Proj['site'] = 'Draftkings'
final_Proj['version'] = 'overall'
final_Proj['slate'] = slates
final_Proj['Salary'] = final_Proj['Salary'].astype(int)
final_Proj = final_Proj.sort_values(by='Median', ascending=False)
dk_roo_player_hold = pd_concat([dk_roo_player_hold.dropna(axis=1, how='all'), final_Proj.dropna(axis=1, how='all')])
return dk_roo_player_hold.copy()
def FD_NBA_ROO_Build(fd_roo_player_hold):
wrong_name = ['Lu Dort', 'Carlton Carrington', 'Alexandre Sarr']
right_name = ['Luguentz Dort', 'Bub Carrington', 'Alex Sarr']
for slates in slate_options:
if slates == 'Main Slate':
roo_team_list = slate_info['FD Main'].dropna().values.tolist()
try:
sh = gc.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('FD_Build_Up')
projects_raw = DataFrame(worksheet.get_values())
except:
sh = gc2.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('FD_Build_Up')
projects_raw = DataFrame(worksheet.get_values())
elif slates == 'Secondary Slate':
roo_team_list = slate_info['FD Secondary'].dropna().values.tolist()
try:
sh = gc.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Secondary_FD_Build')
projects_raw = DataFrame(worksheet.get_values())
except:
sh = gc2.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Secondary_FD_Build')
projects_raw = DataFrame(worksheet.get_values())
elif slates == 'Late Slate':
roo_team_list = slate_info['FD Late'].dropna().values.tolist()
try:
sh = gc.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Late_FD_Build')
projects_raw = DataFrame(worksheet.get_values())
except:
sh = gc2.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Late_FD_Build')
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[projects_raw['Team'].isin(roo_team_list)]
projects_raw = projects_raw.rename(columns={"Name": "Player", "Nickname": "Player", "Fantasy": "Median"})
for checkVar in range(len(wrong_name)):
projects_raw['Player'] = projects_raw['Player'].replace(wrong_name, right_name)
projects_raw = projects_raw.replace("", np_nan)
str_columns = ['Player', 'Position', 'Team', 'Opp', 'Sample', 'player_id']
numeric_columns = [col for col in projects_raw.columns if col not in str_columns]
projects_raw[numeric_columns] = projects_raw[numeric_columns].apply(to_numeric, errors='coerce')
projects_raw = projects_raw.loc[projects_raw['Salary'] > 0]
projects_raw = projects_raw.loc[projects_raw['Median'] > 0]
fd_df = projects_raw.sort_values(by='Median', ascending=False)
basic_own_df = fd_df.copy()
basic_own_df = basic_own_df[basic_own_df['Team'].isin(roo_team_list)]
basic_own_df['name_team'] = basic_own_df['Player'] + basic_own_df['Position']
own_dict = dict(zip(basic_own_df.Player, basic_own_df.Own))
team_dict = dict(zip(basic_own_df.name_team, basic_own_df.Team))
opp_dict = dict(zip(basic_own_df.Player, basic_own_df.Opp))
min_dict = dict(zip(basic_own_df.Player, basic_own_df.Minutes))
player_id_dict = dict(zip(basic_own_df.Player, basic_own_df.player_id))
total_sims = 1000
flex_file = basic_own_df[['Player', 'Position', 'Salary', 'Median', 'Minutes']]
flex_file = flex_file.rename(columns={"Agg": "Median"})
flex_file['Floor'] = (flex_file['Median'] * .25) + (flex_file['Minutes'] * .25)
flex_file['Ceiling'] = flex_file['Median'] + 10 + (flex_file['Minutes'] * .25)
flex_file['STD'] = (flex_file['Median']/4)
flex_file = flex_file[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']]
flex_file = flex_file.reset_index(drop=True)
hold_file = flex_file.copy()
overall_file = flex_file.copy()
salary_file = flex_file.copy()
try:
overall_median_gpu = np_array(overall_file['Median'])
overall_std_gpu = np_array(overall_file['STD'])
overall_salary_gpu = np_array(overall_file['Salary'])
data_shape = (len(overall_file['Player']), total_sims) # Example: 1000 rows
salary_array = np_zeros(data_shape)
sim_array = np_zeros(data_shape)
for x in range(0, total_sims):
result_gpu = overall_salary_gpu
salary_array[:, x] = result_gpu
cupy_array = salary_array
salary_file = salary_file.reset_index(drop=True)
salary_cupy = DataFrame(cupy_array, columns=list(range(0, total_sims)))
salary_check_file = pd_concat([salary_file, salary_cupy], axis=1)
except:
for x in range(0,total_sims):
salary_file[x] = salary_file['Salary']
salary_check_file = salary_file.copy()
salary_file=salary_check_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
salary_file = salary_file.div(1000)
try:
for x in range(0, total_sims):
result_gpu = np_random.normal(overall_median_gpu, overall_std_gpu)
sim_array[:, x] = result_gpu
add_array = sim_array
overall_file = overall_file.reset_index(drop=True)
df2 = DataFrame(add_array, columns=list(range(0, total_sims)))
check_file = pd_concat([overall_file, df2], axis=1)
except:
for x in range(0,total_sims):
overall_file[x] = np_random.normal(overall_file['Median'],overall_file['STD'])
check_file = overall_file.copy()
overall_file=check_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
players_only = hold_file[['Player']]
raw_lineups_file = players_only
for x in range(0,total_sims):
maps_dict = {'proj_map':dict(zip(hold_file.Player,overall_file[x]))}
raw_lineups_file[x] = sum([raw_lineups_file['Player'].map(maps_dict['proj_map'])])
players_only[x] = raw_lineups_file[x].rank(ascending=False)
players_only=players_only.drop(['Player'], axis=1)
salary_4x_check = (overall_file - (salary_file*4))
salary_5x_check = (overall_file - (salary_file*5))
salary_6x_check = (overall_file - (salary_file*6))
gpp_check = (overall_file - ((salary_file*5)+10))
players_only['Average_Rank'] = players_only.mean(axis=1)
players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims
players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims
players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims
players_only['20+%'] = overall_file[overall_file >= 20].count(axis=1)/float(total_sims)
players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims)
players_only['5x%'] = salary_5x_check[salary_5x_check >= 1].count(axis=1)/float(total_sims)
players_only['6x%'] = salary_6x_check[salary_6x_check >= 1].count(axis=1)/float(total_sims)
players_only['GPP%'] = gpp_check[gpp_check >= 1].count(axis=1)/float(total_sims)
players_only['Player'] = hold_file[['Player']]
final_outcomes = players_only[['Player', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%']]
final_Proj = pd_merge(hold_file, final_outcomes, on="Player")
final_Proj = final_Proj[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%']]
final_Proj['name_team'] = final_Proj['Player'] + final_Proj['Position']
final_Proj['Own'] = final_Proj['Player'].map(own_dict)
final_Proj['Own'] = final_Proj['Own'].astype('float')
# own_average = final_Proj['Own'].mean()
# final_Proj['Own'] = (final_Proj['Own'] + (final_Proj['Own'] * (final_Proj['Own'] / own_average).clip(upper=1.5, lower=0.5))) / 2
final_Proj['Small_Own'] = final_Proj['Own'] + (.2 * (final_Proj['Own'] - final_Proj['Own'].mean()))
own_norm = 800 / final_Proj['Small_Own'].sum()
final_Proj['Small_Own'] = final_Proj['Small_Own'] * own_norm
final_Proj['Large_Own'] = final_Proj['Own'] - (.2 * (final_Proj['Own'] - final_Proj['Own'].mean()))
own_norm = 800 / final_Proj['Large_Own'].sum()
final_Proj['Large_Own'] = final_Proj['Large_Own'] * own_norm
final_Proj['Cash_Own'] = final_Proj['Own'] + (.33 * (final_Proj['Own'] - final_Proj['Own'].mean()))
own_norm = 800 / final_Proj['Cash_Own'].sum()
final_Proj['Cash_Own'] = final_Proj['Cash_Own'] * own_norm
final_Proj['Own'] = final_Proj['Own'].clip(upper=85, lower=0)
final_Proj['Small_Own'] = final_Proj['Small_Own'].clip(upper=95, lower=.01)
final_Proj['Large_Own'] = final_Proj['Large_Own'].clip(upper=80, lower=.1)
final_Proj['Cash_Own'] = final_Proj['Cash_Own'].clip(upper=99, lower=0)
final_Proj['Minutes Proj'] = final_Proj['Player'].map(min_dict)
final_Proj['Team'] = final_Proj['name_team'].map(team_dict)
final_Proj['Opp'] = final_Proj['Player'].map(opp_dict)
final_Proj['player_id'] = final_Proj['Player'].map(player_id_dict)
final_Proj['CPT_Own'] = final_Proj['Own'] / 6
final_Proj['LevX'] = ((final_Proj[['Top_finish', '6x%', 'Top_5_finish']].mean(axis=1))*100) - final_Proj['Own']
final_Proj['ValX'] = ((final_Proj[['5x%', '6x%']].mean(axis=1))*100) + final_Proj['LevX']
final_Proj = final_Proj[['Player', 'Minutes Proj', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%', 'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'ValX', 'player_id']]
final_Proj['site'] = 'Fanduel'
final_Proj['version'] = 'overall'
final_Proj['slate'] = slates
final_Proj['Salary'] = final_Proj['Salary'].astype(int)
final_Proj = final_Proj.sort_values(by='Median', ascending=False)
fd_roo_player_hold = pd_concat([fd_roo_player_hold.dropna(axis=1, how='all'), final_Proj.dropna(axis=1, how='all')])
return fd_roo_player_hold.copy()
def DK_SD_NBA_ROO_Build(dk_sd_player_hold, dk_showdown_options, dk_sd_projections):
wrong_name = ['Lu Dort', 'Carlton Carrington']
right_name = ['Luguentz Dort', 'Bub Carrington']
total_sims = 1000
for slates in dk_showdown_options:
projects_raw = dk_sd_projections.copy()
projects_raw = projects_raw.reset_index(drop=True)
projects_raw = projects_raw[projects_raw['Slate'] == slates]
projects_raw = projects_raw.replace("", 0)
projects_raw = projects_raw.rename(columns={"name": "Player", "Nickname": "Player", "Fantasy": "Median"})
for checkVar in range(len(wrong_name)):
projects_raw['Player'] = projects_raw['Player'].replace(wrong_name, right_name)
projects_raw = projects_raw.replace("", np_nan)
str_columns = ['Player', 'Position', 'Team', 'Opp', 'Sample']
numeric_columns = [col for col in projects_raw.columns if col not in str_columns]
projects_raw[numeric_columns] = projects_raw[numeric_columns].apply(to_numeric, errors='coerce')
projects_raw = projects_raw.loc[projects_raw['Salary'] > 0]
projects_raw = projects_raw.loc[projects_raw['Median'] > 0]
working_roo = projects_raw
working_roo = working_roo.replace('', 0)
own_norm_var = 600 / working_roo['Own'].sum()
working_roo['Own'] = working_roo['Own'] * own_norm_var
own_dict = dict(zip(working_roo.Player, working_roo.Own))
team_dict = dict(zip(working_roo.Player, working_roo.Team))
opp_dict = dict(zip(working_roo.Player, working_roo.Opp))
min_dict = dict(zip(working_roo.Player, working_roo.Minutes))
player_id_dict = dict(zip(working_roo.Player, working_roo.player_ID))
total_sims = 1000
flex_file = working_roo[['Player', 'Position', 'Salary', 'Median', 'Minutes']]
flex_file['Floor'] = (flex_file['Median'] * .25) + (flex_file['Minutes'] * .25)
flex_file['Ceiling'] = flex_file['Median'] + 10 + (flex_file['Minutes'] * .25)
flex_file['STD'] = (flex_file['Median']/4)
flex_file = flex_file[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']]
flex_file = flex_file.reset_index(drop=True)
hold_file = flex_file.copy()
overall_file = flex_file.copy()
salary_file = flex_file.copy()
try:
overall_median_gpu = np_array(overall_file['Median'])
overall_std_gpu = np_array(overall_file['STD'])
overall_salary_gpu = np_array(overall_file['Salary'])
data_shape = (len(overall_file['Player']), total_sims) # Example: 1000 rows
salary_array = np_zeros(data_shape)
sim_array = np_zeros(data_shape)
for x in range(0, total_sims):
result_gpu = overall_salary_gpu
salary_array[:, x] = result_gpu
cupy_array = salary_array
salary_file = salary_file.reset_index(drop=True)
salary_cupy = DataFrame(cupy_array, columns=list(range(0, total_sims)))
salary_check_file = pd_concat([salary_file, salary_cupy], axis=1)
except:
for x in range(0,total_sims):
salary_file[x] = salary_file['Salary']
salary_check_file = salary_file.copy()
salary_file=salary_check_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
salary_file = salary_file.div(1000)
try:
for x in range(0, total_sims):
result_gpu = np_random.normal(overall_median_gpu, overall_std_gpu)
sim_array[:, x] = result_gpu
add_array = sim_array
overall_file = overall_file.reset_index(drop=True)
df2 = DataFrame(add_array, columns=list(range(0, total_sims)))
check_file = pd_concat([overall_file, df2], axis=1)
except:
for x in range(0,total_sims):
overall_file[x] = np_random.normal(overall_file['Median'],overall_file['STD'])
check_file = overall_file.copy()
overall_file=check_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
players_only = hold_file[['Player']]
raw_lineups_file = players_only
for x in range(0,total_sims):
maps_dict = {'proj_map':dict(zip(hold_file.Player,overall_file[x]))}
raw_lineups_file[x] = sum([raw_lineups_file['Player'].map(maps_dict['proj_map'])])
players_only[x] = raw_lineups_file[x].rank(ascending=False)
players_only=players_only.drop(['Player'], axis=1)
salary_4x_check = (overall_file - (salary_file*4))
salary_5x_check = (overall_file - (salary_file*5))
salary_6x_check = (overall_file - (salary_file*6))
gpp_check = (overall_file - ((salary_file*5)+10))
players_only['Average_Rank'] = players_only.mean(axis=1)
players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims
players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims
players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims
players_only['20+%'] = overall_file[overall_file >= 20].count(axis=1)/float(total_sims)
players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims)
players_only['5x%'] = salary_5x_check[salary_5x_check >= 1].count(axis=1)/float(total_sims)
players_only['6x%'] = salary_6x_check[salary_6x_check >= 1].count(axis=1)/float(total_sims)
players_only['GPP%'] = gpp_check[gpp_check >= 1].count(axis=1)/float(total_sims)
players_only['Player'] = hold_file[['Player']]
final_outcomes = players_only[['Player', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%']]
final_Proj = pd_merge(hold_file, final_outcomes, on="Player")
final_Proj = final_Proj[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%']]
final_Proj['name_team'] = final_Proj['Player'] + final_Proj['Position']
final_Proj['Own'] = final_Proj['Player'].map(own_dict)
final_Proj['Own'] = final_Proj['Own'].astype('float')
final_Proj['Small_Own'] = final_Proj['Own'] + (.2 * (final_Proj['Own'] - final_Proj['Own'].mean()))
own_norm = 600 / final_Proj['Small_Own'].sum()
final_Proj['Small_Own'] = final_Proj['Small_Own'] * own_norm
final_Proj['Large_Own'] = final_Proj['Own'] - (.2 * (final_Proj['Own'] - final_Proj['Own'].mean()))
own_norm = 600 / final_Proj['Large_Own'].sum()
final_Proj['Large_Own'] = final_Proj['Large_Own'] * own_norm
final_Proj['Cash_Own'] = final_Proj['Own'] + (.33 * (final_Proj['Own'] - final_Proj['Own'].mean()))
own_norm = 600 / final_Proj['Cash_Own'].sum()
final_Proj['Cash_Own'] = final_Proj['Cash_Own'] * own_norm
final_Proj['Own%'] = final_Proj['Own'].clip(upper=85, lower=1)
final_Proj['Small_Own'] = final_Proj['Small_Own'].clip(upper=99, lower=1)
final_Proj['Large_Own'] = final_Proj['Large_Own'].clip(upper=90, lower=2)
final_Proj['Cash_Own'] = final_Proj['Cash_Own'].clip(upper=99, lower=1)
own_norm = 600 / final_Proj['Own%'].sum()
final_Proj['Own'] = final_Proj['Own%'] * own_norm
final_Proj['Team'] = final_Proj['Player'].map(team_dict)
final_Proj['Opp'] = final_Proj['Player'].map(opp_dict)
final_Proj['Minutes Proj'] = final_Proj['Player'].map(min_dict)
final_Proj['Opp'] = final_Proj['Player'].map(opp_dict)
final_Proj['player_id'] = final_Proj['Player'].map(player_id_dict)
final_Proj['CPT_Own_raw'] = (final_Proj['Own'] / 2) * ((100 - (100-final_Proj['Own']))/100)
cpt_own_var = 100 / final_Proj['CPT_Own_raw'].sum()
final_Proj['CPT_Own'] = final_Proj['CPT_Own_raw'] * cpt_own_var
final_Proj['CPT_Proj'] = final_Proj['Median'] * 1.5
final_Proj['CPT_Salary'] = final_Proj['Salary'] * 1.5
final_Proj['LevX'] = ((final_Proj[['Top_finish', '6x%', 'Top_5_finish']].mean(axis=1))*100) - final_Proj['Own']
final_Proj['ValX'] = ((final_Proj[['5x%', '6x%']].mean(axis=1))*100) + final_Proj['LevX']
final_Proj = final_Proj[['Player', 'Minutes Proj', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%', 'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'ValX', 'player_id']]
final_Proj['site'] = 'Draftkings'
final_Proj['version'] = 'overall'
final_Proj['slate'] = slates
final_Proj['Salary'] = final_Proj['Salary'].astype(int)
final_Proj = final_Proj.sort_values(by='Median', ascending=False)
st.write(final_Proj.head(1))
dk_sd_player_hold = pd_concat([dk_sd_player_hold.dropna(axis=1, how='all'), final_Proj.dropna(axis=1, how='all')])
return dk_sd_player_hold.copy()
def FD_SD_NBA_ROO_Build(fd_sd_player_hold, fd_showdown_options, fd_sd_projections):
wrong_name = ['Lu Dort', 'Carlton Carrington', 'Alexandre Sarr']
right_name = ['Luguentz Dort', 'Bub Carrington', 'Alex Sarr']
total_sims = 1000
for slates in fd_showdown_options:
projects_raw = fd_sd_projections.copy()
projects_raw = projects_raw.reset_index(drop=True)
projects_raw = projects_raw[projects_raw['Slate'] == slates]
projects_raw = projects_raw.replace("", 0)
projects_raw = projects_raw.rename(columns={"name": "Player", "Nickname": "Player", "Fantasy": "Median"})
for checkVar in range(len(wrong_name)):
projects_raw['Player'] = projects_raw['Player'].replace(wrong_name, right_name)
projects_raw = projects_raw.replace("", np_nan)
str_columns = ['Player', 'Position', 'Team', 'Opp', 'Sample', 'player_ID']
numeric_columns = [col for col in projects_raw.columns if col not in str_columns]
projects_raw[numeric_columns] = projects_raw[numeric_columns].apply(to_numeric, errors='coerce')
projects_raw = projects_raw.loc[projects_raw['Salary'] > 0]
projects_raw = projects_raw.loc[projects_raw['Median'] > 0]
working_roo = projects_raw
working_roo = working_roo.replace('', 0)
own_norm_var = 600 / working_roo['Own'].sum()
working_roo['Own'] = working_roo['Own'] * own_norm_var
own_dict = dict(zip(working_roo.Player, working_roo.Own))
team_dict = dict(zip(working_roo.Player, working_roo.Team))
opp_dict = dict(zip(working_roo.Player, working_roo.Opp))
min_dict = dict(zip(working_roo.Player, working_roo.Minutes))
player_id_dict = dict(zip(working_roo.Player, working_roo.player_ID))
total_sims = 1000
flex_file = working_roo[['Player', 'Position', 'Salary', 'Median', 'Minutes']]
flex_file['Floor'] = (flex_file['Median'] * .25) + (flex_file['Minutes'] * .25)
flex_file['Ceiling'] = flex_file['Median'] + 10 + (flex_file['Minutes'] * .25)
flex_file['STD'] = (flex_file['Median']/4)
flex_file = flex_file[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']]
flex_file = flex_file.reset_index(drop=True)
hold_file = flex_file.copy()
overall_file = flex_file.copy()
salary_file = flex_file.copy()
try:
overall_median_gpu = np_array(overall_file['Median'])
overall_std_gpu = np_array(overall_file['STD'])
overall_salary_gpu = np_array(overall_file['Salary'])
data_shape = (len(overall_file['Player']), total_sims) # Example: 1000 rows
salary_array = np_zeros(data_shape)
sim_array = np_zeros(data_shape)
for x in range(0, total_sims):
result_gpu = overall_salary_gpu
salary_array[:, x] = result_gpu
cupy_array = salary_array
salary_file = salary_file.reset_index(drop=True)
salary_cupy = DataFrame(cupy_array, columns=list(range(0, total_sims)))
salary_check_file = pd_concat([salary_file, salary_cupy], axis=1)
except:
for x in range(0,total_sims):
salary_file[x] = salary_file['Salary']
salary_check_file = salary_file.copy()
salary_file=salary_check_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
salary_file = salary_file.div(1000)
try:
for x in range(0, total_sims):
result_gpu = np_random.normal(overall_median_gpu, overall_std_gpu)
sim_array[:, x] = result_gpu
add_array = sim_array
overall_file = overall_file.reset_index(drop=True)
df2 = DataFrame(add_array, columns=list(range(0, total_sims)))
check_file = pd_concat([overall_file, df2], axis=1)
except:
for x in range(0,total_sims):
overall_file[x] = np_random.normal(overall_file['Median'],overall_file['STD'])
check_file = overall_file.copy()
overall_file=check_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
players_only = hold_file[['Player']]
raw_lineups_file = players_only
for x in range(0,total_sims):
maps_dict = {'proj_map':dict(zip(hold_file.Player,overall_file[x]))}
raw_lineups_file[x] = sum([raw_lineups_file['Player'].map(maps_dict['proj_map'])])
players_only[x] = raw_lineups_file[x].rank(ascending=False)
players_only=players_only.drop(['Player'], axis=1)
salary_4x_check = (overall_file - (salary_file*4))
salary_5x_check = (overall_file - (salary_file*5))
salary_6x_check = (overall_file - (salary_file*6))
gpp_check = (overall_file - ((salary_file*5)+10))
players_only['Average_Rank'] = players_only.mean(axis=1)
players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims
players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims
players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims
players_only['20+%'] = overall_file[overall_file >= 20].count(axis=1)/float(total_sims)
players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims)
players_only['5x%'] = salary_5x_check[salary_5x_check >= 1].count(axis=1)/float(total_sims)
players_only['6x%'] = salary_6x_check[salary_6x_check >= 1].count(axis=1)/float(total_sims)
players_only['GPP%'] = gpp_check[gpp_check >= 1].count(axis=1)/float(total_sims)
players_only['Player'] = hold_file[['Player']]
final_outcomes = players_only[['Player', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%']]
final_Proj = pd_merge(hold_file, final_outcomes, on="Player")
final_Proj = final_Proj[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%']]
final_Proj['name_team'] = final_Proj['Player'] + final_Proj['Position']
final_Proj['Own'] = final_Proj['Player'].map(own_dict)
final_Proj['Own'] = final_Proj['Own'].astype('float')
final_Proj['Small_Own'] = final_Proj['Own'] + (.2 * (final_Proj['Own'] - final_Proj['Own'].mean()))
own_norm = 600 / final_Proj['Small_Own'].sum()
final_Proj['Small_Own'] = final_Proj['Small_Own'] * own_norm
final_Proj['Large_Own'] = final_Proj['Own'] - (.2 * (final_Proj['Own'] - final_Proj['Own'].mean()))
own_norm = 600 / final_Proj['Large_Own'].sum()
final_Proj['Large_Own'] = final_Proj['Large_Own'] * own_norm
final_Proj['Cash_Own'] = final_Proj['Own'] + (.33 * (final_Proj['Own'] - final_Proj['Own'].mean()))
own_norm = 600 / final_Proj['Cash_Own'].sum()
final_Proj['Cash_Own'] = final_Proj['Cash_Own'] * own_norm
final_Proj['Own%'] = final_Proj['Own'].clip(upper=85, lower=1)
final_Proj['Small_Own'] = final_Proj['Small_Own'].clip(upper=99, lower=1)
final_Proj['Large_Own'] = final_Proj['Large_Own'].clip(upper=90, lower=2)
final_Proj['Cash_Own'] = final_Proj['Cash_Own'].clip(upper=99, lower=1)
own_norm = 600 / final_Proj['Own%'].sum()
final_Proj['Own'] = final_Proj['Own%'] * own_norm
final_Proj['Team'] = final_Proj['Player'].map(team_dict)
final_Proj['Opp'] = final_Proj['Player'].map(opp_dict)
final_Proj['Minutes Proj'] = final_Proj['Player'].map(min_dict)
final_Proj['Opp'] = final_Proj['Player'].map(opp_dict)
final_Proj['player_id'] = final_Proj['Player'].map(player_id_dict)
final_Proj['CPT_Own_raw'] = (final_Proj['Own'] / 2) * ((100 - (100-final_Proj['Own']))/100)
cpt_own_var = 100 / final_Proj['CPT_Own_raw'].sum()
final_Proj['CPT_Own'] = final_Proj['CPT_Own_raw'] * cpt_own_var
final_Proj['CPT_Proj'] = final_Proj['Median'] * 1.5
final_Proj['CPT_Salary'] = final_Proj['Salary'] * 1.5
final_Proj['LevX'] = ((final_Proj[['Top_finish', '6x%', 'Top_5_finish']].mean(axis=1))*100) - final_Proj['Own']
final_Proj['ValX'] = ((final_Proj[['5x%', '6x%']].mean(axis=1))*100) + final_Proj['LevX']
final_Proj = final_Proj[['Player', 'Minutes Proj', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%', 'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'ValX', 'player_id']]
final_Proj['site'] = 'Fanduel'
final_Proj['version'] = 'overall'
final_Proj['slate'] = slates
final_Proj['Salary'] = final_Proj['Salary'].astype(int)
final_Proj = final_Proj.sort_values(by='Median', ascending=False)
st.write(final_Proj.head(1))
fd_sd_player_hold = pd_concat([fd_sd_player_hold.dropna(axis=1, how='all'), final_Proj.dropna(axis=1, how='all')])
return fd_sd_player_hold.copy()
############----------FUNCTION FOR DRAFTKINGS SHOWDOWN SEED FRAME CREATION----------############
def DK_NBA_SD_seed_frame(dk_showdown_options, dk_sd_projections):
wrong_team = ['GS', 'NO', 'SA', 'NY']
right_team = ['GSW', 'NOP', 'SAS', 'NYK']
wrong_name = ['Lu Dort', 'Carlton Carrington']
right_name = ['Luguentz Dort', 'Bub Carrington']
all_players_median = []
all_cpt_median = []
for slates in dk_showdown_options:
load_display = dk_sd_projections.copy()
load_display = load_display.replace('', np_nan)
load_display = load_display[load_display['Slate'] == slates]
for checkVar in range(len(wrong_team)):
load_display['Team'] = load_display['Team'].replace(wrong_team, right_team)
load_display['Opp'] = load_display['Opp'].replace(wrong_team, right_team)
for checkVar in range(len(wrong_name)):
load_display['name'] = load_display['name'].replace(wrong_name, right_name)
raw_display = load_display.dropna(subset=['Fantasy'])
raw_display['Position'] = 'FLEX'
raw_display.rename(columns={"name": "Player", "Fantasy": "Median"}, inplace = True)
raw_display = raw_display[['Player', 'Salary', 'Position', 'Team', 'Opp', 'Median', 'Minutes', 'Own']]
dk_roo_raw = raw_display.loc[raw_display['Median'] > 0]
dk_roo_raw = dk_roo_raw.replace(['0', ''], [np_nan, np_nan])
Overall_Proj = dk_roo_raw.dropna(subset='Salary')
Overall_Proj = Overall_Proj.dropna(subset='Median')
own_norm_var = 600 / Overall_Proj['Own'].sum()
Overall_Proj['Own'] = Overall_Proj['Own'] * own_norm_var
Overall_Proj['Own'] = np_where(Overall_Proj['Own'] > 90, 90, Overall_Proj['Own'])
own_norm_var = 600 / Overall_Proj['Own'].sum()
Overall_Proj['Own'] = Overall_Proj['Own'] * own_norm_var
Overall_Proj['salary_Value'] = (Overall_Proj['Salary'] / 1000) / Overall_Proj['Median']
Overall_Proj['proj_Value'] = Overall_Proj['Median'].rank(pct = True)
Overall_Proj['own_Value'] = Overall_Proj['Own'].rank(pct = True)
Overall_Proj['sort_Value'] = Overall_Proj[['own_Value', 'salary_Value']].mean(axis=1)
Overall_Proj.rename(columns={"Player": "Name"}, inplace = True)
Overall_Proj = Overall_Proj.reset_index(drop=True)
Team_list = DataFrame(Overall_Proj['Team'].unique(), columns=['Team'])
Team_list['team_var'] = Team_list.index
players_full = Overall_Proj.sort_values(by='own_Value', ascending=False)
cpt_median = players_full.drop_duplicates(subset ='Name', keep ='first')
cpt_median = pd_merge(cpt_median, Team_list, how='left', on='Team')
cpt_median['Var'] = cpt_median.index
cpt_median['Median'] = cpt_median['Median'] * 1.5
cpt_median['Salary'] = cpt_median['Salary'] * 1.5
cpt_median['Own'] = (cpt_median['Own'] / 2) * ((100 - (100-cpt_median['Own']))/100)
cpt_median['Own'] = cpt_median['Own'] * (600 / cpt_median['Own'].sum())
players_median = players_full.drop_duplicates(subset ='Name', keep ='first')
players_median = pd_merge(players_median, Team_list, how='left', on='Team')
players_median['Var'] = players_median.index
# Add slate identifier and collect data for JSON export
players_median_copy = players_median.copy()
players_median_copy['slate'] = slates
all_players_median.append(players_median_copy)
cpt_median_copy = cpt_median.copy()
cpt_median_copy['slate'] = slates
all_cpt_median.append(cpt_median_copy)
# Combine all slates data
combined_players_median = pd_concat(all_players_median, ignore_index=True)
combined_cpt_median = pd_concat(all_cpt_median, ignore_index=True)
# Reassign Var indices for combined data
combined_players_median['Var'] = combined_players_median.index
combined_cpt_median['Var'] = combined_cpt_median.index + len(combined_players_median)
# Create maps for Go processing
players_name_map = {str(int(idx)): str(name) for idx, name in combined_players_median.set_index('Var')['Name'].items()}
players_salary_map = {str(int(idx)): int(salary) for idx, salary in combined_players_median.set_index('Var')['Salary'].items()}
players_projection_map = {str(int(idx)): float(proj) for idx, proj in combined_players_median.set_index('Var')['Median'].items()}
players_ownership_map = {str(int(idx)): float(own) for idx, own in combined_players_median.set_index('Var')['Own'].items()}
players_team_map = {str(int(idx)): str(team) for idx, team in combined_players_median.set_index('Var')['Team'].items()}
cpt_name_map = {str(int(idx)): str(name) for idx, name in combined_cpt_median.set_index('Var')['Name'].items()}
cpt_salary_map = {str(int(idx)): int(salary) for idx, salary in combined_cpt_median.set_index('Var')['Salary'].items()}
cpt_projection_map = {str(int(idx)): float(proj) for idx, proj in combined_cpt_median.set_index('Var')['Median'].items()}
cpt_ownership_map = {str(int(idx)): float(own) for idx, own in combined_cpt_median.set_index('Var')['Own'].items()}
cpt_team_map = {str(int(idx)): str(team) for idx, team in combined_cpt_median.set_index('Var')['Team'].items()}
# Create output data structure for Go
output_data = {
"players_median": {
"players": [],
"maps": {
"name_map": players_name_map,
"salary_map": players_salary_map,
"projection_map": players_projection_map,
"ownership_map": players_ownership_map,
"team_map": players_team_map
}
},
"cpt_median": {
"players": [],
"maps": {
"name_map": cpt_name_map,
"salary_map": cpt_salary_map,
"projection_map": cpt_projection_map,
"ownership_map": cpt_ownership_map,
"team_map": cpt_team_map
}
}
}
# Convert players to Go struct format
for idx, row in combined_players_median.iterrows():
player = {
"id": int(row['Var']),
"name": str(row['Name']),
"position": str(row['Position']),
"salary": int(row['Salary']),
"projection": float(row['Median']),
"ownership": float(row['Own']),
"salary_value": float(row['salary_Value']),
"proj_value": float(row['proj_Value']),
"own_value": float(row['own_Value']),
"sort_value": float(row['sort_Value']),
"slate": str(row['slate'])
}
output_data["players_median"]["players"].append(player)
for idx, row in combined_cpt_median.iterrows():
player = {
"id": int(row['Var']),
"name": str(row['Name']),
"position": str(row['Position']),
"salary": int(row['Salary']),
"projection": float(row['Median']),
"ownership": float(row['Own']),
"salary_value": float(row['salary_Value']),
"proj_value": float(row['proj_Value']),
"own_value": float(row['own_Value']),
"sort_value": float(row['sort_Value']),
"slate": str(row['slate'])
}
output_data["cpt_median"]["players"].append(player)
# Calculate project root for file paths
current_dir = os.path.dirname(os.path.abspath(__file__))
project_root = os.path.dirname(os.path.dirname(current_dir))
# Ensure directory exists
showdown_dir = os.path.join(project_root, 'showdown_go')
os.makedirs(showdown_dir, exist_ok=True)
# Write JSON data for Go processing
player_data_path = os.path.join(showdown_dir, 'player_data.json')
with open(player_data_path, 'w') as f:
json.dump(output_data, f)
st.write("JSON export completed, starting Go processing...")
# Call Go function
if run_go_showdown_lineup_generator("DK", "NBA"):
st.write("NBA lineup generation for DK completed successfully!")
return True
else:
st.write("Go processing failed")
return False
############----------FUNCTION FOR FANDUEL SHOWDOWN SEED FRAME CREATION----------############
def FD_NBA_SD_seed_frame(fd_showdown_options, fd_sd_projections):
wrong_team = ['GS', 'NO', 'SA', 'NY']
right_team = ['GSW', 'NOP', 'SAS', 'NYK']
wrong_name = ['Lu Dort', 'Carlton Carrington', 'Alexandre Sarr']
right_name = ['Luguentz Dort', 'Bub Carrington', 'Alex Sarr']
all_players_median = []
all_cpt_median = []
for slates in fd_showdown_options:
load_display = fd_sd_projections.copy()
load_display = load_display.replace('', np_nan)
load_display = load_display[load_display['Slate'] == slates]
for checkVar in range(len(wrong_team)):
load_display['Team'] = load_display['Team'].replace(wrong_team, right_team)
load_display['Opp'] = load_display['Opp'].replace(wrong_team, right_team)
for checkVar in range(len(wrong_name)):
load_display['name'] = load_display['name'].replace(wrong_name, right_name)
raw_display = load_display.dropna(subset=['Fantasy'])
raw_display['Position'] = 'FLEX'
raw_display.rename(columns={"name": "Player", "Fantasy": "Median"}, inplace = True)
raw_display = raw_display[['Player', 'Salary', 'Position', 'Team', 'Opp', 'Median', 'Minutes', 'Own']]
dk_roo_raw = raw_display.loc[raw_display['Median'] > 0]
dk_roo_raw = dk_roo_raw.replace(['0', ''], [np_nan, np_nan])
Overall_Proj = dk_roo_raw.dropna(subset='Salary')
Overall_Proj = Overall_Proj.dropna(subset='Median')
own_norm_var = 600 / Overall_Proj['Own'].sum()
Overall_Proj['Own'] = Overall_Proj['Own'] * own_norm_var
Overall_Proj['Own'] = np_where(Overall_Proj['Own'] > 90, 90, Overall_Proj['Own'])
own_norm_var = 600 / Overall_Proj['Own'].sum()
Overall_Proj['Own'] = Overall_Proj['Own'] * own_norm_var
Overall_Proj['salary_Value'] = (Overall_Proj['Salary'] / 1000) / Overall_Proj['Median']
Overall_Proj['proj_Value'] = Overall_Proj['Median'].rank(pct = True)
Overall_Proj['own_Value'] = Overall_Proj['Own'].rank(pct = True)
Overall_Proj['sort_Value'] = Overall_Proj[['own_Value', 'salary_Value']].mean(axis=1)
Overall_Proj.rename(columns={"Player": "Name"}, inplace = True)
Overall_Proj = Overall_Proj.reset_index(drop=True)
Team_list = DataFrame(Overall_Proj['Team'].unique(), columns=['Team'])
Team_list['team_var'] = Team_list.index
players_full = Overall_Proj.sort_values(by='own_Value', ascending=False)
cpt_median = players_full.drop_duplicates(subset ='Name', keep ='first')
cpt_median = pd_merge(cpt_median, Team_list, how='left', on='Team')
cpt_median['Var'] = cpt_median.index
cpt_median['Median'] = cpt_median['Median'] * 1.5
cpt_median['Salary'] = cpt_median['Salary'] * 1.5
cpt_median['Own'] = (cpt_median['Own'] / 2) * ((100 - (100-cpt_median['Own']))/100)
cpt_median['Own'] = cpt_median['Own'] * (600 / cpt_median['Own'].sum())
players_median = players_full.drop_duplicates(subset ='Name', keep ='first')
players_median = pd_merge(players_median, Team_list, how='left', on='Team')
players_median['Var'] = players_median.index
# Add slate identifier and collect data for JSON export
players_median_copy = players_median.copy()
players_median_copy['slate'] = slates
all_players_median.append(players_median_copy)
cpt_median_copy = cpt_median.copy()
cpt_median_copy['slate'] = slates
all_cpt_median.append(cpt_median_copy)
# Combine all slates data
combined_players_median = pd_concat(all_players_median, ignore_index=True)
combined_cpt_median = pd_concat(all_cpt_median, ignore_index=True)
# Reassign Var indices for combined data
combined_players_median['Var'] = combined_players_median.index
combined_cpt_median['Var'] = combined_cpt_median.index + len(combined_players_median)
# Create maps for Go processing
players_name_map = {str(int(idx)): str(name) for idx, name in combined_players_median.set_index('Var')['Name'].items()}
players_salary_map = {str(int(idx)): int(salary) for idx, salary in combined_players_median.set_index('Var')['Salary'].items()}
players_projection_map = {str(int(idx)): float(proj) for idx, proj in combined_players_median.set_index('Var')['Median'].items()}
players_ownership_map = {str(int(idx)): float(own) for idx, own in combined_players_median.set_index('Var')['Own'].items()}
players_team_map = {str(int(idx)): str(team) for idx, team in combined_players_median.set_index('Var')['Team'].items()}
cpt_name_map = {str(int(idx)): str(name) for idx, name in combined_cpt_median.set_index('Var')['Name'].items()}
cpt_salary_map = {str(int(idx)): int(salary) for idx, salary in combined_cpt_median.set_index('Var')['Salary'].items()}
cpt_projection_map = {str(int(idx)): float(proj) for idx, proj in combined_cpt_median.set_index('Var')['Median'].items()}
cpt_ownership_map = {str(int(idx)): float(own) for idx, own in combined_cpt_median.set_index('Var')['Own'].items()}
cpt_team_map = {str(int(idx)): str(team) for idx, team in combined_cpt_median.set_index('Var')['Team'].items()}
# Create output data structure for Go
output_data = {
"players_median": {
"players": [],
"maps": {
"name_map": players_name_map,
"salary_map": players_salary_map,
"projection_map": players_projection_map,
"ownership_map": players_ownership_map,
"team_map": players_team_map
}
},
"cpt_median": {
"players": [],
"maps": {
"name_map": cpt_name_map,
"salary_map": cpt_salary_map,
"projection_map": cpt_projection_map,
"ownership_map": cpt_ownership_map,
"team_map": cpt_team_map
}
}
}
# Convert players to Go struct format
for idx, row in combined_players_median.iterrows():
player = {
"id": int(row['Var']),
"name": str(row['Name']),
"position": str(row['Position']),
"salary": int(row['Salary']),
"projection": float(row['Median']),
"ownership": float(row['Own']),
"salary_value": float(row['salary_Value']),
"proj_value": float(row['proj_Value']),
"own_value": float(row['own_Value']),
"sort_value": float(row['sort_Value']),
"slate": str(row['slate'])
}
output_data["players_median"]["players"].append(player)
for idx, row in combined_cpt_median.iterrows():
player = {
"id": int(row['Var']),
"name": str(row['Name']),
"position": str(row['Position']),
"salary": int(row['Salary']),
"projection": float(row['Median']),
"ownership": float(row['Own']),
"salary_value": float(row['salary_Value']),
"proj_value": float(row['proj_Value']),
"own_value": float(row['own_Value']),
"sort_value": float(row['sort_Value']),
"slate": str(row['slate'])
}
output_data["cpt_median"]["players"].append(player)
# Calculate project root for file paths
current_dir = os.path.dirname(os.path.abspath(__file__))
project_root = os.path.dirname(os.path.dirname(current_dir))
# Ensure directory exists
showdown_dir = os.path.join(project_root, 'showdown_go')
os.makedirs(showdown_dir, exist_ok=True)
# Write JSON data for Go processing
player_data_path = os.path.join(showdown_dir, 'player_data.json')
with open(player_data_path, 'w') as f:
json.dump(output_data, f)
st.write("JSON export completed, starting Go processing...")
# Call Go function
if run_go_showdown_lineup_generator("FD", "NBA"):
st.write("NBA lineup generation for FD completed successfully!")
return True
else:
st.write("Go processing failed")
return False
############----------FUNCTION FOR DRAFTKINGS SHOWDOWN SEED FRAME CREATION----------############
def DK_NBA_seed_frame(roo_file, client):
db = client['NBA_Database']
raw_proj = roo_file[roo_file['site'] == 'Draftkings'].copy()
wrong_name = ['Lu Dort', 'Carlton Carrington']
right_name = ['Luguentz Dort', 'Bub Carrington']
for slates in slate_options:
optimal_lineups = []
Overall_Proj = raw_proj.copy()
Overall_Proj = Overall_Proj.replace(['0', ''], [np_nan, np_nan])
Overall_Proj = Overall_Proj.dropna(subset='Salary')
Overall_Proj = Overall_Proj.dropna(subset='Median')
if slates == 'Main Slate':
Overall_Proj = Overall_Proj[Overall_Proj['slate'] == 'Main Slate']
elif slates == 'Secondary Slate':
Overall_Proj = Overall_Proj[Overall_Proj['slate'] == 'Secondary Slate']
elif slates == 'Late Slate':
Overall_Proj = Overall_Proj[Overall_Proj['slate'] == 'Late Slate']
for checkVar in range(len(wrong_name)):
Overall_Proj['Player'] = Overall_Proj['Player'].replace(wrong_name, right_name)
Overall_Proj['salary_Value'] = (Overall_Proj['Salary'] / 1000) / Overall_Proj['Median']
Overall_Proj['proj_Value'] = Overall_Proj['Median'].rank(pct = True)
Overall_Proj['own_Value'] = Overall_Proj['Own'].rank(pct = True)
Overall_Proj['sort_Value'] = Overall_Proj[['own_Value', 'salary_Value']].mean(axis=1)
Overall_Proj = Overall_Proj.rename(columns={"Player": "Name"})
Overall_Proj = Overall_Proj.dropna()
Overall_Proj = Overall_Proj.reset_index(drop=True)
Team_list = DataFrame(Overall_Proj['Team'].unique(), columns=['Team'])
Team_list['team_var'] = Team_list.index
players_median = Overall_Proj.drop_duplicates(subset ='Name', keep ='first')
players_median = pd_merge(players_median, Team_list, how='left', on='Team')
players_median['Var'] = players_median.index
# Add slate identifier and collect data for JSON export
players_median_copy = players_median.copy()
players_median_copy['slate'] = slates
# Create maps for Go processing
players_name_map = {str(int(idx)): str(name) for idx, name in players_median_copy.set_index('Var')['Name'].items()}
players_salary_map = {str(int(idx)): int(salary) for idx, salary in players_median_copy.set_index('Var')['Salary'].items()}
players_projection_map = {str(int(idx)): float(proj) for idx, proj in players_median_copy.set_index('Var')['Median'].items()}
players_ownership_map = {str(int(idx)): float(own) for idx, own in players_median_copy.set_index('Var')['Own'].items()}
players_team_map = {str(int(idx)): str(team) for idx, team in players_median_copy.set_index('Var')['Team'].items()}
# Create output data structure for Go
output_data = {
"players_median": {
"players": [],
"maps": {
"name_map": players_name_map,
"salary_map": players_salary_map,
"projection_map": players_projection_map,
"ownership_map": players_ownership_map,
"team_map": players_team_map
}
}
}
# Convert players to Go struct format
for idx, row in players_median_copy.iterrows():
player = {
"id": int(row['Var']),
"name": str(row['Name']),
"position": str(row['Position']),
"salary": int(row['Salary']),
"projection": float(row['Median']),
"ownership": float(row['Own']),
"salary_value": float(row['salary_Value']),
"proj_value": float(row['proj_Value']),
"own_value": float(row['own_Value']),
"sort_value": float(row['sort_Value']),
"slate": str(row['slate'])
}
output_data["players_median"]["players"].append(player)
# Calculate project root for file paths
current_dir = os.path.dirname(os.path.abspath(__file__))
project_root = os.path.dirname(os.path.dirname(current_dir))
# Ensure directory exists
dk_nba_dir = os.path.join(project_root, 'dk_nba_go')
os.makedirs(dk_nba_dir, exist_ok=True)
# Write JSON data for Go processing
player_data_path = os.path.join(dk_nba_dir, 'player_data.json')
with open(player_data_path, 'w') as f:
json.dump(output_data, f)
if slates == 'Main Slate':
collection = db['DK_NBA_name_map']
elif slates == 'Secondary Slate':
collection = db['DK_NBA_Secondary_name_map']
elif slates == 'Late Slate':
collection = db['DK_NBA_Late_name_map']
master_name_map = pd_Series(players_median['Name'].values,index=players_median.Var).to_dict()
master_salary_map = pd_Series(players_median['Salary'].values,index=players_median.Var).to_dict()
master_projection_map = pd_Series(players_median['Median'].values,index=players_median.Var).to_dict()
master_team_num_map = pd_Series(players_median['team_var'].values,index=players_median.Var).to_dict()
master_team_map = pd_Series(players_median['Team'].values,index=players_median.Var).to_dict()
master_own_map = pd_Series(players_median['Own'].values,index=players_median.Var).to_dict()
master_name_index = pd_Series(players_median.Var.values, index=players_median.Name).to_dict()
position_requirements = {
'PG': 1,
'SG': 1,
'SF': 1,
'PF': 1,
'C': 1,
'G': 1,
'F': 1,
'FLEX': 1,
}
salary_cap = 50000
max_team_players = 3
# Teams to loop through
teams_to_optimize = players_median['Team'].unique().tolist()
required_positions = ['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX']
collection.drop()
try:
# Convert dictionary to format suitable for MongoDB
mongo_docs = [{"key": k, "value": v} for k, v in master_name_map.items()]
collection.insert_many(mongo_docs, ordered=False)
except Exception as e:
st.write(f"Error inserting name map: {e}")
time_sleep(1)
optimals = init_team_results(players_median, position_requirements, salary_cap, max_team_players, teams_to_optimize, 1000)
formatted_optimals = format_optimals(optimals, players_median, required_positions)
for col in required_positions:
if col in formatted_optimals.columns:
formatted_optimals[col] = formatted_optimals[col].map(master_name_index).fillna(formatted_optimals[col])
# formatted_optimals['proj'] = formatted_optimals['proj'] + (formatted_optimals['proj'] * ((formatted_optimals['Team_count'] - 3) * .05))
formatted_optimals['proj'] = formatted_optimals['proj'].astype(float)
# Convert this slate's optimals to JSON format and add slate info
for idx, row in formatted_optimals.iterrows():
optimal_lineup = {
"slate": slates, # Add slate identifier
"salary": int(row['salary']),
"projection": float(row['proj']),
"team": str(row['Team']),
"team_count": int(row['Team_count']),
"secondary": str(row['Secondary']),
"secondary_count": int(row['Secondary_count']),
"ownership": float(row['Own']),
"players": [int(row['PG']), int(row['SG']), int(row['SF']), int(row['PF']), int(row['C']), int(row['G']), int(row['F']), int(row['FLEX'])]
}
optimal_lineups.append(optimal_lineup)
st.write(f"Generated {len(formatted_optimals)} optimal lineups for slate {slates}")
optimal_lineups_path = os.path.join(dk_nba_dir, 'optimal_lineups.json')
with open(optimal_lineups_path, 'w') as f:
json.dump(optimal_lineups, f)
run_go_classic_lineup_generator("DK", "NBA")
st.write("NBA lineup generation for DK completed successfully!")
############----------FUNCTION FOR FANDUEL SHOWDOWN SEED FRAME CREATION----------############
def FD_NBA_seed_frame(roo_file, client):
db = client['NBA_Database']
raw_proj = roo_file[roo_file['site'] == 'Fanduel'].copy()
wrong_name = ['Lu Dort', 'Carlton Carrington', 'Alexandre Sarr']
right_name = ['Luguentz Dort', 'Bub Carrington', 'Alex Sarr']
for slates in slate_options:
optimal_lineups = []
Overall_Proj = raw_proj.copy()
Overall_Proj = Overall_Proj.replace(['0', ''], [np_nan, np_nan])
Overall_Proj = Overall_Proj.dropna(subset='Salary')
Overall_Proj = Overall_Proj.dropna(subset='Median')
if slates == 'Main Slate':
Overall_Proj = Overall_Proj[Overall_Proj['slate'] == 'Main Slate']
elif slates == 'Secondary Slate':
Overall_Proj = Overall_Proj[Overall_Proj['slate'] == 'Secondary Slate']
elif slates == 'Late Slate':
Overall_Proj = Overall_Proj[Overall_Proj['slate'] == 'Late Slate']
for checkVar in range(len(wrong_name)):
Overall_Proj['Player'] = Overall_Proj['Player'].replace(wrong_name, right_name)
Overall_Proj['salary_Value'] = (Overall_Proj['Salary'] / 1000) / Overall_Proj['Median']
Overall_Proj['proj_Value'] = Overall_Proj['Median'].rank(pct = True)
Overall_Proj['own_Value'] = Overall_Proj['Own'].rank(pct = True)
Overall_Proj['sort_Value'] = Overall_Proj[['own_Value', 'salary_Value']].mean(axis=1)
Overall_Proj = Overall_Proj.rename(columns={"Player": "Name"})
Overall_Proj = Overall_Proj.dropna()
Overall_Proj = Overall_Proj.reset_index(drop=True)
Team_list = DataFrame(Overall_Proj['Team'].unique(), columns=['Team'])
Team_list['team_var'] = Team_list.index
players_median = Overall_Proj.drop_duplicates(subset ='Name', keep ='first')
players_median = pd_merge(players_median, Team_list, how='left', on='Team')
players_median['Var'] = players_median.index
# Add slate identifier and collect data for JSON export
players_median_copy = players_median.copy()
players_median_copy['slate'] = slates
# Create maps for Go processing
players_name_map = {str(int(idx)): str(name) for idx, name in players_median_copy.set_index('Var')['Name'].items()}
players_salary_map = {str(int(idx)): int(salary) for idx, salary in players_median_copy.set_index('Var')['Salary'].items()}
players_projection_map = {str(int(idx)): float(proj) for idx, proj in players_median_copy.set_index('Var')['Median'].items()}
players_ownership_map = {str(int(idx)): float(own) for idx, own in players_median_copy.set_index('Var')['Own'].items()}
players_team_map = {str(int(idx)): str(team) for idx, team in players_median_copy.set_index('Var')['Team'].items()}
# Create output data structure for Go
output_data = {
"players_median": {
"players": [],
"maps": {
"name_map": players_name_map,
"salary_map": players_salary_map,
"projection_map": players_projection_map,
"ownership_map": players_ownership_map,
"team_map": players_team_map
}
}
}
# Convert players to Go struct format
for idx, row in players_median_copy.iterrows():
player = {
"id": int(row['Var']),
"name": str(row['Name']),
"position": str(row['Position']),
"salary": int(row['Salary']),
"projection": float(row['Median']),
"ownership": float(row['Own']),
"salary_value": float(row['salary_Value']),
"proj_value": float(row['proj_Value']),
"own_value": float(row['own_Value']),
"sort_value": float(row['sort_Value']),
"slate": str(row['slate'])
}
output_data["players_median"]["players"].append(player)
# Calculate project root for file paths
current_dir = os.path.dirname(os.path.abspath(__file__))
project_root = os.path.dirname(os.path.dirname(current_dir))
fd_nba_dir = os.path.join(project_root, 'fd_nba_go')
os.makedirs(fd_nba_dir, exist_ok=True)
# Write JSON data for Go processing
player_data_path = os.path.join(fd_nba_dir, 'player_data.json')
with open(player_data_path, 'w') as f:
json.dump(output_data, f)
if slates == 'Main Slate':
collection = db['FD_NBA_name_map']
elif slates == 'Secondary Slate':
collection = db['FD_NBA_Secondary_name_map']
elif slates == 'Late Slate':
collection = db['FD_NBA_Late_name_map']
master_name_map = pd_Series(players_median['Name'].values,index=players_median.Var).to_dict()
master_salary_map = pd_Series(players_median['Salary'].values,index=players_median.Var).to_dict()
master_projection_map = pd_Series(players_median['Median'].values,index=players_median.Var).to_dict()
master_team_num_map = pd_Series(players_median['team_var'].values,index=players_median.Var).to_dict()
master_team_map = pd_Series(players_median['Team'].values,index=players_median.Var).to_dict()
master_own_map = pd_Series(players_median['Own'].values,index=players_median.Var).to_dict()
master_name_index = pd_Series(players_median.Var.values, index=players_median.Name).to_dict()
position_requirements = {
'PG': 2,
'SG': 2,
'SF': 2,
'PF': 2,
'C': 1,
}
salary_cap = 60000
max_team_players = 3
# Teams to loop through
teams_to_optimize = players_median['Team'].unique().tolist()
required_positions = ['PG', 'PG2', 'SG', 'SG2', 'SF', 'SF2', 'PF', 'PF2', 'C']
collection.drop()
try:
# Convert dictionary to format suitable for MongoDB
mongo_docs = [{"key": k, "value": v} for k, v in master_name_map.items()]
collection.insert_many(mongo_docs, ordered=False)
except Exception as e:
st.write(f"Error inserting name map: {e}")
time_sleep(1)
optimals = init_team_results(players_median, position_requirements, salary_cap, max_team_players, teams_to_optimize, 1000)
formatted_optimals = format_optimals(optimals, players_median, required_positions)
for col in required_positions:
if col in formatted_optimals.columns:
formatted_optimals[col] = formatted_optimals[col].map(master_name_index).fillna(formatted_optimals[col])
# formatted_optimals['proj'] = formatted_optimals['proj'] + (formatted_optimals['proj'] * ((formatted_optimals['Team_count'] - 3) * .05))
formatted_optimals['proj'] = formatted_optimals['proj'].astype(float)
formatted_optimals = formatted_optimals.rename(columns={'PG': 'PG1', 'SG': 'SG1', 'SF': 'SF1', 'PF': 'PF1'})
st.write(formatted_optimals.head(10))
# Convert this slate's optimals to JSON format and add slate info
for idx, row in formatted_optimals.iterrows():
optimal_lineup = {
"slate": slates, # Add slate identifier
"salary": int(row['salary']),
"projection": float(row['proj']),
"team": str(row['Team']),
"team_count": int(row['Team_count']),
"secondary": str(row['Secondary']),
"secondary_count": int(row['Secondary_count']),
"ownership": float(row['Own']),
"players": [int(row['PG1']), int(row['PG2']), int(row['SG1']), int(row['SG2']), int(row['SF1']), int(row['SF2']), int(row['PF1']), int(row['PF2']), int(row['C'])]
}
optimal_lineups.append(optimal_lineup)
st.write(f"Generated {len(formatted_optimals)} optimal lineups for slate {slates}")
optimal_lineups_path = os.path.join(fd_nba_dir, 'optimal_lineups.json')
with open(optimal_lineups_path, 'w') as f:
json.dump(optimal_lineups, f)
run_go_classic_lineup_generator("FD", "NBA")
st.write("NBA lineup generation for FD completed successfully!")
def upload_betting_data(client):
NBA_Master_hold = 'https://docs.google.com/spreadsheets/d/1Yq0vGriWK-bS79e-bD6_u9pqrYE6Yrlbb_wEkmH-ot0/edit?gid=853878325#gid=853878325'
db = client['NBA_Database']
try:
sh = gc.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Betting Model Clean')
Overall_Proj = DataFrame(worksheet.get_all_records())
except:
sh = gc2.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Betting Model Clean')
Overall_Proj = DataFrame(worksheet.get_all_records())
collection = db['Game_Betting_Model']
Overall_Proj = Overall_Proj.reset_index(drop=True)
chunk_size = 100000
collection.drop()
for i in range(0, len(Overall_Proj), chunk_size):
for _ in range(5):
try:
df_chunk = Overall_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)
try:
sh = gc.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Game_Model_Players')
Overall_Proj = DataFrame(worksheet.get_all_records())
except:
sh = gc2.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Game_Model_Players')
Overall_Proj = DataFrame(worksheet.get_all_records())
collection = db['Player_Stats']
Overall_Proj = Overall_Proj.reset_index(drop=True)
chunk_size = 100000
collection.drop()
for i in range(0, len(Overall_Proj), chunk_size):
for _ in range(5):
try:
df_chunk = Overall_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)
try:
sh = gc.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Prop_Frame')
Overall_Proj = DataFrame(worksheet.get_all_records())
except:
sh = gc2.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Prop_Frame')
Overall_Proj = DataFrame(worksheet.get_all_records())
collection = db['Prop_Trends']
Overall_Proj = Overall_Proj.reset_index(drop=True)
chunk_size = 100000
collection.drop()
for i in range(0, len(Overall_Proj), chunk_size):
for _ in range(5):
try:
df_chunk = Overall_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)
try:
sh = gc.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Bet_Sheet')
Overall_Proj = DataFrame(worksheet.get_all_records())
except:
sh = gc2.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Bet_Sheet')
Overall_Proj = DataFrame(worksheet.get_all_records())
collection = db['Bet_Sheet']
Overall_Proj = Overall_Proj.reset_index(drop=True)
chunk_size = 100000
collection.drop()
for i in range(0, len(Overall_Proj), chunk_size):
for _ in range(5):
try:
df_chunk = Overall_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)
try:
sh = gc.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Pick6_ingest')
Overall_Proj = DataFrame(worksheet.get_all_records())
except:
sh = gc2.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Pick6_ingest')
Overall_Proj = DataFrame(worksheet.get_all_records())
collection = db['Pick6_Trends']
Overall_Proj = Overall_Proj.reset_index(drop=True)
chunk_size = 100000
collection.drop()
for i in range(0, len(Overall_Proj), chunk_size):
for _ in range(5):
try:
df_chunk = Overall_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)
def upload_sd_dfs_data(client, sd_roo_final):
db = client['NBA_Database']
collection = db['Player_SD_Range_Of_Outcomes']
sd_roo_final = sd_roo_final.reset_index(drop=True)
chunk_size = 100000
collection.drop()
for i in range(0, len(sd_roo_final), chunk_size):
for _ in range(5):
try:
df_chunk = sd_roo_final.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)
def upload_dfs_data(client, roo_final):
db = client['NBA_Database']
try:
sh = gc.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('DK_Build_Up')
Overall_Proj = DataFrame(worksheet.get_all_records())
except:
sh = gc2.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('DK_Build_Up')
Overall_Proj = DataFrame(worksheet.get_all_records())
collection = db['DK_Player_Stats']
Overall_Proj = Overall_Proj.reset_index(drop=True)
chunk_size = 100000
collection.drop()
for i in range(0, len(Overall_Proj), chunk_size):
for _ in range(5):
try:
df_chunk = Overall_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)
try:
sh = gc.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('FD_Build_Up')
Overall_Proj = DataFrame(worksheet.get_all_records())
except:
sh = gc2.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('FD_Build_Up')
Overall_Proj = DataFrame(worksheet.get_all_records())
collection = db['FD_Player_Stats']
Overall_Proj = Overall_Proj.reset_index(drop=True)
chunk_size = 100000
collection.drop()
for i in range(0, len(Overall_Proj), chunk_size):
for _ in range(5):
try:
df_chunk = Overall_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)
try:
sh = gc.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Secondary_DK_Build')
Overall_Proj = DataFrame(worksheet.get_all_records())
except:
sh = gc2.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Secondary_DK_Build')
Overall_Proj = DataFrame(worksheet.get_all_records())
collection = db['Secondary_DK_Player_Stats']
Overall_Proj = Overall_Proj.reset_index(drop=True)
chunk_size = 100000
collection.drop()
for i in range(0, len(Overall_Proj), chunk_size):
for _ in range(5):
try:
df_chunk = Overall_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)
try:
sh = gc.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Secondary_FD_Build')
Overall_Proj = DataFrame(worksheet.get_all_records())
except:
sh = gc2.open_by_url(NBA_Master_hold)
worksheet = sh.worksheet('Secondary_FD_Build')
Overall_Proj = DataFrame(worksheet.get_all_records())
collection = db['Secondary_FD_Player_Stats']
Overall_Proj = Overall_Proj.reset_index(drop=True)
chunk_size = 100000
collection.drop()
for i in range(0, len(Overall_Proj), chunk_size):
for _ in range(5):
try:
df_chunk = Overall_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)
collection = db['Player_Range_Of_Outcomes']
roo_final = roo_final.reset_index(drop=True)
chunk_size = 100000
collection.drop()
for i in range(0, len(roo_final), chunk_size):
for _ in range(5):
try:
df_chunk = roo_final.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)