James McCool commited on
Commit
d7af247
·
1 Parent(s): f0414d7

Refactor app.py to streamline database connections and enhance data retrieval methods. Removed hardcoded credentials and replaced them with environment variables. Updated functions to include a 'split' parameter for limiting data fetched from MongoDB. Added auxiliary seed frame functions for both DraftKings and FanDuel. Improved simulation logic for contest entries and ownership calculations. Cleaned up unused variables and optimized data handling for better performance.

Browse files
Files changed (1) hide show
  1. app.py +359 -146
app.py CHANGED
@@ -8,47 +8,13 @@ import time
8
 
9
  @st.cache_resource
10
  def init_conn():
11
- scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
12
-
13
- credentials = {
14
- "type": "service_account",
15
- "project_id": "model-sheets-connect",
16
- "private_key_id": st.secrets['model_sheets_connect_pk'],
17
- "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDiu1v/e6KBKOcK\ncx0KQ23nZK3ZVvADYy8u/RUn/EDI82QKxTd/DizRLIV81JiNQxDJXSzgkbwKYEDm\n48E8zGvupU8+Nk76xNPakrQKy2Y8+VJlq5psBtGchJTuUSHcXU5Mg2JhQsB376PJ\nsCw552K6Pw8fpeMDJDZuxpKSkaJR6k9G5Dhf5q8HDXnC5Rh/PRFuKJ2GGRpX7n+2\nhT/sCax0J8jfdTy/MDGiDfJqfQrOPrMKELtsGHR9Iv6F4vKiDqXpKfqH+02E9ptz\nBk+MNcbZ3m90M8ShfRu28ebebsASfarNMzc3dk7tb3utHOGXKCf4tF8yYKo7x8BZ\noO9X4gSfAgMBAAECggEAU8ByyMpSKlTCF32TJhXnVJi/kS+IhC/Qn5JUDMuk4LXr\naAEWsWO6kV/ZRVXArjmuSzuUVrXumISapM9Ps5Ytbl95CJmGDiLDwRL815nvv6k3\nUyAS8EGKjz74RpoIoH6E7EWCAzxlnUgTn+5oP9Flije97epYk3H+e2f1f5e1Nn1d\nYNe8U+1HqJgILcxA1TAUsARBfoD7+K3z/8DVPHI8IpzAh6kTHqhqC23Rram4XoQ6\nzj/ZdVBjvnKuazETfsD+Vl3jGLQA8cKQVV70xdz3xwLcNeHsbPbpGBpZUoF73c65\nkAXOrjYl0JD5yAk+hmYhXr6H9c6z5AieuZGDrhmlFQKBgQDzV6LRXmjn4854DP/J\nI82oX2GcI4eioDZPRukhiQLzYerMQBmyqZIRC+/LTCAhYQSjNgMa+ZKyvLqv48M0\n/x398op/+n3xTs+8L49SPI48/iV+mnH7k0WI/ycd4OOKh8rrmhl/0EWb9iitwJYe\nMjTV/QxNEpPBEXfR1/mvrN/lVQKBgQDuhomOxUhWVRVH6x03slmyRBn0Oiw4MW+r\nrt1hlNgtVmTc5Mu+4G0USMZwYuOB7F8xG4Foc7rIlwS7Ic83jMJxemtqAelwOLdV\nXRLrLWJfX8+O1z/UE15l2q3SUEnQ4esPHbQnZowHLm0mdL14qSVMl1mu1XfsoZ3z\nJZTQb48CIwKBgEWbzQRtKD8lKDupJEYqSrseRbK/ax43DDITS77/DWwHl33D3FYC\nMblUm8ygwxQpR4VUfwDpYXBlklWcJovzamXpSnsfcYVkkQH47NuOXPXPkXQsw+w+\nDYcJzeu7F/vZqk9I7oBkWHUrrik9zPNoUzrfPvSRGtkAoTDSwibhoc5dAoGBAMHE\nK0T/ANeZQLNuzQps6S7G4eqjwz5W8qeeYxsdZkvWThOgDd/ewt3ijMnJm5X05hOn\ni4XF1euTuvUl7wbqYx76Wv3/1ZojiNNgy7ie4rYlyB/6vlBS97F4ZxJdxMlabbCW\n6b3EMWa4EVVXKoA1sCY7IVDE+yoQ1JYsZmq45YzPAoGBANWWHuVueFGZRDZlkNlK\nh5OmySmA0NdNug3G1upaTthyaTZ+CxGliwBqMHAwpkIRPwxUJpUwBTSEGztGTAxs\nWsUOVWlD2/1JaKSmHE8JbNg6sxLilcG6WEDzxjC5dLL1OrGOXj9WhC9KX3sq6qb6\nF/j9eUXfXjAlb042MphoF3ZC\n-----END PRIVATE KEY-----\n",
18
- "client_email": "[email protected]",
19
- "client_id": "100369174533302798535",
20
- "auth_uri": "https://accounts.google.com/o/oauth2/auth",
21
- "token_uri": "https://oauth2.googleapis.com/token",
22
- "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
23
- "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/gspread-connection%40model-sheets-connect.iam.gserviceaccount.com"
24
- }
25
-
26
- credentials2 = {
27
- "type": "service_account",
28
- "project_id": "sheets-api-connect-378620",
29
- "private_key_id": st.secrets['sheets_api_connect_pk'],
30
- "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCtKa01beXwc88R\nnPZVQTNPVQuBnbwoOfc66gW3547ja/UEyIGAF112dt/VqHprRafkKGmlg55jqJNt\na4zceLKV+wTm7vBu7lDISTJfGzCf2TrxQYNqwMKE2LOjI69dBM8u4Dcb4k0wcp9v\ntW1ZzLVVuwTvmrg7JBHjiSaB+x5wxm/r3FOiJDXdlAgFlytzqgcyeZMJVKKBQHyJ\njEGg/1720A0numuOCt71w/2G0bDmijuj1e6tH32MwRWcvRNZ19K9ssyDz2S9p68s\nYDhIxX69OWxwScTIHLY6J2t8txf/XMivL/636fPlDADvBEVTdlT606n8CcKUVQeq\npUVdG+lfAgMBAAECggEAP38SUA7B69eTfRpo658ycOs3Amr0JW4H/bb1rNeAul0K\nZhwd/HnU4E07y81xQmey5kN5ZeNrD5EvqkZvSyMJHV0EEahZStwhjCfnDB/cxyix\nZ+kFhv4y9eK+kFpUAhBy5nX6T0O+2T6WvzAwbmbVsZ+X8kJyPuF9m8ldcPlD0sce\ntj8NwVq1ys52eosqs7zi2vjt+eMcaY393l4ls+vNq8Yf27cfyFw45W45CH/97/Nu\n5AmuzlCOAfFF+z4OC5g4rei4E/Qgpxa7/uom+BVfv9G0DIGW/tU6Sne0+37uoGKt\nW6DzhgtebUtoYkG7ZJ05BTXGp2lwgVcNRoPwnKJDxQKBgQDT5wYPUBDW+FHbvZSp\nd1m1UQuXyerqOTA9smFaM8sr/UraeH85DJPEIEk8qsntMBVMhvD3Pw8uIUeFNMYj\naLmZFObsL+WctepXrVo5NB6RtLB/jZYxiKMatMLUJIYtcKIp+2z/YtKiWcLnwotB\nWdCjVnPTxpkurmF2fWP/eewZ+wKBgQDRMtJg7etjvKyjYNQ5fARnCc+XsI3gkBe1\nX9oeXfhyfZFeBXWnZzN1ITgFHplDznmBdxAyYGiQdbbkdKQSghviUQ0igBvoDMYy\n1rWcy+a17Mj98uyNEfmb3X2cC6WpvOZaGHwg9+GY67BThwI3FqHIbyk6Ko09WlTX\nQpRQjMzU7QKBgAfi1iflu+q0LR+3a3vvFCiaToskmZiD7latd9AKk2ocsBd3Woy9\n+hXXecJHPOKV4oUJlJgvAZqe5HGBqEoTEK0wyPNLSQlO/9ypd+0fEnArwFHO7CMF\nycQprAKHJXM1eOOFFuZeQCaInqdPZy1UcV5Szla4UmUZWkk1m24blHzXAoGBAMcA\nyH4qdbxX9AYrC1dvsSRvgcnzytMvX05LU0uF6tzGtG0zVlub4ahvpEHCfNuy44UT\nxRWW/oFFaWjjyFxO5sWggpUqNuHEnRopg3QXx22SRRTGbN45li/+QAocTkgsiRh1\nqEcYZsO4mPCsQqAy6E2p6RcK+Xa+omxvSnVhq0x1AoGAKr8GdkCl4CF6rieLMAQ7\nLNBuuoYGaHoh8l5E2uOQpzwxVy/nMBcAv+2+KqHEzHryUv1owOi6pMLv7A9mTFoS\n18B0QRLuz5fSOsVnmldfC9fpUc6H8cH1SINZpzajqQA74bPwELJjnzrCnH79TnHG\nJuElxA33rFEjbgbzdyrE768=\n-----END PRIVATE KEY-----\n",
31
- "client_email": "gspread-connection@sheets-api-connect-378620.iam.gserviceaccount.com",
32
- "client_id": "106625872877651920064",
33
- "auth_uri": "https://accounts.google.com/o/oauth2/auth",
34
- "token_uri": "https://oauth2.googleapis.com/token",
35
- "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
36
- "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/gspread-connection%40sheets-api-connect-378620.iam.gserviceaccount.com"
37
- }
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%}'}
@@ -56,14 +22,14 @@ dk_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'pro
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["testing_db"]
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']]
@@ -72,32 +38,49 @@ def init_DK_seed_frames(sport):
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["testing_db"]
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_FD_seed_frames(sport):
93
 
