James McCool commited on
Commit
ad70227
·
1 Parent(s): d57ad87

Refactor app.py to support NBA data integration and enhance functionality for both NFL and NBA sports. Added new functions for initializing seed frames and updated existing functions to handle sport-specific data. Improved data handling for ownership calculations and adjusted data structures for better performance. Updated user interface elements to allow sport selection and corresponding data loading.

Browse files
Files changed (1) hide show
  1. app.py +362 -66
app.py CHANGED
@@ -38,68 +38,191 @@ def init_conn():
38
 
39
  uri = st.secrets['mongo_uri']
40
  client = pymongo.MongoClient(uri, retryWrites=True, serverSelectionTimeoutMS=500000)
41
- db = client["testing_db"]
42
 
43
  NFL_Data = st.secrets['NFL_Data']
44
 
 
 
45
  gc = gspread.service_account_from_dict(credentials)
46
  gc2 = gspread.service_account_from_dict(credentials2)
47
 
48
- return gc, gc2, db, NFL_Data
49
 
50
- gcservice_account, gcservice_account2, db, NFL_Data = init_conn()
51
 
52
  percentages_format = {'Exposure': '{:.2%}'}
53
  freq_format = {'Exposure': '{:.2%}', 'Proj Own': '{:.2%}', 'Edge': '{:.2%}'}
54
- dk_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count']
55
- fd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count']
56
 
57
  @st.cache_data(ttl = 599)
58
- def init_DK_seed_frames():
59
-
60
- collection = db["DK_NFL_SD_seed_frame"]
 
 
 
 
61
  cursor = collection.find()
62
 
63
  raw_display = pd.DataFrame(list(cursor))
64
- raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count']]
65
  DK_seed = raw_display.to_numpy()
66
 
67
  return DK_seed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
  @st.cache_data(ttl = 599)
70
- def init_FD_seed_frames():
 
 
 
 
 
71
 
72
- collection = db["FD_NFL_SD_seed_frame"]
73
  cursor = collection.find()
74
 
75
  raw_display = pd.DataFrame(list(cursor))
76
- raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count']]
77
  FD_seed = raw_display.to_numpy()
78
 
79
  return FD_seed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80
 
81
  @st.cache_data(ttl = 599)
82
- def init_baselines():
83
- try:
84
- sh = gcservice_account.open_by_url(NFL_Data)
85
- except:
86
- sh = gcservice_account2.open_by_url(NFL_Data)
 
87
 
88
- worksheet = sh.worksheet('DK_SD_ROO')
89
- load_display = pd.DataFrame(worksheet.get_all_records())
90
- load_display.replace('', np.nan, inplace=True)
91
- load_display['STDev'] = load_display['Median'] / 4
92
- load_display = load_display.drop_duplicates(subset=['Player'], keep='first')
93
 
94
- dk_raw = load_display.dropna(subset=['Median'])
 
 
 
 
 
 
 
 
 
 
 
95
 
96
- worksheet = sh.worksheet('FD_SD_ROO')
97
- load_display = pd.DataFrame(worksheet.get_all_records())
98
- load_display.replace('', np.nan, inplace=True)
99
- load_display['STDev'] = load_display['Median'] / 4
100
- load_display = load_display.drop_duplicates(subset=['Player'], keep='first')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
 
102
- fd_raw = load_display.dropna(subset=['Median'])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
 
104
  return dk_raw, fd_raw
105
 
@@ -130,7 +253,9 @@ def sim_contest(Sim_size, seed_frame, maps_dict, sharp_split, Contest_Size):
130
 
131
  # Pre-vectorize functions
132
  vec_projection_map = np.vectorize(maps_dict['Projection_map'].__getitem__)
 
133
  vec_stdev_map = np.vectorize(maps_dict['STDev_map'].__getitem__)
 
134
 
135
  st.write('Simulating contest on frames')
136
 
@@ -138,10 +263,16 @@ def sim_contest(Sim_size, seed_frame, maps_dict, sharp_split, Contest_Size):
138
  fp_random = fp_array[np.random.choice(fp_array.shape[0], Contest_Size)]
139
 
140
  sample_arrays1 = np.c_[
141
- fp_random,
142
  np.sum(np.random.normal(
143
- loc=vec_projection_map(fp_random[:, :-6]),
144
- scale=vec_stdev_map(fp_random[:, :-6])),
 
 
 
 
 
 
145
  axis=1)
146
  ]
147
 
@@ -154,10 +285,6 @@ def sim_contest(Sim_size, seed_frame, maps_dict, sharp_split, Contest_Size):
154
 
155
  return Sim_Winners
156
 
157
- DK_seed = init_DK_seed_frames()
158
- FD_seed = init_FD_seed_frames()
159
- dk_raw, fd_raw = init_baselines()
160
-
161
  tab1, tab2 = st.tabs(['Contest Sims', 'Data Export'])
162
  with tab2:
163
  col1, col2 = st.columns([1, 7])
@@ -166,13 +293,32 @@ with tab2:
166
  st.cache_data.clear()
167
  for key in st.session_state.keys():
168
  del st.session_state[key]
169
- DK_seed = init_DK_seed_frames()
170
- FD_seed = init_FD_seed_frames()
171
- dk_raw, fd_raw = init_baselines()
172
-
173
- slate_var1 = st.radio("Which data are you loading?", ('Showdown', 'Other Showdown'))
174
- site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'))
 
175
  if site_var1 == 'Draftkings':
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
176
  raw_baselines = dk_raw
177
  column_names = dk_columns
178
 
@@ -189,6 +335,24 @@ with tab2:
189
  stack_var2 = [5, 4, 3, 2, 1, 0]
190
 
191
  elif site_var1 == 'Fanduel':
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
192
  raw_baselines = fd_raw
