Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
|
@@ -50,79 +50,32 @@ all_dk_player_projections = 'https://docs.google.com/spreadsheets/d/1I_1Ve3F4tft
|
|
| 50 |
@st.cache_resource(ttl=299)
|
| 51 |
def init_baselines():
|
| 52 |
sh = gc.open_by_url(all_dk_player_projections)
|
| 53 |
-
worksheet = sh.worksheet('
|
| 54 |
load_display = pd.DataFrame(worksheet.get_all_records())
|
| 55 |
load_display.replace('', np.nan, inplace=True)
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
raw_display = raw_display[['Player', 'Salary', 'Position', 'Team', 'Opp', 'Median', 'Own', 'rush_yards', 'rec']]
|
| 59 |
-
dk_roo_raw = raw_display.loc[raw_display['Median'] > 0]
|
| 60 |
-
|
| 61 |
-
worksheet = sh.worksheet('FD_SD_Projections')
|
| 62 |
-
load_display = pd.DataFrame(worksheet.get_all_records())
|
| 63 |
-
load_display.replace('', np.nan, inplace=True)
|
| 64 |
-
raw_display = load_display.dropna(subset=['Half_PPR'])
|
| 65 |
-
raw_display.rename(columns={"name": "Player", "Half_PPR": "Median"}, inplace = True)
|
| 66 |
-
raw_display = raw_display[['Player', 'Salary', 'Position', 'Team', 'Opp', 'Median', 'Own', 'rush_yards', 'rec']]
|
| 67 |
-
fd_roo_raw = raw_display.loc[raw_display['Median'] > 0]
|
| 68 |
-
|
| 69 |
-
worksheet = sh.worksheet('SD_Projections_2')
|
| 70 |
-
load_display = pd.DataFrame(worksheet.get_all_records())
|
| 71 |
-
load_display.replace('', np.nan, inplace=True)
|
| 72 |
-
raw_display = load_display.dropna(subset=['PPR'])
|
| 73 |
-
raw_display.rename(columns={"name": "Player", "PPR": "Median"}, inplace = True)
|
| 74 |
-
raw_display = raw_display[['Player', 'Salary', 'Position', 'Team', 'Opp', 'Median', 'Own', 'rush_yards', 'rec']]
|
| 75 |
-
dk_roo_raw_2 = raw_display.loc[raw_display['Median'] > 0]
|
| 76 |
-
|
| 77 |
-
worksheet = sh.worksheet('FD_SD_Projections_2')
|
| 78 |
-
load_display = pd.DataFrame(worksheet.get_all_records())
|
| 79 |
-
load_display.replace('', np.nan, inplace=True)
|
| 80 |
-
raw_display = load_display.dropna(subset=['Half_PPR'])
|
| 81 |
-
raw_display.rename(columns={"name": "Player", "Half_PPR": "Median"}, inplace = True)
|
| 82 |
-
raw_display = raw_display[['Player', 'Salary', 'Position', 'Team', 'Opp', 'Median', 'Own', 'rush_yards', 'rec']]
|
| 83 |
-
fd_roo_raw_2 = raw_display.loc[raw_display['Median'] > 0]
|
| 84 |
|
| 85 |
-
|
| 86 |
-
load_display = pd.DataFrame(worksheet.get_all_records())
|
| 87 |
-
load_display.replace('', np.nan, inplace=True)
|
| 88 |
-
raw_display = load_display.dropna(subset=['PPR'])
|
| 89 |
-
raw_display.rename(columns={"name": "Player", "PPR": "Median"}, inplace = True)
|
| 90 |
-
raw_display = raw_display[['Player', 'Salary', 'Position', 'Team', 'Opp', 'Median', 'Own', 'rush_yards', 'rec']]
|
| 91 |
-
dk_roo_raw_3 = raw_display.loc[raw_display['Median'] > 0]
|
| 92 |
-
|
| 93 |
-
worksheet = sh.worksheet('FD_SD_Projections_3')
|
| 94 |
-
load_display = pd.DataFrame(worksheet.get_all_records())
|
| 95 |
-
load_display.replace('', np.nan, inplace=True)
|
| 96 |
-
raw_display = load_display.dropna(subset=['Half_PPR'])
|
| 97 |
-
raw_display.rename(columns={"name": "Player", "Half_PPR": "Median"}, inplace = True)
|
| 98 |
-
raw_display = raw_display[['Player', 'Salary', 'Position', 'Team', 'Opp', 'Median', 'Own', 'rush_yards', 'rec']]
|
| 99 |
-
fd_roo_raw_3 = raw_display.loc[raw_display['Median'] > 0]
|
| 100 |
|
| 101 |
-
worksheet = sh.worksheet('
|
| 102 |
load_display = pd.DataFrame(worksheet.get_all_records())
|
| 103 |
load_display.replace('', np.nan, inplace=True)
|
| 104 |
-
load_display.
|
| 105 |
-
raw_display = load_display.dropna(subset=['Median'])
|
| 106 |
-
dk_ids = dict(zip(raw_display['Player'], raw_display['player_id']))
|
| 107 |
|
| 108 |
-
|
| 109 |
-
load_display = pd.DataFrame(worksheet.get_all_records())
|
| 110 |
-
load_display.replace('', np.nan, inplace=True)
|
| 111 |
-
load_display.rename(columns={"Half_PPR": "Median", "name": "Player"}, inplace = True)
|
| 112 |
-
raw_display = load_display.dropna(subset=['Median'])
|
| 113 |
-
fd_ids = dict(zip(raw_display['Player'], raw_display['player_id']))
|
| 114 |
|
| 115 |
-
return dk_roo_raw,
|
| 116 |
|
| 117 |
-
dk_roo_raw,
|
| 118 |
|
| 119 |
@st.cache_data
|
| 120 |
def convert_df_to_csv(df):
|
| 121 |
return df.to_csv().encode('utf-8')
|
| 122 |
|
| 123 |
-
tab1, tab2, tab3 = st.tabs(['
|
| 124 |
|
| 125 |
-
with
|
| 126 |
st.info("The Projections file can have any columns in any order, but must contain columns explicitly named: 'Player', 'Salary', 'Position', 'Team', 'Opp', 'rush_yards', 'rec', 'Median', and 'Own'. For the purposes of this showdown optimizer, only include FLEX positions, salaries, and medians. The optimizer logic will handle the rest!")
|
| 127 |
col1, col2 = st.columns([1, 5])
|
| 128 |
|
|
@@ -148,13 +101,13 @@ with tab1:
|
|
| 148 |
if proj_file is not None:
|
| 149 |
st.dataframe(proj_dataframe.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), use_container_width = True)
|
| 150 |
|
| 151 |
-
with
|
| 152 |
col1, col2 = st.columns([1, 5])
|
| 153 |
with col1:
|
| 154 |
if st.button("Load/Reset Data", key='reset2'):
|
| 155 |
st.cache_data.clear()
|
| 156 |
-
dk_roo_raw,
|
| 157 |
-
slate_var2 = st.radio("Which data are you loading?", ('Paydirt (Main)', '
|
| 158 |
site_var2 = st.radio("What table would you like to display?", ('Draftkings', 'Fanduel'), key='site_var2')
|
| 159 |
if slate_var2 == 'User':
|
| 160 |
raw_baselines = proj_dataframe
|
|
@@ -162,142 +115,44 @@ with tab2:
|
|
| 162 |
if site_var2 == 'Draftkings':
|
| 163 |
if slate_var2 == 'Paydirt (Main)':
|
| 164 |
raw_baselines = dk_roo_raw
|
| 165 |
-
elif slate_var2 == 'Paydirt (Secondary)':
|
| 166 |
-
raw_baselines = dk_roo_raw_2
|
| 167 |
-
elif slate_var2 == 'Paydirt (Third)':
|
| 168 |
-
raw_baselines = dk_roo_raw_3
|
| 169 |
elif site_var2 == 'Fanduel':
|
| 170 |
if slate_var2 == 'Paydirt (Main)':
|
| 171 |
raw_baselines = fd_roo_raw
|
| 172 |
-
elif slate_var2 == 'Paydirt (Secondary)':
|
| 173 |
-
raw_baselines = fd_roo_raw_2
|
| 174 |
-
elif slate_var2 == 'Paydirt (Third)':
|
| 175 |
-
raw_baselines = fd_roo_raw_3
|
| 176 |
|
| 177 |
with col2:
|
| 178 |
hold_container = st.empty()
|
| 179 |
-
|
| 180 |
-
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
if site_var2 == 'Draftkings':
|
| 184 |
-
working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "Median": "Fantasy"}, inplace = True)
|
| 185 |
-
elif site_var2 == 'Fanduel':
|
| 186 |
-
working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "Median": "Fantasy"}, inplace = True)
|
| 187 |
-
working_roo.replace('', 0, inplace=True)
|
| 188 |
-
own_dict = dict(zip(working_roo.Player, working_roo.Own))
|
| 189 |
-
team_dict = dict(zip(working_roo.Player, working_roo.Team))
|
| 190 |
-
opp_dict = dict(zip(working_roo.Player, working_roo.Opp))
|
| 191 |
-
total_sims = 1000
|
| 192 |
-
|
| 193 |
-
flex_file = working_roo[['Player', 'Position', 'Salary', 'Fantasy', 'Rush Yards', 'Receptions']]
|
| 194 |
-
flex_file.rename(columns={"Fantasy": "Median", "Pos": "Position"}, inplace = True)
|
| 195 |
-
flex_file['Floor'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median']*.25) + (flex_file['Rush Yards']*.01),flex_file['Median']*.25)
|
| 196 |
-
flex_file['Ceiling'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median'] + flex_file['Floor']) + (flex_file['Rush Yards']*.01), flex_file['Median'] + flex_file['Floor'] + flex_file['Receptions'])
|
| 197 |
-
flex_file['Ceiling'] = flex_file['Ceiling'].fillna(15)
|
| 198 |
-
flex_file['STD'] = np.where(flex_file['Position'] != 'QB', (flex_file['Median']/4) + flex_file['Receptions'], (flex_file['Median']/4))
|
| 199 |
-
flex_file['STD'] = flex_file['Ceiling'].fillna(5)
|
| 200 |
-
flex_file = flex_file[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']]
|
| 201 |
-
hold_file = flex_file
|
| 202 |
-
overall_file = flex_file
|
| 203 |
-
salary_file = flex_file
|
| 204 |
-
|
| 205 |
-
overall_players = overall_file[['Player']]
|
| 206 |
-
|
| 207 |
-
for x in range(0,total_sims):
|
| 208 |
-
salary_file[x] = salary_file['Salary']
|
| 209 |
-
|
| 210 |
-
salary_file=salary_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
|
| 211 |
-
salary_file.astype('int').dtypes
|
| 212 |
-
|
| 213 |
-
salary_file = salary_file.div(1000)
|
| 214 |
-
|
| 215 |
-
for x in range(0,total_sims):
|
| 216 |
-
overall_file[x] = np.random.normal(overall_file['Median'],overall_file['STD'])
|
| 217 |
-
|
| 218 |
-
overall_file=overall_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
|
| 219 |
-
overall_file.astype('int').dtypes
|
| 220 |
-
|
| 221 |
-
players_only = hold_file[['Player']]
|
| 222 |
-
raw_lineups_file = players_only
|
| 223 |
-
|
| 224 |
-
for x in range(0,total_sims):
|
| 225 |
-
maps_dict = {'proj_map':dict(zip(hold_file.Player,hold_file[x]))}
|
| 226 |
-
raw_lineups_file[x] = sum([raw_lineups_file['Player'].map(maps_dict['proj_map'])])
|
| 227 |
-
players_only[x] = raw_lineups_file[x].rank(ascending=False)
|
| 228 |
-
|
| 229 |
-
players_only=players_only.drop(['Player'], axis=1)
|
| 230 |
-
players_only.astype('int').dtypes
|
| 231 |
-
|
| 232 |
-
salary_2x_check = (overall_file - (salary_file*2))
|
| 233 |
-
salary_3x_check = (overall_file - (salary_file*3))
|
| 234 |
-
salary_4x_check = (overall_file - (salary_file*4))
|
| 235 |
-
|
| 236 |
-
players_only['Average_Rank'] = players_only.mean(axis=1)
|
| 237 |
-
players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims
|
| 238 |
-
players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims
|
| 239 |
-
players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims
|
| 240 |
-
players_only['20+%'] = overall_file[overall_file >= 20].count(axis=1)/float(total_sims)
|
| 241 |
-
players_only['2x%'] = salary_2x_check[salary_2x_check >= 1].count(axis=1)/float(total_sims)
|
| 242 |
-
players_only['3x%'] = salary_3x_check[salary_3x_check >= 1].count(axis=1)/float(total_sims)
|
| 243 |
-
players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims)
|
| 244 |
-
|
| 245 |
-
players_only['Player'] = hold_file[['Player']]
|
| 246 |
-
|
| 247 |
-
final_outcomes = players_only[['Player', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']]
|
| 248 |
-
|
| 249 |
-
final_Proj = pd.merge(hold_file, final_outcomes, on="Player")
|
| 250 |
-
final_Proj = final_Proj[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']]
|
| 251 |
-
final_Proj['Own'] = final_Proj['Player'].map(own_dict)
|
| 252 |
-
final_Proj['Team'] = final_Proj['Player'].map(team_dict)
|
| 253 |
-
final_Proj['Opp'] = final_Proj['Player'].map(opp_dict)
|
| 254 |
-
final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own']]
|
| 255 |
-
final_Proj['Projection Rank'] = final_Proj.Median.rank(pct = True)
|
| 256 |
-
final_Proj['Own Rank'] = final_Proj.Own.rank(pct = True)
|
| 257 |
-
final_Proj['LevX'] = 0
|
| 258 |
-
final_Proj['LevX'] = final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank']
|
| 259 |
-
final_Proj['CPT_Own'] = final_Proj['Own'] / 4
|
| 260 |
-
final_Proj['CPT_Proj'] = final_Proj['Median'] * 1.5
|
| 261 |
-
final_Proj['CPT_Salary'] = final_Proj['Salary'] * 1.5
|
| 262 |
-
|
| 263 |
-
export_final_proj = final_Proj
|
| 264 |
-
export_final_proj['ID'] = export_final_proj['Player'].map(dkid_dict)
|
| 265 |
-
|
| 266 |
-
display_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']]
|
| 267 |
-
display_Proj = display_Proj.set_index('Player')
|
| 268 |
-
display_Proj = display_Proj.sort_values(by='Median', ascending=False)
|
| 269 |
|
| 270 |
-
|
| 271 |
-
|
| 272 |
-
|
| 273 |
-
|
| 274 |
|
| 275 |
-
|
| 276 |
-
|
| 277 |
-
|
| 278 |
-
|
| 279 |
-
|
| 280 |
-
|
| 281 |
|
| 282 |
-
with
|
| 283 |
col1, col2 = st.columns([1, 5])
|
| 284 |
with col1:
|
| 285 |
if st.button("Load/Reset Data", key='reset1'):
|
| 286 |
st.cache_data.clear()
|
| 287 |
-
dk_roo_raw,
|
| 288 |
for key in st.session_state.keys():
|
| 289 |
del st.session_state[key]
|
| 290 |
-
slate_var1 = st.radio("Which data are you loading?", ('Paydirt (Main)', '
|
| 291 |
site_var1 = st.selectbox("What site is the showdown on?", ('Draftkings', 'Fanduel'), key='site_var1')
|
| 292 |
if site_var1 == 'Draftkings':
|
| 293 |
if slate_var1 == 'User':
|
| 294 |
raw_baselines = proj_dataframe
|
| 295 |
elif slate_var1 == 'Paydirt (Main)':
|
| 296 |
raw_baselines = dk_roo_raw
|
| 297 |
-
elif slate_var1 == 'Paydirt (Secondary)':
|
| 298 |
-
raw_baselines = dk_roo_raw_2
|
| 299 |
-
elif slate_var1 == 'Paydirt (Third)':
|
| 300 |
-
raw_baselines = dk_roo_raw_3
|
| 301 |
elif site_var1 == 'Fanduel':
|
| 302 |
if slate_var1 == 'User':
|
| 303 |
st.info("Showdown on Fanduel sucks, you should not do that, but I understand degen's gotta degen")
|
|
@@ -305,12 +160,7 @@ with tab3:
|
|
| 305 |
elif slate_var1 == 'Paydirt (Main)':
|
| 306 |
st.info("Showdown on Fanduel sucks, you should not do that, but I understand degen's gotta degen")
|
| 307 |
raw_baselines = fd_roo_raw
|
| 308 |
-
|
| 309 |
-
st.info("Showdown on Fanduel sucks, you should not do that, but I understand degen's gotta degen")
|
| 310 |
-
raw_baselines = fd_roo_raw_2
|
| 311 |
-
elif slate_var1 == 'Paydirt (Third)':
|
| 312 |
-
st.info("Showdown on Fanduel sucks, you should not do that, but I understand degen's gotta degen")
|
| 313 |
-
raw_baselines = fd_roo_raw_3
|
| 314 |
contest_var1 = st.selectbox("What contest type are you optimizing for?", ('Cash', 'Small Field GPP', 'Large Field GPP'), key='contest_var1')
|
| 315 |
lock_var1 = st.multiselect("Are there any players you want to use in all lineups in the CAPTAIN (Lock Button)?", options = raw_baselines['Player'].unique(), key='lock_var1')
|
| 316 |
lock_var2 = st.multiselect("Are there any players you want to use in all lineups in the FLEX (Lock Button)?", options = raw_baselines['Player'].unique(), key='lock_var2')
|
|
@@ -334,39 +184,39 @@ with tab3:
|
|
| 334 |
ownframe['Own%'] = np.where((ownframe['Position'] == 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (5 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean())/100) + ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean(), ownframe['Own'])
|
| 335 |
ownframe['Own%'] = np.where((ownframe['Position'] != 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (5 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean())/100) + ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean(), ownframe['Own%'])
|
| 336 |
ownframe['Own%'] = np.where(ownframe['Own%'] > 85, 85, ownframe['Own%'])
|
| 337 |
-
ownframe['Own'] = ownframe['Own%'] * (
|
| 338 |
elif site_var1 == 'Fanduel':
|
| 339 |
ownframe = raw_baselines.copy()
|
| 340 |
ownframe['Own%'] = np.where((ownframe['Position'] == 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (5 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean())/50) + ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean(), ownframe['Own'])
|
| 341 |
ownframe['Own%'] = np.where((ownframe['Position'] != 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (5 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean())/150) + ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean(), ownframe['Own%'])
|
| 342 |
ownframe['Own%'] = np.where(ownframe['Own%'] > 75, 75, ownframe['Own%'])
|
| 343 |
-
ownframe['Own'] = ownframe['Own%'] * (
|
| 344 |
elif contest_var1 == 'Large Field GPP':
|
| 345 |
if site_var1 == 'Draftkings':
|
| 346 |
ownframe = raw_baselines.copy()
|
| 347 |
ownframe['Own%'] = np.where((ownframe['Position'] == 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (2.5 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean())/100) + ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean(), ownframe['Own'])
|
| 348 |
ownframe['Own%'] = np.where((ownframe['Position'] != 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (2.5 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean())/100) + ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean(), ownframe['Own%'])
|
| 349 |
ownframe['Own%'] = np.where(ownframe['Own%'] > 75, 75, ownframe['Own%'])
|
| 350 |
-
ownframe['Own'] = ownframe['Own%'] * (
|
| 351 |
elif site_var1 == 'Fanduel':
|
| 352 |
ownframe = raw_baselines.copy()
|
| 353 |
ownframe['Own%'] = np.where((ownframe['Position'] == 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (2.5 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean())/50) + ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean(), ownframe['Own'])
|
| 354 |
ownframe['Own%'] = np.where((ownframe['Position'] != 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (2.5 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean())/150) + ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean(), ownframe['Own%'])
|
| 355 |
ownframe['Own%'] = np.where(ownframe['Own%'] > 75, 75, ownframe['Own%'])
|
| 356 |
-
ownframe['Own'] = ownframe['Own%'] * (
|
| 357 |
elif contest_var1 == 'Cash':
|
| 358 |
if site_var1 == 'Draftkings':
|
| 359 |
ownframe = raw_baselines.copy()
|
| 360 |
ownframe['Own%'] = np.where((ownframe['Position'] == 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (6 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean())/100) + ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean(), ownframe['Own'])
|
| 361 |
ownframe['Own%'] = np.where((ownframe['Position'] != 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (6 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean())/100) + ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean(), ownframe['Own%'])
|
| 362 |
ownframe['Own%'] = np.where(ownframe['Own%'] > 90, 90, ownframe['Own%'])
|
| 363 |
-
ownframe['Own'] = ownframe['Own%'] * (
|
| 364 |
elif site_var1 == 'Fanduel':
|
| 365 |
ownframe = raw_baselines.copy()
|
| 366 |
ownframe['Own%'] = np.where((ownframe['Position'] == 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (6 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean())/50) + ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean(), ownframe['Own'])
|
| 367 |
ownframe['Own%'] = np.where((ownframe['Position'] != 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (6 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean())/150) + ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean(), ownframe['Own%'])
|
| 368 |
ownframe['Own%'] = np.where(ownframe['Own%'] > 75, 75, ownframe['Own%'])
|
| 369 |
-
ownframe['Own'] = ownframe['Own%'] * (
|
| 370 |
export_baselines = ownframe[['Player', 'Salary', 'Position', 'Team', 'Opp', 'Median', 'Own']]
|
| 371 |
export_baselines['CPT_Proj'] = export_baselines['Median'] * 1.5
|
| 372 |
export_baselines['CPT_Salary'] = export_baselines['Salary'] * 1.5
|
|
|
|
| 50 |
@st.cache_resource(ttl=299)
|
| 51 |
def init_baselines():
|
| 52 |
sh = gc.open_by_url(all_dk_player_projections)
|
| 53 |
+
worksheet = sh.worksheet('DK_SD_ROO')
|
| 54 |
load_display = pd.DataFrame(worksheet.get_all_records())
|
| 55 |
load_display.replace('', np.nan, inplace=True)
|
| 56 |
+
load_display['Salary'] = load_display['Salary'] / 1.5
|
| 57 |
+
dk_roo_raw = load_display.loc[load_display['Median'] > 0]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 58 |
|
| 59 |
+
dk_ids = dict(zip(dk_roo_raw['Player'], dk_roo_raw['player_id']))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 60 |
|
| 61 |
+
worksheet = sh.worksheet('FD_SD_ROO')
|
| 62 |
load_display = pd.DataFrame(worksheet.get_all_records())
|
| 63 |
load_display.replace('', np.nan, inplace=True)
|
| 64 |
+
fd_roo_raw = load_display.loc[load_display['Median'] > 0]
|
|
|
|
|
|
|
| 65 |
|
| 66 |
+
fd_ids = dict(zip(fd_roo_raw['Player'], fd_roo_raw['player_id']))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 67 |
|
| 68 |
+
return dk_roo_raw, fd_roo_raw, dk_ids, fd_ids
|
| 69 |
|
| 70 |
+
dk_roo_raw, fd_roo_raw, dk_ids, fd_ids = init_baselines()
|
| 71 |
|
| 72 |
@st.cache_data
|
| 73 |
def convert_df_to_csv(df):
|
| 74 |
return df.to_csv().encode('utf-8')
|
| 75 |
|
| 76 |
+
tab1, tab2, tab3 = st.tabs(['Range of Outcomes', 'Optimizer', 'Uploads and Info'])
|
| 77 |
|
| 78 |
+
with tab3:
|
| 79 |
st.info("The Projections file can have any columns in any order, but must contain columns explicitly named: 'Player', 'Salary', 'Position', 'Team', 'Opp', 'rush_yards', 'rec', 'Median', and 'Own'. For the purposes of this showdown optimizer, only include FLEX positions, salaries, and medians. The optimizer logic will handle the rest!")
|
| 80 |
col1, col2 = st.columns([1, 5])
|
| 81 |
|
|
|
|
| 101 |
if proj_file is not None:
|
| 102 |
st.dataframe(proj_dataframe.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), use_container_width = True)
|
| 103 |
|
| 104 |
+
with tab1:
|
| 105 |
col1, col2 = st.columns([1, 5])
|
| 106 |
with col1:
|
| 107 |
if st.button("Load/Reset Data", key='reset2'):
|
| 108 |
st.cache_data.clear()
|
| 109 |
+
dk_roo_raw, fd_roo_raw, dkid_dict, fdid_dict = init_baselines()
|
| 110 |
+
slate_var2 = st.radio("Which data are you loading?", ('Paydirt (Main)', 'User'), key='slate_var2')
|
| 111 |
site_var2 = st.radio("What table would you like to display?", ('Draftkings', 'Fanduel'), key='site_var2')
|
| 112 |
if slate_var2 == 'User':
|
| 113 |
raw_baselines = proj_dataframe
|
|
|
|
| 115 |
if site_var2 == 'Draftkings':
|
| 116 |
if slate_var2 == 'Paydirt (Main)':
|
| 117 |
raw_baselines = dk_roo_raw
|
|
|
|
|
|
|
|
|
|
|
|
|
| 118 |
elif site_var2 == 'Fanduel':
|
| 119 |
if slate_var2 == 'Paydirt (Main)':
|
| 120 |
raw_baselines = fd_roo_raw
|
|
|
|
|
|
|
|
|
|
|
|
|
| 121 |
|
| 122 |
with col2:
|
| 123 |
hold_container = st.empty()
|
| 124 |
+
|
| 125 |
+
display_Proj = raw_baselines[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']]
|
| 126 |
+
display_Proj = display_Proj.set_index('Player')
|
| 127 |
+
display_Proj = display_Proj.sort_values(by='Median', ascending=False)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 128 |
|
| 129 |
+
with hold_container:
|
| 130 |
+
hold_container = st.empty()
|
| 131 |
+
display_Proj = display_Proj
|
| 132 |
+
st.dataframe(display_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True)
|
| 133 |
|
| 134 |
+
st.download_button(
|
| 135 |
+
label="Export Tables",
|
| 136 |
+
data=convert_df_to_csv(raw_baselines),
|
| 137 |
+
file_name='NFL_SD_export.csv',
|
| 138 |
+
mime='text/csv',
|
| 139 |
+
)
|
| 140 |
|
| 141 |
+
with tab2:
|
| 142 |
col1, col2 = st.columns([1, 5])
|
| 143 |
with col1:
|
| 144 |
if st.button("Load/Reset Data", key='reset1'):
|
| 145 |
st.cache_data.clear()
|
| 146 |
+
dk_roo_raw, fd_roo_raw, dkid_dict, fdid_dict = init_baselines()
|
| 147 |
for key in st.session_state.keys():
|
| 148 |
del st.session_state[key]
|
| 149 |
+
slate_var1 = st.radio("Which data are you loading?", ('Paydirt (Main)', 'User'), key='slate_var1')
|
| 150 |
site_var1 = st.selectbox("What site is the showdown on?", ('Draftkings', 'Fanduel'), key='site_var1')
|
| 151 |
if site_var1 == 'Draftkings':
|
| 152 |
if slate_var1 == 'User':
|
| 153 |
raw_baselines = proj_dataframe
|
| 154 |
elif slate_var1 == 'Paydirt (Main)':
|
| 155 |
raw_baselines = dk_roo_raw
|
|
|
|
|
|
|
|
|
|
|
|
|
| 156 |
elif site_var1 == 'Fanduel':
|
| 157 |
if slate_var1 == 'User':
|
| 158 |
st.info("Showdown on Fanduel sucks, you should not do that, but I understand degen's gotta degen")
|
|
|
|
| 160 |
elif slate_var1 == 'Paydirt (Main)':
|
| 161 |
st.info("Showdown on Fanduel sucks, you should not do that, but I understand degen's gotta degen")
|
| 162 |
raw_baselines = fd_roo_raw
|
| 163 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 164 |
contest_var1 = st.selectbox("What contest type are you optimizing for?", ('Cash', 'Small Field GPP', 'Large Field GPP'), key='contest_var1')
|
| 165 |
lock_var1 = st.multiselect("Are there any players you want to use in all lineups in the CAPTAIN (Lock Button)?", options = raw_baselines['Player'].unique(), key='lock_var1')
|
| 166 |
lock_var2 = st.multiselect("Are there any players you want to use in all lineups in the FLEX (Lock Button)?", options = raw_baselines['Player'].unique(), key='lock_var2')
|
|
|
|
| 184 |
ownframe['Own%'] = np.where((ownframe['Position'] == 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (5 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean())/100) + ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean(), ownframe['Own'])
|
| 185 |
ownframe['Own%'] = np.where((ownframe['Position'] != 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (5 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean())/100) + ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean(), ownframe['Own%'])
|
| 186 |
ownframe['Own%'] = np.where(ownframe['Own%'] > 85, 85, ownframe['Own%'])
|
| 187 |
+
ownframe['Own'] = ownframe['Own%'] * (600 / ownframe['Own%'].sum())
|
| 188 |
elif site_var1 == 'Fanduel':
|
| 189 |
ownframe = raw_baselines.copy()
|
| 190 |
ownframe['Own%'] = np.where((ownframe['Position'] == 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (5 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean())/50) + ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean(), ownframe['Own'])
|
| 191 |
ownframe['Own%'] = np.where((ownframe['Position'] != 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (5 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean())/150) + ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean(), ownframe['Own%'])
|
| 192 |
ownframe['Own%'] = np.where(ownframe['Own%'] > 75, 75, ownframe['Own%'])
|
| 193 |
+
ownframe['Own'] = ownframe['Own%'] * (500 / ownframe['Own%'].sum())
|
| 194 |
elif contest_var1 == 'Large Field GPP':
|
| 195 |
if site_var1 == 'Draftkings':
|
| 196 |
ownframe = raw_baselines.copy()
|
| 197 |
ownframe['Own%'] = np.where((ownframe['Position'] == 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (2.5 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean())/100) + ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean(), ownframe['Own'])
|
| 198 |
ownframe['Own%'] = np.where((ownframe['Position'] != 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (2.5 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean())/100) + ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean(), ownframe['Own%'])
|
| 199 |
ownframe['Own%'] = np.where(ownframe['Own%'] > 75, 75, ownframe['Own%'])
|
| 200 |
+
ownframe['Own'] = ownframe['Own%'] * (600 / ownframe['Own%'].sum())
|
| 201 |
elif site_var1 == 'Fanduel':
|
| 202 |
ownframe = raw_baselines.copy()
|
| 203 |
ownframe['Own%'] = np.where((ownframe['Position'] == 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (2.5 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean())/50) + ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean(), ownframe['Own'])
|
| 204 |
ownframe['Own%'] = np.where((ownframe['Position'] != 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (2.5 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean())/150) + ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean(), ownframe['Own%'])
|
| 205 |
ownframe['Own%'] = np.where(ownframe['Own%'] > 75, 75, ownframe['Own%'])
|
| 206 |
+
ownframe['Own'] = ownframe['Own%'] * (500 / ownframe['Own%'].sum())
|
| 207 |
elif contest_var1 == 'Cash':
|
| 208 |
if site_var1 == 'Draftkings':
|
| 209 |
ownframe = raw_baselines.copy()
|
| 210 |
ownframe['Own%'] = np.where((ownframe['Position'] == 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (6 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean())/100) + ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean(), ownframe['Own'])
|
| 211 |
ownframe['Own%'] = np.where((ownframe['Position'] != 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (6 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean())/100) + ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean(), ownframe['Own%'])
|
| 212 |
ownframe['Own%'] = np.where(ownframe['Own%'] > 90, 90, ownframe['Own%'])
|
| 213 |
+
ownframe['Own'] = ownframe['Own%'] * (600 / ownframe['Own%'].sum())
|
| 214 |
elif site_var1 == 'Fanduel':
|
| 215 |
ownframe = raw_baselines.copy()
|
| 216 |
ownframe['Own%'] = np.where((ownframe['Position'] == 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (6 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean())/50) + ownframe.loc[ownframe['Position'] == 'QB', 'Own'].mean(), ownframe['Own'])
|
| 217 |
ownframe['Own%'] = np.where((ownframe['Position'] != 'QB') & (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean() >= 0), ownframe['Own'] * (6 * (ownframe['Own'] - ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean())/150) + ownframe.loc[ownframe['Position'] != 'QB', 'Own'].mean(), ownframe['Own%'])
|
| 218 |
ownframe['Own%'] = np.where(ownframe['Own%'] > 75, 75, ownframe['Own%'])
|
| 219 |
+
ownframe['Own'] = ownframe['Own%'] * (500 / ownframe['Own%'].sum())
|
| 220 |
export_baselines = ownframe[['Player', 'Salary', 'Position', 'Team', 'Opp', 'Median', 'Own']]
|
| 221 |
export_baselines['CPT_Proj'] = export_baselines['Median'] * 1.5
|
| 222 |
export_baselines['CPT_Salary'] = export_baselines['Salary'] * 1.5
|