94
  if sport == 'NFL':
95
- db = client["testing_db"]
96
  elif sport == 'NBA':
97
  db = client["NBA_DFS"]
98
 
99
  collection = db[f"FD_{sport}_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', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
@@ -106,15 +89,15 @@ def init_FD_seed_frames(sport):
106
  return FD_seed
107
 
108
  @st.cache_data(ttl = 599)
109
- def init_FD_secondary_seed_frames(sport):
110
 
111
  if sport == 'NFL':
112
- db = client["testing_db"]
113
  elif sport == 'NBA':
114
  db = client["NBA_DFS"]
115
 
116
  collection = db[f"FD_{sport}_Secondary_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']]
@@ -122,54 +105,90 @@ def init_FD_secondary_seed_frames(sport):
122
 
123
  return FD_second_seed
124
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
125
  @st.cache_data(ttl = 599)
126
  def init_baselines(sport):
127
  if sport == 'NFL':
128
- try:
129
- sh = gcservice_account.open_by_url(NFL_Data)
130
- except:
131
- sh = gcservice_account2.open_by_url(NFL_Data)
132
-
133
- worksheet = sh.worksheet('DK_SD_ROO')
134
- load_display = pd.DataFrame(worksheet.get_all_records())
135
- load_display.replace('', np.nan, inplace=True)
136
- load_display['STDev'] = load_display['Median'] / 4
137
- load_display = load_display.drop_duplicates(subset=['Player'], keep='first')
 
 
 
 
138
 
139
- dk_raw = load_display.dropna(subset=['Median'])
140
 
141
- worksheet = sh.worksheet('FD_SD_ROO')
142
- load_display = pd.DataFrame(worksheet.get_all_records())
143
- load_display.replace('', np.nan, inplace=True)
144
- load_display['STDev'] = load_display['Median'] / 4
145
- load_display = load_display.drop_duplicates(subset=['Player'], keep='first')
 
 
 
 
 
 
146
 
147
- fd_raw = load_display.dropna(subset=['Median'])
148
 
149
  elif sport == 'NBA':
150
-
151
- try:
152
- sh = gcservice_account.open_by_url(NBA_Data)
153
- except:
154
- sh = gcservice_account2.open_by_url(NBA_Data)
155
-
156
- worksheet = sh.worksheet('Player_Level_SD_ROO')
157
- load_display = pd.DataFrame(worksheet.get_all_records())
158
- load_display.replace('', np.nan, inplace=True)
159
- load_display['STDev'] = load_display['Median'] / 4
160
- load_display = load_display[load_display['site'] == 'Draftkings']
161
- load_display = load_display.drop_duplicates(subset=['Player'], keep='first')
 
 
 
162
 
163
- dk_raw = load_display.dropna(subset=['Median'])
164
 
165
- worksheet = sh.worksheet('Player_Level_SD_ROO')
166
- load_display = pd.DataFrame(worksheet.get_all_records())
167
- load_display.replace('', np.nan, inplace=True)
168
- load_display['STDev'] = load_display['Median'] / 4
169
- load_display = load_display[load_display['site'] == 'Fanduel']
170
- load_display = load_display.drop_duplicates(subset=['Player'], keep='first')
 
 
 
 
 
 
171
 
172
- fd_raw = load_display.dropna(subset=['Median'])
173
 
174
  return dk_raw, fd_raw
175
 
@@ -193,25 +212,32 @@ def calculate_FD_value_frequencies(np_array):
193
  return combined_array
194
 
195
  @st.cache_data
196
- def sim_contest(Sim_size, seed_frame, maps_dict, sharp_split, Contest_Size):
197
  SimVar = 1
198
  Sim_Winners = []
199
- fp_array = seed_frame[:sharp_split, :]
200
 
201
  # Pre-vectorize functions
202
  vec_projection_map = np.vectorize(maps_dict['Projection_map'].__getitem__)
 
203
  vec_stdev_map = np.vectorize(maps_dict['STDev_map'].__getitem__)
 
204
 
205
  st.write('Simulating contest on frames')
206
 
207
  while SimVar <= Sim_size:
208
- fp_random = fp_array[np.random.choice(fp_array.shape[0], Contest_Size)]
209
 
210
  sample_arrays1 = np.c_[
211
- fp_random,
212
  np.sum(np.random.normal(
213
- loc=vec_projection_map(fp_random[:, :-7]),
214
- scale=vec_stdev_map(fp_random[:, :-7])),
 
 
 
 
 
 
215
  axis=1)
216
  ]
217
 
@@ -224,6 +250,8 @@ def sim_contest(Sim_size, seed_frame, maps_dict, sharp_split, Contest_Size):
224
 
225
  return Sim_Winners
226
 
 
 
227
  tab1, tab2 = st.tabs(['Contest Sims', 'Data Export'])
228
  with tab2:
229
  col1, col2 = st.columns([1, 7])
@@ -235,17 +263,11 @@ with tab2:
235
  dk_raw, fd_raw = init_baselines('NFL')
236
 
237
  sport_var1 = st.radio("What sport are you working with?", ('NBA', 'NFL'), key='sport_var1')
238
- dk_raw, fd_raw = init_baselines(sport_var1)
239
- slate_var1 = st.radio("Which data are you loading?", ('Showdown', 'Secondary Showdown'), key='slate_var1')
240
 
241
  site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'), key='site_var1')
242
  if site_var1 == 'Draftkings':
243
- if slate_var1 == 'Showdown':
244
- DK_seed = init_DK_seed_frames(sport_var1)
245
- elif slate_var1 == 'Secondary Showdown':
246
- DK_seed = init_DK_secondary_seed_frames(sport_var1)
247
- raw_baselines = dk_raw
248
- column_names = dk_columns
249
 
250
  team_var1 = st.radio("Do you want a frame with specific teams?", ('Full Slate', 'Specific Teams'), key='team_var1')
251
  if team_var1 == 'Specific Teams':
@@ -260,12 +282,6 @@ with tab2:
260
  stack_var2 = [5, 4, 3, 2, 1, 0]
261
 
262
  elif site_var1 == 'Fanduel':
263
- if slate_var1 == 'Showdown':
264
- FD_seed = init_FD_seed_frames(sport_var1)
265
- elif slate_var1 == 'Secondary Showdown':
266
- FD_seed = init_FD_secondary_seed_frames(sport_var1)
267
- raw_baselines = fd_raw
268
- column_names = fd_columns
269
 
270
  team_var1 = st.radio("Do you want a frame with specific teams?", ('Full Slate', 'Specific Teams'), key='team_var1')
271
  if team_var1 == 'Specific Teams':
@@ -281,11 +297,58 @@ with tab2:
281
 
282
 
283
  if st.button("Prepare data export", key='data_export'):
 
284
  data_export = st.session_state.working_seed.copy()
285
- st.download_button(
286
- label="Export optimals set",
287
- data=convert_df(data_export),
288
- file_name='NFL_SD_optimals_export.csv',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
289
  mime='text/csv',
290
  )
291
 
@@ -297,7 +360,24 @@ with tab2:
297
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 10], stack_var2)]
298
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
299
  elif 'working_seed' not in st.session_state:
300
- st.session_state.working_seed = DK_seed.copy()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
301
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 9], team_var2)]
302
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 10], stack_var2)]
303
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
@@ -308,7 +388,26 @@ with tab2:
308
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 9], stack_var2)]
309
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
310
  elif 'working_seed' not in st.session_state:
311
- st.session_state.working_seed = FD_seed.copy()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
312
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 8], team_var2)]
313
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 9], stack_var2)]
314
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
@@ -327,32 +426,28 @@ with tab1:
327
  dk_raw, fd_raw = init_baselines('NFL')
328
  sim_sport_var1 = st.radio("What sport are you working with?", ('NBA', 'NFL'), key='sim_sport_var1')
329
  dk_raw, fd_raw = init_baselines(sim_sport_var1)
330
- sim_slate_var1 = st.radio("Which data are you loading?", ('Showdown', 'Secondary Showdown'), key='sim_slate_var1')
331
  sim_site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'), key='sim_site_var1')
332
  if sim_site_var1 == 'Draftkings':
333
- if sim_slate_var1 == 'Showdown':
334
- DK_seed = init_DK_seed_frames(sim_sport_var1)
335
- elif sim_slate_var1 == 'Secondary Showdown':
336
- DK_seed = init_DK_secondary_seed_frames(sim_sport_var1)
337
  raw_baselines = dk_raw
338
  column_names = dk_columns
339
  elif sim_site_var1 == 'Fanduel':
340
- if sim_slate_var1 == 'Showdown':
341
- FD_seed = init_FD_seed_frames(sim_sport_var1)
342
- elif sim_slate_var1 == 'Secondary Showdown':
343
- FD_seed = init_FD_secondary_seed_frames(sim_sport_var1)
344
  raw_baselines = fd_raw
345
  column_names = fd_columns
346
-
347
  contest_var1 = st.selectbox("What contest size are you simulating?", ('Small', 'Medium', 'Large', 'Custom'))
348
  if contest_var1 == 'Small':
349
  Contest_Size = 1000
 
 
 
350
  elif contest_var1 == 'Medium':
351
  Contest_Size = 5000
 
352
  elif contest_var1 == 'Large':
353
  Contest_Size = 10000
 
354
  elif contest_var1 == 'Custom':
355
- Contest_Size = st.number_input("Insert contest size", value=100, placeholder="Type a number under 10,000...")
356
  strength_var1 = st.selectbox("How sharp is the field in the contest?", ('Very', 'Above Average', 'Average', 'Below Average', 'Not Very'))
357
  if strength_var1 == 'Not Very':
358
  sharp_split = 500000
@@ -371,13 +466,16 @@ with tab1:
371
  if 'working_seed' in st.session_state:
372
  maps_dict = {
373
  'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),
 
374
  'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)),
375
  'Pos_map':dict(zip(raw_baselines.Player,raw_baselines.Position)),
376
  'Own_map':dict(zip(raw_baselines.Player,raw_baselines['Own'])),
 
377
  'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)),
378
- 'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev))
 
379
  }
380
- Sim_Winners = sim_contest(1000, st.session_state.working_seed, maps_dict, sharp_split, Contest_Size)
381
  Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
382
 
383
  #st.table(Sim_Winner_Frame)
@@ -404,18 +502,59 @@ with tab1:
404
 
405
  else:
406
  if sim_site_var1 == 'Draftkings':
407
- st.session_state.working_seed = DK_seed.copy()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
408
  elif sim_site_var1 == 'Fanduel':
409
- st.session_state.working_seed = FD_seed.copy()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
410
  maps_dict = {
411
  'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),
 
412
  'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)),
413
  'Pos_map':dict(zip(raw_baselines.Player,raw_baselines.Position)),
414
  'Own_map':dict(zip(raw_baselines.Player,raw_baselines['Own'])),
 
415
  'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)),
416
- 'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev))
 
417
  }
418
- Sim_Winners = sim_contest(1000, st.session_state.working_seed, maps_dict, sharp_split, Contest_Size)
419
  Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
420
 
421
  #st.table(Sim_Winner_Frame)
@@ -424,10 +563,86 @@ with tab1:
424
  Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=column_names + ['Fantasy'])
425
  Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['proj'] + Sim_Winner_Frame['Fantasy']) / 2
426
  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)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
427
  Sim_Winner_Frame = Sim_Winner_Frame.assign(win_count=Sim_Winner_Frame['unique_id'].map(Sim_Winner_Frame['unique_id'].value_counts()))
428
 
429
  # Type Casting