193
  column_names = fd_columns
194
 
@@ -207,6 +371,7 @@ with tab2:
207
 
208
  if st.button("Prepare data export", key='data_export'):
209
  data_export = st.session_state.working_seed.copy()
 
210
  st.download_button(
211
  label="Export optimals set",
212
  data=convert_df(data_export),
@@ -249,27 +414,68 @@ with tab1:
249
  st.cache_data.clear()
250
  for key in st.session_state.keys():
251
  del st.session_state[key]
252
- DK_seed = init_DK_seed_frames()
253
- FD_seed = init_FD_seed_frames()
254
- dk_raw, fd_raw = init_baselines()
255
- sim_slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Other Main Slate'), key='sim_slate_var1')
256
  sim_site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'), key='sim_site_var1')
257
  if sim_site_var1 == 'Draftkings':
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
258
  raw_baselines = dk_raw
259
  column_names = dk_columns
260
  elif sim_site_var1 == 'Fanduel':
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
261
  raw_baselines = fd_raw
262
  column_names = fd_columns
263
 
264
  contest_var1 = st.selectbox("What contest size are you simulating?", ('Small', 'Medium', 'Large', 'Custom'))
265
  if contest_var1 == 'Small':
266
  Contest_Size = 1000
 
 
 
267
  elif contest_var1 == 'Medium':
268
  Contest_Size = 5000
 
269
  elif contest_var1 == 'Large':
270
  Contest_Size = 10000
 
271
  elif contest_var1 == 'Custom':
272
- Contest_Size = st.number_input("Insert contest size", value=100, placeholder="Type a number under 10,000...")
273
  strength_var1 = st.selectbox("How sharp is the field in the contest?", ('Very', 'Above Average', 'Average', 'Below Average', 'Not Very'))
274
  if strength_var1 == 'Not Very':
275
  sharp_split = 500000
@@ -288,11 +494,14 @@ with tab1:
288
  if 'working_seed' in st.session_state:
289
  maps_dict = {
290
  'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),
 
291
  'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)),
292
  'Pos_map':dict(zip(raw_baselines.Player,raw_baselines.Position)),
293
  'Own_map':dict(zip(raw_baselines.Player,raw_baselines['Own'])),
 
294
  'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)),
295
- 'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev))
 
296
  }
297
  Sim_Winners = sim_contest(1000, st.session_state.working_seed, maps_dict, sharp_split, Contest_Size)
298
  Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
@@ -306,7 +515,7 @@ with tab1:
306
  Sim_Winner_Frame = Sim_Winner_Frame.assign(win_count=Sim_Winner_Frame['unique_id'].map(Sim_Winner_Frame['unique_id'].value_counts()))
307
 
308
  # Type Casting
309
- type_cast_dict = {'salary': int, 'proj': np.float16, 'Fantasy': np.float16, 'GPP_Proj': np.float32}
310
  Sim_Winner_Frame = Sim_Winner_Frame.astype(type_cast_dict)
311
 
312
  # Sorting
@@ -326,11 +535,14 @@ with tab1:
326
  st.session_state.working_seed = FD_seed.copy()
327
  maps_dict = {
328
  'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),
 
329
  'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)),
330
  'Pos_map':dict(zip(raw_baselines.Player,raw_baselines.Position)),
331
  'Own_map':dict(zip(raw_baselines.Player,raw_baselines['Own'])),
 
332
  'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)),
333
- 'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev))
 
334
  }
335
  Sim_Winners = sim_contest(1000, st.session_state.working_seed, maps_dict, sharp_split, Contest_Size)
336
  Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
@@ -341,10 +553,86 @@ with tab1:
341
  Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=column_names + ['Fantasy'])
342
  Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['proj'] + Sim_Winner_Frame['Fantasy']) / 2
343
  Sim_Winner_Frame['unique_id'] = Sim_Winner_Frame['proj'].astype(str) + Sim_Winner_Frame['salary'].astype(str) + Sim_Winner_Frame['Team'].astype(str) + Sim_Winner_Frame['Secondary'].astype(str)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
344
  Sim_Winner_Frame = Sim_Winner_Frame.assign(win_count=Sim_Winner_Frame['unique_id'].map(Sim_Winner_Frame['unique_id'].value_counts()))
345
 
346
  # Type Casting
347
- type_cast_dict = {'salary': int, 'proj': np.float16, 'Fantasy': np.float16, 'GPP_Proj': np.float32}
348
  Sim_Winner_Frame = Sim_Winner_Frame.astype(type_cast_dict)
349
 
350
  # Sorting
@@ -353,6 +641,7 @@ with tab1:
353
 
354
  # Data Copying
355
  st.session_state.Sim_Winner_Export = Sim_Winner_Frame.copy()
 
356
 
357
  # Data Copying
358
  st.session_state.Sim_Winner_Display = Sim_Winner_Frame.copy()
@@ -366,7 +655,13 @@ with tab1:
366
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
367
  freq_working['Freq'] = freq_working['Freq'].astype(int)
368
  freq_working['Position'] = freq_working['Player'].map(maps_dict['Pos_map'])
369
- freq_working['Salary'] = freq_working['Player'].map(maps_dict['Salary_map']) / 1.5
 
 
 
 
 
 
370
  freq_working['Proj Own'] = freq_working['Player'].map(maps_dict['Own_map']) / 100
371
  freq_working['Exposure'] = freq_working['Freq']/(1000)
372
  freq_working['Edge'] = freq_working['Exposure'] - freq_working['Proj Own']
@@ -381,8 +676,11 @@ with tab1:
381
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
382
  cpt_working['Freq'] = cpt_working['Freq'].astype(int)
383
  cpt_working['Position'] = cpt_working['Player'].map(maps_dict['Pos_map'])
