Multichem commited on
Commit
b8ba443
·
verified ·
1 Parent(s): 2532b19

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +38 -188
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('SD_Projections')
54
  load_display = pd.DataFrame(worksheet.get_all_records())
55
  load_display.replace('', np.nan, inplace=True)
56
- raw_display = load_display.dropna(subset=['PPR'])
57
- raw_display.rename(columns={"name": "Player", "PPR": "Median"}, inplace = True)
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
- worksheet = sh.worksheet('SD_Projections_3')
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('SD_Projections')
102
  load_display = pd.DataFrame(worksheet.get_all_records())
103
  load_display.replace('', np.nan, inplace=True)
104
- load_display.rename(columns={"PPR": "Median", "name": "Player"}, inplace = True)
105
- raw_display = load_display.dropna(subset=['Median'])
106
- dk_ids = dict(zip(raw_display['Player'], raw_display['player_id']))
107
 
108
- worksheet = sh.worksheet('FD_SD_Projections')
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, dk_roo_raw_2, dk_roo_raw_3, fd_roo_raw, fd_roo_raw_2, fd_roo_raw_3, dk_ids, fd_ids
116
 
117
- dk_roo_raw, dk_roo_raw_2, dk_roo_raw_3, fd_roo_raw, fd_roo_raw_2, fd_roo_raw_3, dkid_dict, fdid_dict = init_baselines()
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(['Uploads and Info', 'Range of Outcomes', 'Optimizer'])
124
 
125
- with tab1:
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 tab2:
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, dk_roo_raw_2, dk_roo_raw_3, fd_roo_raw, fd_roo_raw_2, fd_roo_raw_3, dkid_dict, fdid_dict = init_baselines()
157
- slate_var2 = st.radio("Which data are you loading?", ('Paydirt (Main)', 'Paydirt (Secondary)', 'Paydirt (Third)', 'User'), key='slate_var2')
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
- if st.button('Create Range of Outcomes for Slate'):
180
- with hold_container:
181
- working_roo = raw_baselines
182
- working_roo = working_roo.loc[working_roo['Median'] > 0]
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
- with hold_container:
271
- hold_container = st.empty()
272
- display_Proj = display_Proj
273
- st.dataframe(display_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True)
274
 
275
- st.download_button(
276
- label="Export Tables",
277
- data=convert_df_to_csv(export_final_proj),
278
- file_name='Custom_NFL_overall_export.csv',
279
- mime='text/csv',
280
- )
281
 
282
- with tab3:
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, dk_roo_raw_2, dk_roo_raw_3, fd_roo_raw, fd_roo_raw_2, fd_roo_raw_3, dkid_dict, fdid_dict = init_baselines()
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)', 'Paydirt (Secondary)', 'Paydirt (Third)', 'User'), key='slate_var1')
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
- elif slate_var1 == 'Paydirt (Secondary)':
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%'] * (500 / ownframe['Own%'].sum())
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%'] * (400 / ownframe['Own%'].sum())
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%'] * (500 / ownframe['Own%'].sum())
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%'] * (400 / ownframe['Own%'].sum())
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%'] * (500 / ownframe['Own%'].sum())
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%'] * (400 / ownframe['Own%'].sum())
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