430
- type_cast_dict = {'salary': int, 'proj': np.float16, 'Fantasy': np.float16, 'GPP_Proj': np.float32, 'Own': np.float32}
431
  Sim_Winner_Frame = Sim_Winner_Frame.astype(type_cast_dict)
432
 
433
  # Sorting
@@ -436,6 +651,7 @@ with tab1:
436
 
437
  # Data Copying
438
  st.session_state.Sim_Winner_Export = Sim_Winner_Frame.copy()
 
439
 
440
  # Data Copying
441
  st.session_state.Sim_Winner_Display = Sim_Winner_Frame.copy()
@@ -450,7 +666,10 @@ with tab1:
450
  freq_working['Freq'] = freq_working['Freq'].astype(int)
451
  freq_working['Position'] = freq_working['Player'].map(maps_dict['Pos_map'])
452
  if sim_site_var1 == 'Draftkings':
453
- freq_working['Salary'] = freq_working['Player'].map(maps_dict['Salary_map']) / 1.5
 
 
 
454
  elif sim_site_var1 == 'Fanduel':
455
  freq_working['Salary'] = freq_working['Player'].map(maps_dict['Salary_map'])
456
  freq_working['Proj Own'] = freq_working['Player'].map(maps_dict['Own_map']) / 100
@@ -462,15 +681,16 @@ with tab1:
462
  if sim_site_var1 == 'Draftkings':
463
  cpt_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,0:1].values, return_counts=True)),
464
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
465
- cpt_own_div = 600
466
  elif sim_site_var1 == 'Fanduel':
467
  cpt_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,0:1].values, return_counts=True)),
468
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
469
- cpt_own_div = 500
470
  cpt_working['Freq'] = cpt_working['Freq'].astype(int)
471
  cpt_working['Position'] = cpt_working['Player'].map(maps_dict['Pos_map'])
472
- cpt_working['Salary'] = cpt_working['Player'].map(maps_dict['Salary_map'])
473
- cpt_working['Proj Own'] = cpt_working['Player'].map(maps_dict['Own_map']) / cpt_own_div
 
 
 
474
  cpt_working['Exposure'] = cpt_working['Freq']/(1000)
475
  cpt_working['Edge'] = cpt_working['Exposure'] - cpt_working['Proj Own']
476
  cpt_working['Team'] = cpt_working['Player'].map(maps_dict['Team_map'])
@@ -487,10 +707,13 @@ with tab1:
487
  flex_working['Freq'] = flex_working['Freq'].astype(int)
488
  flex_working['Position'] = flex_working['Player'].map(maps_dict['Pos_map'])
489
  if sim_site_var1 == 'Draftkings':
490
- flex_working['Salary'] = flex_working['Player'].map(maps_dict['Salary_map']) / 1.5
 
 
 
491
  elif sim_site_var1 == 'Fanduel':
492
  flex_working['Salary'] = flex_working['Player'].map(maps_dict['Salary_map'])
493
- flex_working['Proj Own'] = (flex_working['Player'].map(maps_dict['Own_map']) / 100) - (flex_working['Player'].map(maps_dict['Own_map']) / cpt_own_div)
494
  flex_working['Exposure'] = flex_working['Freq']/(1000)
495
  flex_working['Edge'] = flex_working['Exposure'] - flex_working['Proj Own']
496
  flex_working['Team'] = flex_working['Player'].map(maps_dict['Team_map'])
@@ -505,16 +728,6 @@ with tab1:
505
  team_working['Freq'] = team_working['Freq'].astype(int)
506
  team_working['Exposure'] = team_working['Freq']/(1000)
507
  st.session_state.team_freq = team_working.copy()
508
-
509
- if sim_site_var1 == 'Draftkings':
510
- stack_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,10:11].values, return_counts=True)),
511
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
512
- elif sim_site_var1 == 'Fanduel':
513
- stack_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,9:10].values, return_counts=True)),
514
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
515
- stack_working['Freq'] = stack_working['Freq'].astype(int)
516
- stack_working['Exposure'] = stack_working['Freq']/(1000)
517
- st.session_state.stack_freq = stack_working.copy()
518
 
519
  with st.container():
520
  if st.button("Reset Sim", key='reset_sim'):
 
8
 
9
  @st.cache_resource
10
  def init_conn():
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
 
12
  uri = st.secrets['mongo_uri']
13
  client = pymongo.MongoClient(uri, retryWrites=True, serverSelectionTimeoutMS=500000)
 
 
 
 
14
 
15
+ return client
 
 
 
16
 
17
+ client = init_conn()
18
 
19
  percentages_format = {'Exposure': '{:.2%}'}
20
  freq_format = {'Exposure': '{:.2%}', 'Proj Own': '{:.2%}', 'Edge': '{:.2%}'}
 
22
  fd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
23
 
24
  @st.cache_data(ttl = 599)
25
+ def init_DK_seed_frames(sport, split):
26
  if sport == 'NFL':
27
+ db = client["NFL_Database"]
28
  elif sport == 'NBA':
29
  db = client["NBA_DFS"]
30
 
31
  collection = db[f"DK_{sport}_SD_seed_frame"]
32
+ cursor = collection.find().limit(split)
33
 
34
  raw_display = pd.DataFrame(list(cursor))
35
  raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
 
38
  return DK_seed
39
 
40
  @st.cache_data(ttl = 599)
41
+ def init_DK_secondary_seed_frames(sport, split):
42
 
43
  if sport == 'NFL':
44
+ db = client["NFL_Database"]
45
  elif sport == 'NBA':
46
  db = client["NBA_DFS"]
47
 
48
  collection = db[f"DK_{sport}_Secondary_SD_seed_frame"]
49
+ cursor = collection.find().limit(split)
50
 
51
  raw_display = pd.DataFrame(list(cursor))
52
  raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
53
  DK_second_seed = raw_display.to_numpy()
54
 
55
  return DK_second_seed
56
+
57
+ @st.cache_data(ttl = 599)
58
+ def init_DK_auxiliary_seed_frames(sport, split):
59
+
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}_Auxiliary_SD_seed_frame"]
66
+ cursor = collection.find().limit(split)
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_auxiliary_seed = raw_display.to_numpy()
71
+
72
+ return DK_auxiliary_seed
73
 
74
  @st.cache_data(ttl = 599)
75
+ def init_FD_seed_frames(sport, split):
76
 
77
  if sport == 'NFL':
78
+ db = client["NFL_Database"]
79
  elif sport == 'NBA':
80
  db = client["NBA_DFS"]
81
 
82
  collection = db[f"FD_{sport}_SD_seed_frame"]
83
+ cursor = collection.find().limit(split)
84
 
85
  raw_display = pd.DataFrame(list(cursor))
86
  raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
 
89
  return FD_seed
90
 
91
  @st.cache_data(ttl = 599)
92
+ def init_FD_secondary_seed_frames(sport, split):
93
 
94
  if sport == 'NFL':
95
+ db = client["NFL_Database"]
96
  elif sport == 'NBA':
97
  db = client["NBA_DFS"]
98
 
99
  collection = db[f"FD_{sport}_Secondary_SD_seed_frame"]
100
+ cursor = collection.find().limit(split)
101
 
102
  raw_display = pd.DataFrame(list(cursor))
103
  raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
 
105
 
106
  return FD_second_seed