384
- cpt_working['Salary'] = cpt_working['Player'].map(maps_dict['Salary_map'])
385
- cpt_working['Proj Own'] = cpt_working['Player'].map(maps_dict['Own_map']) / 400
 
 
 
386
  cpt_working['Exposure'] = cpt_working['Freq']/(1000)
387
  cpt_working['Edge'] = cpt_working['Exposure'] - cpt_working['Proj Own']
388
  cpt_working['Team'] = cpt_working['Player'].map(maps_dict['Team_map'])
@@ -391,13 +689,21 @@ with tab1:
391
  if sim_site_var1 == 'Draftkings':
392
  flex_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,1:6].values, return_counts=True)),
393
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
 
394
  elif sim_site_var1 == 'Fanduel':
395
  flex_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,1:5].values, return_counts=True)),
396
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
 
397
  flex_working['Freq'] = flex_working['Freq'].astype(int)
398
  flex_working['Position'] = flex_working['Player'].map(maps_dict['Pos_map'])
399
- flex_working['Salary'] = flex_working['Player'].map(maps_dict['Salary_map'])
400
- flex_working['Proj Own'] = (flex_working['Player'].map(maps_dict['Own_map']) / 100) - (flex_working['Player'].map(maps_dict['Own_map']) / 400)
 
 
 
 
 
 
401
  flex_working['Exposure'] = flex_working['Freq']/(1000)
402
  flex_working['Edge'] = flex_working['Exposure'] - flex_working['Proj Own']
403
  flex_working['Team'] = flex_working['Player'].map(maps_dict['Team_map'])
@@ -412,16 +718,6 @@ with tab1:
412
  team_working['Freq'] = team_working['Freq'].astype(int)
413
  team_working['Exposure'] = team_working['Freq']/(1000)
414
  st.session_state.team_freq = team_working.copy()
415
-
416
- if sim_site_var1 == 'Draftkings':
417
- stack_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,10:11].values, return_counts=True)),
418
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
419
- elif sim_site_var1 == 'Fanduel':
420
- stack_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,9:10].values, return_counts=True)),
421
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
422
- stack_working['Freq'] = stack_working['Freq'].astype(int)
423
- stack_working['Exposure'] = stack_working['Freq']/(1000)
424
- st.session_state.stack_freq = stack_working.copy()
425
 
426
  with st.container():
427
  if st.button("Reset Sim", key='reset_sim'):
 
38
 
39
  uri = st.secrets['mongo_uri']
40
  client = pymongo.MongoClient(uri, retryWrites=True, serverSelectionTimeoutMS=500000)
 
41
 
42
  NFL_Data = st.secrets['NFL_Data']
43
 
44
+ NBA_Data = st.secrets['NBA_Data']
45
+
46
  gc = gspread.service_account_from_dict(credentials)
47
  gc2 = gspread.service_account_from_dict(credentials2)
48
 
49
+ return gc, gc2, client, NFL_Data, NBA_Data
50
 
51
+ gcservice_account, gcservice_account2, client, NFL_Data, NBA_Data = init_conn()
52
 
53
  percentages_format = {'Exposure': '{:.2%}'}
54
  freq_format = {'Exposure': '{:.2%}', 'Proj Own': '{:.2%}', 'Edge': '{:.2%}'}
55
+ dk_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
56
+ fd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
57
 
58
  @st.cache_data(ttl = 599)
59
+ def init_DK_seed_frames(sport):
60
+ if sport == 'NFL':
61
+ db = client["NFL_Database"]
62
+ elif sport == 'NBA':
63
+ db = client["NBA_DFS"]
64
+
65
+ collection = db[f"DK_{sport}_SD_seed_frame"]
66
  cursor = collection.find()
67
 
68
  raw_display = pd.DataFrame(list(cursor))
69
+ raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
70
  DK_seed = raw_display.to_numpy()
71
 
72
  return DK_seed
73
+
74
+ @st.cache_data(ttl = 599)
75
+ def init_DK_secondary_seed_frames(sport):
76
+
77
+ if sport == 'NFL':
78
+ db = client["NFL_Database"]
79
+ elif sport == 'NBA':
80
+ db = client["NBA_DFS"]
81
+
82
+ collection = db[f"DK_{sport}_Secondary_SD_seed_frame"]
83
+ cursor = collection.find()
84
+
85
+ raw_display = pd.DataFrame(list(cursor))
86
+ raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
87
+ DK_second_seed = raw_display.to_numpy()
88
 
89
+ return DK_second_seed
90
+
91
+ @st.cache_data(ttl = 599)
92
+ def init_DK_auxiliary_seed_frames(sport):
93
+
94
+ if sport == 'NFL':
95
+ db = client["NFL_Database"]
96
+ elif sport == 'NBA':
97
+ db = client["NBA_DFS"]
98
+
99
+ collection = db[f"DK_{sport}_Auxiliary_SD_seed_frame"]
100
+ cursor = collection.find()
101
+
102
+ raw_display = pd.DataFrame(list(cursor))
103
+ raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
104
+ DK_auxiliary_seed = raw_display.to_numpy()
105
+
106
+ return DK_auxiliary_seed
107
+
108
  @st.cache_data(ttl = 599)
109
+ def init_FD_seed_frames(sport):
110
+
111
+ if sport == 'NFL':
112
+ db = client["NFL_Database"]
113
+ elif sport == 'NBA':
114
+ db = client["NBA_DFS"]
115
 
116
+ collection = db[f"FD_{sport}_SD_seed_frame"]
117
  cursor = collection.find()
118
 
119
  raw_display = pd.DataFrame(list(cursor))
120
+ raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
121
  FD_seed = raw_display.to_numpy()
122
 
123
  return FD_seed