107
 
108
+ @st.cache_data(ttl = 599)
109
+ def init_FD_auxiliary_seed_frames(sport, split):
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}_Auxiliary_SD_seed_frame"]
117
+ cursor = collection.find().limit(split)
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_auxiliary_seed = raw_display.to_numpy()
122
+
123
+ return FD_auxiliary_seed
124
+
125
  @st.cache_data(ttl = 599)
126
  def init_baselines(sport):
127
  if sport == 'NFL':
128
+ db = client["NFL_Database"]
129
+ collection = db['DK_SD_NFL_ROO']
130
+ cursor = collection.find()
131
+
132
+ raw_display = pd.DataFrame(list(cursor))
133
+ raw_display = raw_display[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%',
134
+ 'Own', 'Small_Field_Own', 'Large_Field_Own', 'Cash_Field_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_id', 'site']]
135
+ raw_display['Small_Field_Own'] = raw_display['Large_Field_Own']
136
+ raw_display['small_CPT_Own_raw'] = (raw_display['Small_Field_Own'] / 2) * ((100 - (100-raw_display['Small_Field_Own']))/100)
137
+ small_cpt_own_var = 300 / raw_display['small_CPT_Own_raw'].sum()
138
+ raw_display['small_CPT_Own'] = raw_display['small_CPT_Own_raw'] * small_cpt_own_var
139
+ raw_display['cpt_Median'] = raw_display['Median'] * 1.25
140
+ raw_display['STDev'] = raw_display['Median'] / 4
141
+ raw_display['CPT_STDev'] = raw_display['cpt_Median'] / 4
142
 
143
+ dk_raw = raw_display.dropna(subset=['Median'])
144
 
145
+ collection = db['FD_SD_NFL_ROO']
146
+ cursor = collection.find()
147
+
148
+ raw_display = pd.DataFrame(list(cursor))
149
+ raw_display = raw_display[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%',
150
+ 'Own', 'Small_Field_Own', 'Large_Field_Own', 'Cash_Field_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_id', 'site']]
151
+ raw_display['Small_Field_Own'] = raw_display['Large_Field_Own']
152
+ raw_display['small_CPT_Own'] = raw_display['CPT_Own']
153
+ raw_display['cpt_Median'] = raw_display['Median']
154
+ raw_display['STDev'] = raw_display['Median'] / 4
155
+ raw_display['CPT_STDev'] = raw_display['cpt_Median'] / 4
156
 
157
+ fd_raw = raw_display.dropna(subset=['Median'])
158
 
159
  elif sport == 'NBA':
160
+ db = client["NBA_DFS"]
161
+ collection = db['Player_SD_Range_Of_Outcomes']
162
+ cursor = collection.find()
163
+
164
+ raw_display = pd.DataFrame(list(cursor))
165
+ 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%',
166
+ 'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'ValX', 'site', 'version', 'slate', 'timestamp', 'player_id']]
167
+ raw_display = raw_display[raw_display['site'] == 'Draftkings']
168
+ raw_display['Small_Field_Own'] = raw_display['Small_Own']
169
+ raw_display['small_CPT_Own_raw'] = (raw_display['Small_Field_Own'] / 2) * ((100 - (100-raw_display['Small_Field_Own']))/100)
170
+ small_cpt_own_var = 300 / raw_display['small_CPT_Own_raw'].sum()
171
+ raw_display['small_CPT_Own'] = raw_display['small_CPT_Own_raw'] * small_cpt_own_var
172
+ raw_display['cpt_Median'] = raw_display['Median'] * 1.25
173
+ raw_display['STDev'] = raw_display['Median'] / 4
174
+ raw_display['CPT_STDev'] = raw_display['cpt_Median'] / 4
175
 
176
+ dk_raw = raw_display.dropna(subset=['Median'])
177
 
178
+ collection = db['Player_SD_Range_Of_Outcomes']
179
+ cursor = collection.find()
180
+
181
+ raw_display = pd.DataFrame(list(cursor))
182
+ 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%',
183
+ 'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'ValX', 'site', 'version', 'slate', 'timestamp', 'player_id']]
184
+ raw_display = raw_display[raw_display['site'] == 'Fanduel']
185
+ raw_display['Small_Field_Own'] = raw_display['Large_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
  return dk_raw, fd_raw
194
 
 
212
  return combined_array
213
 
214
  @st.cache_data
215
+ def sim_contest(Sim_size, seed_frame, maps_dict, Contest_Size):
216
  SimVar = 1
217
  Sim_Winners = []
 
218
 
219
  # Pre-vectorize functions
220
  vec_projection_map = np.vectorize(maps_dict['Projection_map'].__getitem__)
221
+ vec_cpt_projection_map = np.vectorize(maps_dict['cpt_projection_map'].__getitem__)
222
  vec_stdev_map = np.vectorize(maps_dict['STDev_map'].__getitem__)
223
+ vec_cpt_stdev_map = np.vectorize(maps_dict['cpt_STDev_map'].__getitem__)
224
 
225
  st.write('Simulating contest on frames')
226
 
227
  while SimVar <= Sim_size:
228
+ fp_random = seed_frame[np.random.choice(seed_frame.shape[0], Contest_Size)]
229
 
230
  sample_arrays1 = np.c_[
231
+ fp_random,
232
  np.sum(np.random.normal(
233
+ loc=np.concatenate([
234
+ vec_cpt_projection_map(fp_random[:, 0:1]), # Apply cpt_projection_map to first column
235
+ vec_projection_map(fp_random[:, 1:-7]) # Apply original projection to remaining columns
236
+ ], axis=1),
237
+ scale=np.concatenate([
238
+ vec_cpt_stdev_map(fp_random[:, 0:1]), # Apply cpt_projection_map to first column
239
+ vec_stdev_map(fp_random[:, 1:-7]) # Apply original projection to remaining columns
240
+ ], axis=1)),
241
  axis=1)
242
  ]
243
 
 
250
 
251
  return Sim_Winners
252
 
253
+ dk_raw, fd_raw = init_baselines('NFL')
254
+
255
  tab1, tab2 = st.tabs(['Contest Sims', 'Data Export'])
256
  with tab2:
257
  col1, col2 = st.columns([1, 7])
 
263
  dk_raw, fd_raw = init_baselines('NFL')
264
 
265
  sport_var1 = st.radio("What sport are you working with?", ('NBA', 'NFL'), key='sport_var1')
266
+ slate_var1 = st.radio("Which data are you loading?", ('Showdown', 'Secondary Showdown', 'Auxiliary Showdown'), key='slate_var1')
267
+ sharp_split_var = st.number_input("How many lineups do you want?", value=10000, max_value=500000, min_value=10000, step=10000)
268
 
269
  site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'), key='site_var1')
270
  if site_var1 == 'Draftkings':
 
 
 
 
 
 
271
 
272
  team_var1 = st.radio("Do you want a frame with specific teams?", ('Full Slate', 'Specific Teams'), key='team_var1')
273
  if team_var1 == 'Specific Teams':
 
282
  stack_var2 = [5, 4, 3, 2, 1, 0]
283
 
284
  elif site_var1 == 'Fanduel':
 
 
 
 
 
 
285
 
286
  team_var1 = st.radio("Do you want a frame with specific teams?", ('Full Slate', 'Specific Teams'), key='team_var1')
287
  if team_var1 == 'Specific Teams':
 
297
 
298
 
299
  if st.button("Prepare data export", key='data_export'):
300
+ if 'working_seed' in st.session_state:
301
  data_export = st.session_state.working_seed.copy()
302
+ elif 'working_seed' not in st.session_state:
303
+ if site_var1 == 'Draftkings':
304
+ if slate_var1 == 'Showdown':
305
+ st.session_state.working_seed = init_DK_seed_frames(sport_var1, sharp_split_var)
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
+ st.session_state.working_seed = init_DK_secondary_seed_frames(sport_var1, sharp_split_var)
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
+ st.session_state.working_seed = init_DK_auxiliary_seed_frames(sport_var1, sharp_split_var)
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
+ elif site_var1 == 'Fanduel':
325
+ if slate_var1 == 'Showdown':
326
+ st.session_state.working_seed = init_FD_seed_frames(sport_var1, sharp_split_var)
327
+ if sport_var1 == 'NFL':
328
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
329
+ elif sport_var1 == 'NBA':
330
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
331
+ elif slate_var1 == 'Secondary Showdown':
332
+ st.session_state.working_seed = init_FD_secondary_seed_frames(sport_var1, sharp_split_var)
333
+ if sport_var1 == 'NFL':
334
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
335
+ elif sport_var1 == 'NBA':
336
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
337
+ elif slate_var1 == 'Auxiliary Showdown':
338
+ st.session_state.working_seed = init_FD_auxiliary_seed_frames(sport_var1, sharp_split_var)
339
+ if sport_var1 == 'NFL':
340
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
341
+ elif sport_var1 == 'NBA':
342
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
343
+ raw_baselines = fd_raw
344
+ column_names = fd_columns
345
+ data_export = st.session_state.working_seed.copy()
346
+ for col in range(6):
347
+ data_export[:, col] = np.array([export_id_dict.get(x, x) for x in data_export[:, col]])
348
+ st.download_button(
349
+ label="Export optimals set",
350
+ data=convert_df(data_export),
351
+ file_name='NFL_SD_optimals_export.csv',
352
  mime='text/csv',
353
  )
354
 
 
360
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 10], stack_var2)]
361
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
362
  elif 'working_seed' not in st.session_state:
363
+ if slate_var1 == 'Showdown':
364
+ st.session_state.working_seed = init_DK_seed_frames(sport_var1, sharp_split_var)
365
+ if sport_var1 == 'NFL':
366
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
367
+ elif sport_var1 == 'NBA':
368
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
369
+ elif slate_var1 == 'Secondary Showdown':
370
+ st.session_state.working_seed = init_DK_secondary_seed_frames(sport_var1, sharp_split_var)
371
+ if sport_var1 == 'NFL':
372
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
373
+ elif sport_var1 == 'NBA':
374
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
375
+ elif slate_var1 == 'Auxiliary Showdown':
376
+ st.session_state.working_seed = init_DK_auxiliary_seed_frames(sport_var1, sharp_split_var)
377
+ if sport_var1 == 'NFL':
378
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
379
+ elif sport_var1 == 'NBA':
380
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
381
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 9], team_var2)]
382
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 10], stack_var2)]
383
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
 
388
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 9], stack_var2)]
389
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
390
  elif 'working_seed' not in st.session_state:
391
+ if slate_var1 == 'Showdown':
392
+ st.session_state.working_seed = init_FD_seed_frames(sport_var1, sharp_split_var)
393
+ if sport_var1 == 'NFL':
394
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
395
+ elif sport_var1 == 'NBA':
396
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
397
+ elif slate_var1 == 'Secondary Showdown':
398
+ st.session_state.working_seed = init_FD_secondary_seed_frames(sport_var1, sharp_split_var)
399
+ if sport_var1 == 'NFL':
400
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
401
+ elif sport_var1 == 'NBA':
402
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
403
+ elif slate_var1 == 'Auxiliary Showdown':
404
+ st.session_state.working_seed = init_FD_auxiliary_seed_frames(sport_var1, sharp_split_var)
405
+ if sport_var1 == 'NFL':
406
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
407
+ elif sport_var1 == 'NBA':
408
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
409
+ raw_baselines = fd_raw
410
+ column_names = fd_columns
411
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 8], team_var2)]
412
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 9], stack_var2)]
413
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
 
426
  dk_raw, fd_raw = init_baselines('NFL')
427
  sim_sport_var1 = st.radio("What sport are you working with?", ('NBA', 'NFL'), key='sim_sport_var1')
428
  dk_raw, fd_raw = init_baselines(sim_sport_var1)
429
+ sim_slate_var1 = st.radio("Which data are you loading?", ('Showdown', 'Secondary Showdown', 'Auxiliary Showdown'), key='sim_slate_var1')
430
  sim_site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'), key='sim_site_var1')
431
  if sim_site_var1 == 'Draftkings':
 
 
 
 
432
  raw_baselines = dk_raw
433
  column_names = dk_columns
434
  elif sim_site_var1 == 'Fanduel':
 
 
 
 
435
  raw_baselines = fd_raw
436
  column_names = fd_columns
 
437
  contest_var1 = st.selectbox("What contest size are you simulating?", ('Small', 'Medium', 'Large', 'Custom'))
438
  if contest_var1 == 'Small':
439
  Contest_Size = 1000
440
+ st.write("Small field size is 1,000 entrants.")
441
+ raw_baselines['Own'] = raw_baselines['Small_Field_Own']
442
+ raw_baselines['CPT_Own'] = raw_baselines['small_CPT_Own']
443
  elif contest_var1 == 'Medium':
444
  Contest_Size = 5000
445
+ st.write("Medium field size is 5,000 entrants.")
446
  elif contest_var1 == 'Large':
447
  Contest_Size = 10000
448
+ st.write("Large field size is 10,000 entrants.")
449
  elif contest_var1 == 'Custom':
450
+ Contest_Size = st.number_input("Insert contest size", value=100, min_value=1, max_value=100000)
451
  strength_var1 = st.selectbox("How sharp is the field in the contest?", ('Very', 'Above Average', 'Average', 'Below Average', 'Not Very'))
452
  if strength_var1 == 'Not Very':
453
  sharp_split = 500000
 
466
  if 'working_seed' in st.session_state:
467
  maps_dict = {
468
  'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),
469
+ 'cpt_projection_map':dict(zip(raw_baselines.Player,raw_baselines.cpt_Median)),
470
  'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)),
471
  'Pos_map':dict(zip(raw_baselines.Player,raw_baselines.Position)),
472
  'Own_map':dict(zip(raw_baselines.Player,raw_baselines['Own'])),
473
+ 'cpt_Own_map':dict(zip(raw_baselines.Player,raw_baselines['CPT_Own'])),
474
  'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)),
475
+ 'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev)),
476
+ 'cpt_STDev_map':dict(zip(raw_baselines.Player,raw_baselines['CPT_STDev']))
477
  }
478
+ Sim_Winners = sim_contest(1000, st.session_state.working_seed, maps_dict, Contest_Size)
479
  Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
480
 
481
  #st.table(Sim_Winner_Frame)
 
502
 
503
  else:
504
  if sim_site_var1 == 'Draftkings':
505
+ if sim_slate_var1 == 'Showdown':
506
+ st.session_state.working_seed = init_DK_seed_frames(sim_sport_var1, sharp_split_var)
507
+ if sport_var1 == 'NFL':
508
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
509
+ elif sport_var1 == 'NBA':
510
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
511
+ elif sim_slate_var1 == 'Secondary Showdown':
512
+ st.session_state.working_seed = init_DK_secondary_seed_frames(sim_sport_var1, sharp_split_var)
513
+ if sport_var1 == 'NFL':
514
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
515
+ elif sport_var1 == 'NBA':
516
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
517
+ elif sim_slate_var1 == 'Auxiliary Showdown':
518
+ st.session_state.working_seed = init_DK_auxiliary_seed_frames(sim_sport_var1, sharp_split_var)
519
+ if sport_var1 == 'NFL':
520
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
521
+ elif sport_var1 == 'NBA':
522
+ export_id_dict = dict(zip(dk_raw['Player'], dk_raw['player_id']))
523
+ raw_baselines = dk_raw
524
+ column_names = dk_columns
525
  elif sim_site_var1 == 'Fanduel':
526
+ if sim_slate_var1 == 'Showdown':
527
+ st.session_state.working_seed = init_FD_seed_frames(sim_sport_var1, sharp_split_var)
528
+ if sport_var1 == 'NFL':
529
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
530
+ elif sport_var1 == 'NBA':
531
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
532
+ elif sim_slate_var1 == 'Secondary Showdown':
533
+ st.session_state.working_seed = init_FD_secondary_seed_frames(sim_sport_var1, sharp_split_var)
534
+ if sport_var1 == 'NFL':
535
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
536
+ elif sport_var1 == 'NBA':
537
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
538
+ elif sim_slate_var1 == 'Auxiliary Showdown':
539
+ st.session_state.working_seed = init_FD_auxiliary_seed_frames(sim_sport_var1, sharp_split_var)
540
+ if sport_var1 == 'NFL':
541
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
542
+ elif sport_var1 == 'NBA':
543
+ export_id_dict = dict(zip(fd_raw['Player'], fd_raw['player_id']))
544
+ raw_baselines = fd_raw
545
+ column_names = fd_columns
546
  maps_dict = {
547
  'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),
548
+ 'cpt_projection_map':dict(zip(raw_baselines.Player,raw_baselines.cpt_Median)),
549
  'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)),
550
  'Pos_map':dict(zip(raw_baselines.Player,raw_baselines.Position)),
551
  'Own_map':dict(zip(raw_baselines.Player,raw_baselines['Own'])),
552
+ 'cpt_Own_map':dict(zip(raw_baselines.Player,raw_baselines['CPT_Own'])),
553
  'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)),
554
+ 'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev)),
555
+ 'cpt_STDev_map':dict(zip(raw_baselines.Player,raw_baselines['CPT_STDev']))
556
  }
557
+ Sim_Winners = sim_contest(1000, st.session_state.working_seed, maps_dict, Contest_Size)
558
  Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
559
 
560
  #st.table(Sim_Winner_Frame)
 
563
  Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=column_names + ['Fantasy'])
564
  Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['proj'] + Sim_Winner_Frame['Fantasy']) / 2
565
  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)