124
+
125
+ @st.cache_data(ttl = 599)
126
+ def init_FD_secondary_seed_frames(sport):
127
+
128
+ if sport == 'NFL':
129
+ db = client["NFL_Database"]
130
+ elif sport == 'NBA':
131
+ db = client["NBA_DFS"]
132
+
133
+ collection = db[f"FD_{sport}_Secondary_SD_seed_frame"]
134
+ cursor = collection.find()
135
+
136
+ raw_display = pd.DataFrame(list(cursor))
137
+ raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
138
+ FD_second_seed = raw_display.to_numpy()
139
+
140
+ return FD_second_seed
141
 
142
  @st.cache_data(ttl = 599)
143
+ def init_FD_auxiliary_seed_frames(sport):
144
+
145
+ if sport == 'NFL':
146
+ db = client["NFL_Database"]
147
+ elif sport == 'NBA':
148
+ db = client["NBA_DFS"]
149
 
150
+ collection = db[f"FD_{sport}_Auxiliary_SD_seed_frame"]
151
+ cursor = collection.find()
 
 
 
152
 
153
+ raw_display = pd.DataFrame(list(cursor))
154
+ raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
155
+ FD_auxiliary_seed = raw_display.to_numpy()
156
+
157
+ return FD_auxiliary_seed
158
+
159
+ @st.cache_data(ttl = 599)
160
+ def init_baselines(sport):
161
+ if sport == 'NFL':
162
+ db = client["NFL_Database"]
163
+ collection = db['DK_SD_NFL_ROO']
164
+ cursor = collection.find()
165
 
166
+ raw_display = pd.DataFrame(list(cursor))
167
+ raw_display = raw_display[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%',
168
+ 'Own', 'Small_Field_Own', 'Large_Field_Own', 'Cash_Field_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_id', 'site']]
169
+ raw_display['Small_Field_Own'] = raw_display['Large_Field_Own']
170
+ raw_display['small_CPT_Own_raw'] = (raw_display['Small_Field_Own'] / 2) * ((100 - (100-raw_display['Small_Field_Own']))/100)
171
+ small_cpt_own_var = 300 / raw_display['small_CPT_Own_raw'].sum()
172
+ raw_display['small_CPT_Own'] = raw_display['small_CPT_Own_raw'] * small_cpt_own_var
173
+ raw_display['cpt_Median'] = raw_display['Median'] * 1.25
174
+ raw_display['STDev'] = raw_display['Median'] / 4
175
+ raw_display['CPT_STDev'] = raw_display['cpt_Median'] / 4
176
+
177
+ dk_raw = raw_display.dropna(subset=['Median'])
178
+
179
+ collection = db['FD_SD_NFL_ROO']
180
+ cursor = collection.find()
181
+
182
+ raw_display = pd.DataFrame(list(cursor))
183
+ raw_display = raw_display[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%',
184
+ 'Own', 'Small_Field_Own', 'Large_Field_Own', 'Cash_Field_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_id', 'site']]
185
+ raw_display['Small_Field_Own'] = raw_display['Large_Field_Own']
186
+ raw_display['small_CPT_Own'] = raw_display['CPT_Own']
187
+ raw_display['cpt_Median'] = raw_display['Median']
188
+ raw_display['STDev'] = raw_display['Median'] / 4
189
+ raw_display['CPT_STDev'] = raw_display['cpt_Median'] / 4
190
+
191
+ fd_raw = raw_display.dropna(subset=['Median'])
192
+
193
+ elif sport == 'NBA':
194
+ db = client["NBA_DFS"]
195
+ collection = db['Player_SD_Range_Of_Outcomes']
196
+ cursor = collection.find()
197
 