566
+ # Add percent rank columns for ownership at each roster position
567
+ # Calculate Dupes column for Fanduel
568
+ if sim_site_var1 == 'Fanduel':
569
+ dup_count_columns = ['CPT_Own_percent_rank', 'FLEX1_Own_percent_rank', 'FLEX2_Own_percent_rank', 'FLEX3_Own_percent_rank', 'FLEX4_Own_percent_rank']
570
+ own_columns = ['CPT_Own', 'FLEX1_Own', 'FLEX2_Own', 'FLEX3_Own', 'FLEX4_Own']
571
+ calc_columns = ['own_product', 'avg_own_rank', 'dupes_calc']
572
+ Sim_Winner_Frame['CPT_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,0].map(maps_dict['cpt_Own_map']).rank(pct=True)
573
+ Sim_Winner_Frame['FLEX1_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,1].map(maps_dict['Own_map']).rank(pct=True)
574
+ Sim_Winner_Frame['FLEX2_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,2].map(maps_dict['Own_map']).rank(pct=True)
575
+ Sim_Winner_Frame['FLEX3_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,3].map(maps_dict['Own_map']).rank(pct=True)
576
+ Sim_Winner_Frame['FLEX4_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,4].map(maps_dict['Own_map']).rank(pct=True)
577
+ Sim_Winner_Frame['CPT_Own'] = Sim_Winner_Frame.iloc[:,0].map(maps_dict['cpt_Own_map']) / 100
578
+ Sim_Winner_Frame['FLEX1_Own'] = Sim_Winner_Frame.iloc[:,1].map(maps_dict['Own_map']) / 100
579
+ Sim_Winner_Frame['FLEX2_Own'] = Sim_Winner_Frame.iloc[:,2].map(maps_dict['Own_map']) / 100
580
+ Sim_Winner_Frame['FLEX3_Own'] = Sim_Winner_Frame.iloc[:,3].map(maps_dict['Own_map']) / 100
581
+ Sim_Winner_Frame['FLEX4_Own'] = Sim_Winner_Frame.iloc[:,4].map(maps_dict['Own_map']) / 100
582
+
583
+ # Calculate ownership product and convert to probability
584
+ Sim_Winner_Frame['own_product'] = (Sim_Winner_Frame[own_columns].product(axis=1)) + 0.0001
585
+
586
+ # Calculate average of ownership percent rank columns
587
+ Sim_Winner_Frame['avg_own_rank'] = Sim_Winner_Frame[dup_count_columns].mean(axis=1)
588
+
589
+ # Calculate dupes formula
590
+ 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)
591
+
592
+ # Round and handle negative values
593
+ Sim_Winner_Frame['Dupes'] = np.where(
594
+ np.round(Sim_Winner_Frame['dupes_calc'], 0) <= 0,
595
+ 0,
596
+ np.round(Sim_Winner_Frame['dupes_calc'], 0) - 1
597
+ )
598
+ Sim_Winner_Frame['Dupes'] = (Sim_Winner_Frame['Dupes'] * (500000 / sharp_split)) / 2
599
+ elif sim_site_var1 == 'Draftkings':
600
+ 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']
601
+ own_columns = ['CPT_Own', 'FLEX1_Own', 'FLEX2_Own', 'FLEX3_Own', 'FLEX4_Own', 'FLEX5_Own']
602
+ calc_columns = ['own_product', 'avg_own_rank', 'dupes_calc']
603
+ Sim_Winner_Frame['CPT_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,0].map(maps_dict['cpt_Own_map']).rank(pct=True)
604
+ Sim_Winner_Frame['FLEX1_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,1].map(maps_dict['Own_map']).rank(pct=True)
605
+ Sim_Winner_Frame['FLEX2_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,2].map(maps_dict['Own_map']).rank(pct=True)
606
+ Sim_Winner_Frame['FLEX3_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,3].map(maps_dict['Own_map']).rank(pct=True)
607
+ Sim_Winner_Frame['FLEX4_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,4].map(maps_dict['Own_map']).rank(pct=True)
608
+ Sim_Winner_Frame['FLEX5_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,5].map(maps_dict['Own_map']).rank(pct=True)
609
+ Sim_Winner_Frame['CPT_Own'] = Sim_Winner_Frame.iloc[:,0].map(maps_dict['cpt_Own_map']) / 100
610
+ Sim_Winner_Frame['FLEX1_Own'] = Sim_Winner_Frame.iloc[:,1].map(maps_dict['Own_map']) / 100
611
+ Sim_Winner_Frame['FLEX2_Own'] = Sim_Winner_Frame.iloc[:,2].map(maps_dict['Own_map']) / 100
612
+ Sim_Winner_Frame['FLEX3_Own'] = Sim_Winner_Frame.iloc[:,3].map(maps_dict['Own_map']) / 100
613
+ Sim_Winner_Frame['FLEX4_Own'] = Sim_Winner_Frame.iloc[:,4].map(maps_dict['Own_map']) / 100
614
+ Sim_Winner_Frame['FLEX5_Own'] = Sim_Winner_Frame.iloc[:,5].map(maps_dict['Own_map']) / 100
615
+
616
+ # Calculate ownership product and convert to probability
617
+ Sim_Winner_Frame['own_product'] = (Sim_Winner_Frame[own_columns].product(axis=1))
618
+
619
+ # Calculate average of ownership percent rank columns
620
+ Sim_Winner_Frame['avg_own_rank'] = Sim_Winner_Frame[dup_count_columns].mean(axis=1)
621
+
622
+ # Calculate dupes formula
623
+ 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)
624
+
625
+ # Round and handle negative values
626
+ Sim_Winner_Frame['Dupes'] = np.where(
627
+ np.round(Sim_Winner_Frame['dupes_calc'], 0) <= 0,
628
+ 0,
629
+ np.round(Sim_Winner_Frame['dupes_calc'], 0) - 1
630
+ )
631
+ Sim_Winner_Frame['Dupes'] = (Sim_Winner_Frame['Dupes'] * (500000 / sharp_split)) / 2
632
+ Sim_Winner_Frame['Dupes'] = np.round(Sim_Winner_Frame['Dupes'], 0)
633
+ Sim_Winner_Frame['Dupes'] = np.where(
634
+ np.round(Sim_Winner_Frame['dupes_calc'], 0) <= 0,
635
+ 0,
636
+ np.round(Sim_Winner_Frame['dupes_calc'], 0)
637
+ )
638
+ Sim_Winner_Frame = Sim_Winner_Frame.drop(columns=dup_count_columns)
639
+ Sim_Winner_Frame = Sim_Winner_Frame.drop(columns=own_columns)
640
+ Sim_Winner_Frame = Sim_Winner_Frame.drop(columns=calc_columns)
641
+
642
  Sim_Winner_Frame = Sim_Winner_Frame.assign(win_count=Sim_Winner_Frame['unique_id'].map(Sim_Winner_Frame['unique_id'].value_counts()))
643
 
644
  # Type Casting
645
+ type_cast_dict = {'salary': int, 'proj': np.float16, 'Fantasy': np.float16, 'GPP_Proj': np.float32, 'Own': np.float32, 'Dupes': int}
646
  Sim_Winner_Frame = Sim_Winner_Frame.astype(type_cast_dict)
647
 
648
  # Sorting
 
651
 
652
  # Data Copying
653
  st.session_state.Sim_Winner_Export = Sim_Winner_Frame.copy()
654
+ 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))
655
 
656
  # Data Copying
657
  st.session_state.Sim_Winner_Display = Sim_Winner_Frame.copy()
 
666
  freq_working['Freq'] = freq_working['Freq'].astype(int)
667
  freq_working['Position'] = freq_working['Player'].map(maps_dict['Pos_map'])
668
  if sim_site_var1 == 'Draftkings':
669
+ if sim_sport_var1 == 'NFL':
670
+ freq_working['Salary'] = freq_working['Player'].map(maps_dict['Salary_map']) / 1.5
671
+ elif sim_sport_var1 == 'NBA':
672
+ freq_working['Salary'] = freq_working['Player'].map(maps_dict['Salary_map'])
673
  elif sim_site_var1 == 'Fanduel':
674
  freq_working['Salary'] = freq_working['Player'].map(maps_dict['Salary_map'])
675
  freq_working['Proj Own'] = freq_working['Player'].map(maps_dict['Own_map']) / 100
 
681
  if sim_site_var1 == 'Draftkings':
682
  cpt_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,0:1].values, return_counts=True)),
683
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
 
684
  elif sim_site_var1 == 'Fanduel':
685
  cpt_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,0:1].values, return_counts=True)),
686
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
 
687
  cpt_working['Freq'] = cpt_working['Freq'].astype(int)
688
  cpt_working['Position'] = cpt_working['Player'].map(maps_dict['Pos_map'])
689
+ if sim_sport_var1 == 'NFL':
690
+ cpt_working['Salary'] = cpt_working['Player'].map(maps_dict['Salary_map'])
691
+ elif sim_sport_var1 == 'NBA':
692
+ cpt_working['Salary'] = cpt_working['Player'].map(maps_dict['Salary_map']) * 1.5
693
+ cpt_working['Proj Own'] = cpt_working['Player'].map(maps_dict['cpt_Own_map']) / 100
694
  cpt_working['Exposure'] = cpt_working['Freq']/(1000)
695
  cpt_working['Edge'] = cpt_working['Exposure'] - cpt_working['Proj Own']
696
  cpt_working['Team'] = cpt_working['Player'].map(maps_dict['Team_map'])
 
707
  flex_working['Freq'] = flex_working['Freq'].astype(int)
708
  flex_working['Position'] = flex_working['Player'].map(maps_dict['Pos_map'])
709
  if sim_site_var1 == 'Draftkings':
710
+ if sim_sport_var1 == 'NFL':
711
+ flex_working['Salary'] = flex_working['Player'].map(maps_dict['Salary_map']) / 1.5
712
+ elif sim_sport_var1 == 'NBA':
713
+ flex_working['Salary'] = flex_working['Player'].map(maps_dict['Salary_map'])
714
  elif sim_site_var1 == 'Fanduel':
715
  flex_working['Salary'] = flex_working['Player'].map(maps_dict['Salary_map'])
716
+ flex_working['Proj Own'] = (flex_working['Player'].map(maps_dict['Own_map']) / 100) - (flex_working['Player'].map(maps_dict['cpt_Own_map']) / 100)
717
  flex_working['Exposure'] = flex_working['Freq']/(1000)
718
  flex_working['Edge'] = flex_working['Exposure'] - flex_working['Proj Own']
719
  flex_working['Team'] = flex_working['Player'].map(maps_dict['Team_map'])
 
728
  team_working['Freq'] = team_working['Freq'].astype(int)
729
  team_working['Exposure'] = team_working['Freq']/(1000)
730
  st.session_state.team_freq = team_working.copy()
 
 
 
 
 
 
 
 
 
 
731
 
732
  with st.container():
733
  if st.button("Reset Sim", key='reset_sim'):