198
+ raw_display = pd.DataFrame(list(cursor))
199
+ raw_display = raw_display[['Player', 'Minutes Proj', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%',
200
+ 'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'ValX', 'site', 'version', 'slate', 'timestamp', 'player_id']]
201
+ raw_display = raw_display[raw_display['site'] == 'Draftkings']
202
+ raw_display['Small_Field_Own'] = raw_display['Small_Own']
203
+ raw_display['small_CPT_Own_raw'] = (raw_display['Small_Field_Own'] / 2) * ((100 - (100-raw_display['Small_Field_Own']))/100)
204
+ small_cpt_own_var = 300 / raw_display['small_CPT_Own_raw'].sum()
205
+ raw_display['small_CPT_Own'] = raw_display['small_CPT_Own_raw'] * small_cpt_own_var
206
+ raw_display['cpt_Median'] = raw_display['Median'] * 1.25
207
+ raw_display['STDev'] = raw_display['Median'] / 4
208
+ raw_display['CPT_STDev'] = raw_display['cpt_Median'] / 4
209
+
210
+ dk_raw = raw_display.dropna(subset=['Median'])
211
+
212
+ collection = db['Player_SD_Range_Of_Outcomes']
213
+ cursor = collection.find()
214
+
215
+ raw_display = pd.DataFrame(list(cursor))
216
+ raw_display = raw_display[['Player', 'Minutes Proj', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%',
217
+ 'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'ValX', 'site', 'version', 'slate', 'timestamp', 'player_id']]
218
+ raw_display = raw_display[raw_display['site'] == 'Fanduel']
219
+ raw_display['Small_Field_Own'] = raw_display['Large_Own']
220
+ raw_display['small_CPT_Own'] = raw_display['CPT_Own']
221
+ raw_display['cpt_Median'] = raw_display['Median']
222
+ raw_display['STDev'] = raw_display['Median'] / 4
223
+ raw_display['CPT_STDev'] = raw_display['cpt_Median'] / 4
224
+
225
+ fd_raw = raw_display.dropna(subset=['Median'])
226
 
227
  return dk_raw, fd_raw
228
 
 
253
 
254
  # Pre-vectorize functions
255
  vec_projection_map = np.vectorize(maps_dict['Projection_map'].__getitem__)
256
+ vec_cpt_projection_map = np.vectorize(maps_dict['cpt_projection_map'].__getitem__)
257
  vec_stdev_map = np.vectorize(maps_dict['STDev_map'].__getitem__)
258
+ vec_cpt_stdev_map = np.vectorize(maps_dict['cpt_STDev_map'].__getitem__)
259
 
260
  st.write('Simulating contest on frames')
261
 
 
263
  fp_random = fp_array[np.random.choice(fp_array.shape[0], Contest_Size)]
264
 
265
  sample_arrays1 = np.c_[
266
+ fp_random,
267
  np.sum(np.random.normal(
268
+ loc=np.concatenate([
269
+ vec_cpt_projection_map(fp_random[:, 0:1]), # Apply cpt_projection_map to first column
270
+ vec_projection_map(fp_random[:, 1:-7]) # Apply original projection to remaining columns
271
+ ], axis=1),
272
+ scale=np.concatenate([
273
+ vec_cpt_stdev_map(fp_random[:, 0:1]), # Apply cpt_projection_map to first column
274
+ vec_stdev_map(fp_random[:, 1:-7]) # Apply original projection to remaining columns
275
+ ], axis=1)),
276
  axis=1)
277
  ]
278
 
 
285
 
286
  return Sim_Winners
287
 
 
 
 
 
288
  tab1, tab2 = st.tabs(['Contest Sims', 'Data Export'])
289
  with tab2:
290
  col1, col2 = st.columns([1, 7])
 
293
  st.cache_data.clear()
294
  for key in st.session_state.keys():
295
  del st.session_state[key]
296
+ dk_raw, fd_raw = init_baselines('NFL')
297
+
298
+ sport_var1 = st.radio("What sport are you working with?", ('NFL', 'NBA'), key='sport_var1')
299
+ dk_raw, fd_raw = init_baselines(sport_var1)
300
+ slate_var1 = st.radio("Which data are you loading?", ('Showdown', 'Secondary Showdown', 'Auxiliary Showdown'), key='slate_var1')
301
+
302
+ site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'), key='site_var1')
303
  if site_var1 == 'Draftkings':
304
+ if slate_var1 == 'Showdown':
305
+ DK_seed = init_DK_seed_frames(sport_var1)
306
+ if sport_var1 == 'NFL':
307
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
308
+ elif sport_var1 == 'NBA':
309
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
310
+ elif slate_var1 == 'Secondary Showdown':
311
+ DK_seed = init_DK_secondary_seed_frames(sport_var1)
312
+ if sport_var1 == 'NFL':
313
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
314
+ elif sport_var1 == 'NBA':
315
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
316
+ elif slate_var1 == 'Auxiliary Showdown':
317
+ DK_seed = init_DK_auxiliary_seed_frames(sport_var1)
318
+ if sport_var1 == 'NFL':
319
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
320
+ elif sport_var1 == 'NBA':
321
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
322
  raw_baselines = dk_raw
323
  column_names = dk_columns
324
 
 
335
  stack_var2 = [5, 4, 3, 2, 1, 0]
336
 
337
  elif site_var1 == 'Fanduel':
338
+ if slate_var1 == 'Showdown':
339
+ FD_seed = init_FD_seed_frames(sport_var1)
340
+ if sport_var1 == 'NFL':
341
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
342
+ elif sport_var1 == 'NBA':
343
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
344
+ elif slate_var1 == 'Secondary Showdown':
345
+ FD_seed = init_FD_secondary_seed_frames(sport_var1)
346
+ if sport_var1 == 'NFL':
347
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
348
+ elif sport_var1 == 'NBA':
349
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
350
+ elif slate_var1 == 'Auxiliary Showdown':
351
+ FD_seed = init_FD_auxiliary_seed_frames(sport_var1)
352
+ if sport_var1 == 'NFL':
353
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
354
+ elif sport_var1 == 'NBA':
355
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
356
  raw_baselines = fd_raw
357
  column_names = fd_columns
358
 
 
371
 
372
  if st.button("Prepare data export", key='data_export'):
373
  data_export = st.session_state.working_seed.copy()
374
+ data_export[0:6, 0] = [export_id_dict[x] for x in data_export[0:6, 0]]
375
  st.download_button(
376
  label="Export optimals set",
377
  data=convert_df(data_export),
 
414
  st.cache_data.clear()
415
  for key in st.session_state.keys():
416
  del st.session_state[key]
417
+ dk_raw, fd_raw = init_baselines('NFL')
418
+ sim_sport_var1 = st.radio("What sport are you working with?", ('NFL', 'NBA'), key='sim_sport_var1')
419
+ dk_raw, fd_raw = init_baselines(sim_sport_var1)
420
+ sim_slate_var1 = st.radio("Which data are you loading?", ('Showdown', 'Secondary Showdown', 'Auxiliary Showdown'), key='sim_slate_var1')
421
  sim_site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'), key='sim_site_var1')
422
  if sim_site_var1 == 'Draftkings':
423
+ if sim_slate_var1 == 'Showdown':
424
+ DK_seed = init_DK_seed_frames(sim_sport_var1)
425
+ if sport_var1 == 'NFL':
426
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
427
+ elif sport_var1 == 'NBA':
428
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
429
+ elif sim_slate_var1 == 'Secondary Showdown':
430
+ DK_seed = init_DK_secondary_seed_frames(sim_sport_var1)
431
+ if sport_var1 == 'NFL':
432
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
433
+ elif sport_var1 == 'NBA':
434
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
435
+ elif sim_slate_var1 == 'Auxiliary Showdown':
436
+ DK_seed = init_DK_auxiliary_seed_frames(sim_sport_var1)
437
+ if sport_var1 == 'NFL':
438
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
439
+ elif sport_var1 == 'NBA':
440
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
441
  raw_baselines = dk_raw
442
  column_names = dk_columns
443
  elif sim_site_var1 == 'Fanduel':
444
+ if sim_slate_var1 == 'Showdown':
445
+ FD_seed = init_FD_seed_frames(sim_sport_var1)
446
+ if sport_var1 == 'NFL':
447
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
448
+ elif sport_var1 == 'NBA':
449
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
450
+ elif sim_slate_var1 == 'Secondary Showdown':
451
+ FD_seed = init_FD_secondary_seed_frames(sim_sport_var1)
452
+ if sport_var1 == 'NFL':
453
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
454
+ elif sport_var1 == 'NBA':
455
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
456
+ elif sim_slate_var1 == 'Auxiliary Showdown':
457
+ FD_seed = init_FD_auxiliary_seed_frames(sim_sport_var1)
458
+ if sport_var1 == 'NFL':
459
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
460
+ elif sport_var1 == 'NBA':
461
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
462
  raw_baselines = fd_raw
463
  column_names = fd_columns
464
 
465
  contest_var1 = st.selectbox("What contest size are you simulating?", ('Small', 'Medium', 'Large', 'Custom'))
466
  if contest_var1 == 'Small':
467
  Contest_Size = 1000
468
+ st.write("Small field size is 1,000 entrants.")
469
+ raw_baselines['Own'] = raw_baselines['Small_Field_Own']
470
+ raw_baselines['CPT_Own'] = raw_baselines['small_CPT_Own']
471
  elif contest_var1 == 'Medium':
472
  Contest_Size = 5000
473
+ st.write("Medium field size is 5,000 entrants.")
474
  elif contest_var1 == 'Large':
475
  Contest_Size = 10000
476
+ st.write("Large field size is 10,000 entrants.")
477
  elif contest_var1 == 'Custom':
478
+ Contest_Size = st.number_input("Insert contest size", value=100, min_value=1, max_value=100000)
479
  strength_var1 = st.selectbox("How sharp is the field in the contest?", ('Very', 'Above Average', 'Average', 'Below Average', 'Not Very'))
480
  if strength_var1 == 'Not Very':
481
  sharp_split = 500000
 
494
  if 'working_seed' in st.session_state:
495
  maps_dict = {
496
  'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),
497
+ 'cpt_projection_map':dict(zip(raw_baselines.Player,raw_baselines.cpt_Median)),
498
  'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)),
499
  'Pos_map':dict(zip(raw_baselines.Player,raw_baselines.Position)),
500
  'Own_map':dict(zip(raw_baselines.Player,raw_baselines['Own'])),
501
+ 'cpt_Own_map':dict(zip(raw_baselines.Player,raw_baselines['CPT_Own'])),
502
  'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)),
503
+ 'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev)),
504
+ 'cpt_STDev_map':dict(zip(raw_baselines.Player,raw_baselines['CPT_STDev']))
505
  }
506
  Sim_Winners = sim_contest(1000, st.session_state.working_seed, maps_dict, sharp_split, Contest_Size)
507
  Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
 
515
  Sim_Winner_Frame = Sim_Winner_Frame.assign(win_count=Sim_Winner_Frame['unique_id'].map(Sim_Winner_Frame['unique_id'].value_counts()))
516
 
517
  # Type Casting
518
+ type_cast_dict = {'salary': int, 'proj': np.float16, 'Fantasy': np.float16, 'GPP_Proj': np.float32, 'Own': np.float32}
519
  Sim_Winner_Frame = Sim_Winner_Frame.astype(type_cast_dict)
520
 
521
  # Sorting
 
535
  st.session_state.working_seed = FD_seed.copy()
536
  maps_dict = {
537
  'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),
538
+ 'cpt_projection_map':dict(zip(raw_baselines.Player,raw_baselines.cpt_Median)),
539
  'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)),
540
  'Pos_map':dict(zip(raw_baselines.Player,raw_baselines.Position)),
541
  'Own_map':dict(zip(raw_baselines.Player,raw_baselines['Own'])),
542
+ 'cpt_Own_map':dict(zip(raw_baselines.Player,raw_baselines['CPT_Own'])),
543
  'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)),
544
+ 'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev)),
545
+ 'cpt_STDev_map':dict(zip(raw_baselines.Player,raw_baselines['CPT_STDev']))
546
  }
547
  Sim_Winners = sim_contest(1000, st.session_state.working_seed, maps_dict, sharp_split, Contest_Size)
548
  Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
 
553
  Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=column_names + ['Fantasy'])
554
  Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['proj'] + Sim_Winner_Frame['Fantasy']) / 2
555
  Sim_Winner_Frame['unique_id'] = Sim_Winner_Frame['proj'].astype(str) + Sim_Winner_Frame['salary'].astype(str) + Sim_Winner_Frame['Team'].astype(str) + Sim_Winner_Frame['Secondary'].astype(str)
556
+ # Add percent rank columns for ownership at each roster position
557
+ # Calculate Dupes column for Fanduel
558
+ if sim_site_var1 == 'Fanduel':
559
+ dup_count_columns = ['CPT_Own_percent_rank', 'FLEX1_Own_percent_rank', 'FLEX2_Own_percent_rank', 'FLEX3_Own_percent_rank', 'FLEX4_Own_percent_rank']
560
+ own_columns = ['CPT_Own', 'FLEX1_Own', 'FLEX2_Own', 'FLEX3_Own', 'FLEX4_Own']
561
+ calc_columns = ['own_product', 'avg_own_rank', 'dupes_calc']
562
+ Sim_Winner_Frame['CPT_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,0].map(maps_dict['cpt_Own_map']).rank(pct=True)
563
+ Sim_Winner_Frame['FLEX1_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,1].map(maps_dict['Own_map']).rank(pct=True)
564
+ Sim_Winner_Frame['FLEX2_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,2].map(maps_dict['Own_map']).rank(pct=True)
565
+ Sim_Winner_Frame['FLEX3_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,3].map(maps_dict['Own_map']).rank(pct=True)
566
+ Sim_Winner_Frame['FLEX4_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,4].map(maps_dict['Own_map']).rank(pct=True)
567
+ Sim_Winner_Frame['CPT_Own'] = Sim_Winner_Frame.iloc[:,0].map(maps_dict['cpt_Own_map']) / 100
568
+ Sim_Winner_Frame['FLEX1_Own'] = Sim_Winner_Frame.iloc[:,1].map(maps_dict['Own_map']) / 100
569
+ Sim_Winner_Frame['FLEX2_Own'] = Sim_Winner_Frame.iloc[:,2].map(maps_dict['Own_map']) / 100
570
+ Sim_Winner_Frame['FLEX3_Own'] = Sim_Winner_Frame.iloc[:,3].map(maps_dict['Own_map']) / 100
571
+ Sim_Winner_Frame['FLEX4_Own'] = Sim_Winner_Frame.iloc[:,4].map(maps_dict['Own_map']) / 100
572
+
573
+ # Calculate ownership product and convert to probability
574
+ Sim_Winner_Frame['own_product'] = (Sim_Winner_Frame[own_columns].product(axis=1)) + 0.0001
575
+
576
+ # Calculate average of ownership percent rank columns
577
+ Sim_Winner_Frame['avg_own_rank'] = Sim_Winner_Frame[dup_count_columns].mean(axis=1)
578
+
579
+ # Calculate dupes formula
580
+ Sim_Winner_Frame['dupes_calc'] = ((Sim_Winner_Frame['own_product'] * Sim_Winner_Frame['avg_own_rank']) * (Contest_Size * 1.5)) + ((Sim_Winner_Frame['salary'] - 59800) / 100)
581
+
582
+ # Round and handle negative values
583
+ Sim_Winner_Frame['Dupes'] = np.where(
584
+ np.round(Sim_Winner_Frame['dupes_calc'], 0) <= 0,
585
+ 0,
586
+ np.round(Sim_Winner_Frame['dupes_calc'], 0) - 1
587
+ )
588
+ Sim_Winner_Frame['Dupes'] = (Sim_Winner_Frame['Dupes'] * (500000 / sharp_split)) / 2
589
+ elif sim_site_var1 == 'Draftkings':
590
+ dup_count_columns = ['CPT_Own_percent_rank', 'FLEX1_Own_percent_rank', 'FLEX2_Own_percent_rank', 'FLEX3_Own_percent_rank', 'FLEX4_Own_percent_rank', 'FLEX5_Own_percent_rank']
591
+ own_columns = ['CPT_Own', 'FLEX1_Own', 'FLEX2_Own', 'FLEX3_Own', 'FLEX4_Own', 'FLEX5_Own']
592
+ calc_columns = ['own_product', 'avg_own_rank', 'dupes_calc']
593
+ Sim_Winner_Frame['CPT_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,0].map(maps_dict['cpt_Own_map']).rank(pct=True)
594
+ Sim_Winner_Frame['FLEX1_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,1].map(maps_dict['Own_map']).rank(pct=True)
595
+ Sim_Winner_Frame['FLEX2_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,2].map(maps_dict['Own_map']).rank(pct=True)
596
+ Sim_Winner_Frame['FLEX3_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,3].map(maps_dict['Own_map']).rank(pct=True)
597
+ Sim_Winner_Frame['FLEX4_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,4].map(maps_dict['Own_map']).rank(pct=True)
598
+ Sim_Winner_Frame['FLEX5_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,5].map(maps_dict['Own_map']).rank(pct=True)
599
+ Sim_Winner_Frame['CPT_Own'] = Sim_Winner_Frame.iloc[:,0].map(maps_dict['cpt_Own_map']) / 100
600
+ Sim_Winner_Frame['FLEX1_Own'] = Sim_Winner_Frame.iloc[:,1].map(maps_dict['Own_map']) / 100
601
+ Sim_Winner_Frame['FLEX2_Own'] = Sim_Winner_Frame.iloc[:,2].map(maps_dict['Own_map']) / 100
602
+ Sim_Winner_Frame['FLEX3_Own'] = Sim_Winner_Frame.iloc[:,3].map(maps_dict['Own_map']) / 100
603
+ Sim_Winner_Frame['FLEX4_Own'] = Sim_Winner_Frame.iloc[:,4].map(maps_dict['Own_map']) / 100
604
+ Sim_Winner_Frame['FLEX5_Own'] = Sim_Winner_Frame.iloc[:,5].map(maps_dict['Own_map']) / 100
605
+
606
+ # Calculate ownership product and convert to probability
607
+ Sim_Winner_Frame['own_product'] = (Sim_Winner_Frame[own_columns].product(axis=1))
608
+
609
+ # Calculate average of ownership percent rank columns
610
+ Sim_Winner_Frame['avg_own_rank'] = Sim_Winner_Frame[dup_count_columns].mean(axis=1)
611
+
612
+ # Calculate dupes formula
613
+ Sim_Winner_Frame['dupes_calc'] = ((Sim_Winner_Frame['own_product'] * Sim_Winner_Frame['avg_own_rank']) * (Contest_Size * 1.5)) + ((Sim_Winner_Frame['salary'] - 49800) / 100)
614
+
615
+ # Round and handle negative values
616
+ Sim_Winner_Frame['Dupes'] = np.where(
617
+ np.round(Sim_Winner_Frame['dupes_calc'], 0) <= 0,
618
+ 0,
619
+ np.round(Sim_Winner_Frame['dupes_calc'], 0) - 1
620
+ )
621
+ Sim_Winner_Frame['Dupes'] = (Sim_Winner_Frame['Dupes'] * (500000 / sharp_split)) / 2
622
+ Sim_Winner_Frame['Dupes'] = np.round(Sim_Winner_Frame['Dupes'], 0)
623
+ Sim_Winner_Frame['Dupes'] = np.where(
624
+ np.round(Sim_Winner_Frame['dupes_calc'], 0) <= 0,
625
+ 0,
626
+ np.round(Sim_Winner_Frame['dupes_calc'], 0)
627
+ )
628
+ Sim_Winner_Frame = Sim_Winner_Frame.drop(columns=dup_count_columns)
629
+ Sim_Winner_Frame = Sim_Winner_Frame.drop(columns=own_columns)
630
+ Sim_Winner_Frame = Sim_Winner_Frame.drop(columns=calc_columns)
631
+
632
  Sim_Winner_Frame = Sim_Winner_Frame.assign(win_count=Sim_Winner_Frame['unique_id'].map(Sim_Winner_Frame['unique_id'].value_counts()))
633
 
634
  # Type Casting
635
+ type_cast_dict = {'salary': int, 'proj': np.float16, 'Fantasy': np.float16, 'GPP_Proj': np.float32, 'Own': np.float32, 'Dupes': int}
636
  Sim_Winner_Frame = Sim_Winner_Frame.astype(type_cast_dict)
637
 
638
  # Sorting
 
641
 
642
  # Data Copying
643
  st.session_state.Sim_Winner_Export = Sim_Winner_Frame.copy()
644
+ st.session_state.Sim_Winner_Export.iloc[:, 0:6] = st.session_state.Sim_Winner_Export.iloc[:, 0:6].apply(lambda x: x.map(export_id_dict))
645
 
646
  # Data Copying
647
  st.session_state.Sim_Winner_Display = Sim_Winner_Frame.copy()
 
655
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
656
  freq_working['Freq'] = freq_working['Freq'].astype(int)
657
  freq_working['Position'] = freq_working['Player'].map(maps_dict['Pos_map'])
658
+ if sim_site_var1 == 'Draftkings':
659
+ if sim_sport_var1 == 'NFL':
660
+ freq_working['Salary'] = freq_working['Player'].map(maps_dict['Salary_map']) / 1.5
661
+ elif sim_sport_var1 == 'NBA':
662
+ freq_working['Salary'] = freq_working['Player'].map(maps_dict['Salary_map'])
663
+ elif sim_site_var1 == 'Fanduel':
664
+ freq_working['Salary'] = freq_working['Player'].map(maps_dict['Salary_map'])
665
  freq_working['Proj Own'] = freq_working['Player'].map(maps_dict['Own_map']) / 100
666
  freq_working['Exposure'] = freq_working['Freq']/(1000)
667
  freq_working['Edge'] = freq_working['Exposure'] - freq_working['Proj Own']
 
676
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
677
  cpt_working['Freq'] = cpt_working['Freq'].astype(int)
678
  cpt_working['Position'] = cpt_working['Player'].map(maps_dict['Pos_map'])
679
+ if sim_sport_var1 == 'NFL':
680
+ cpt_working['Salary'] = cpt_working['Player'].map(maps_dict['Salary_map'])
681
+ elif sim_sport_var1 == 'NBA':
682
+ cpt_working['Salary'] = cpt_working['Player'].map(maps_dict['Salary_map']) * 1.5
683
+ cpt_working['Proj Own'] = cpt_working['Player'].map(maps_dict['cpt_Own_map']) / 100
684
  cpt_working['Exposure'] = cpt_working['Freq']/(1000)
685
  cpt_working['Edge'] = cpt_working['Exposure'] - cpt_working['Proj Own']
686
  cpt_working['Team'] = cpt_working['Player'].map(maps_dict['Team_map'])
 
689
  if sim_site_var1 == 'Draftkings':
690
  flex_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,1:6].values, return_counts=True)),
691
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
692
+ cpt_own_div = 600
693
  elif sim_site_var1 == 'Fanduel':
694
  flex_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,1:5].values, return_counts=True)),
695
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
696
+ cpt_own_div = 500
697
  flex_working['Freq'] = flex_working['Freq'].astype(int)
698
  flex_working['Position'] = flex_working['Player'].map(maps_dict['Pos_map'])
699
+ if sim_site_var1 == 'Draftkings':
700
+ if sim_sport_var1 == 'NFL':
701
+ flex_working['Salary'] = flex_working['Player'].map(maps_dict['Salary_map']) / 1.5
702
+ elif sim_sport_var1 == 'NBA':
703
+ flex_working['Salary'] = flex_working['Player'].map(maps_dict['Salary_map'])
704
+ elif sim_site_var1 == 'Fanduel':
705
+ flex_working['Salary'] = flex_working['Player'].map(maps_dict['Salary_map'])
706
+ flex_working['Proj Own'] = (flex_working['Player'].map(maps_dict['Own_map']) / 100) - (flex_working['Player'].map(maps_dict['cpt_Own_map']) / 100)
707
  flex_working['Exposure'] = flex_working['Freq']/(1000)
708
  flex_working['Edge'] = flex_working['Exposure'] - flex_working['Proj Own']
709
  flex_working['Team'] = flex_working['Player'].map(maps_dict['Team_map'])
 
718
  team_working['Freq'] = team_working['Freq'].astype(int)
719
  team_working['Exposure'] = team_working['Freq']/(1000)
720
  st.session_state.team_freq = team_working.copy()
 
 
 
 
 
 
 
 
 
 
721
 
722
  with st.container():
723
  if st.button("Reset Sim", key='reset_sim'):