James McCool commited on
Commit
5481883
·
1 Parent(s): 144cddf

removing Fanduel specific logic from Predict Dupes

Browse files
Files changed (2) hide show
  1. app.py +5 -7
  2. global_func/predict_dupes.py +161 -246
app.py CHANGED
@@ -1290,19 +1290,17 @@ if selected_tab == 'Manage Portfolio':
1290
  with st.expander('Micro Filter Options'):
1291
  with st.form(key='micro_filter_form'):
1292
  player_names = set()
1293
- print(st.session_state['working_frame'].columns)
1294
  for col in st.session_state['working_frame'].columns:
1295
  if col not in excluded_cols:
1296
  player_names.update(st.session_state['working_frame'][col].unique())
1297
  if type_var == 'Showdown':
1298
  cpt_flex_focus = st.selectbox("Focus on Overall, CPT, or FLEX?", options=['Overall', 'CPT', 'FLEX'], index=0)
1299
- # Will sort these again after checking
1300
- player_lock = st.multiselect("Lock players?", options=list(player_names), default=[])
1301
- player_remove = st.multiselect("Remove players?", options=list(player_names), default=[])
1302
- team_include = st.multiselect("Include teams?", options=list(set(st.session_state['projections_df']['team'].unique())), default=[])
1303
- team_remove = st.multiselect("Remove teams?", options=list(set(st.session_state['projections_df']['team'].unique())), default=[])
1304
  if sport_var in stacking_sports:
1305
- size_include = st.multiselect("Include sizes?", options=list(set(st.session_state['working_frame']['Size'].unique())), default=[])
1306
  else:
1307
  size_include = []
1308
 
 
1290
  with st.expander('Micro Filter Options'):
1291
  with st.form(key='micro_filter_form'):
1292
  player_names = set()
 
1293
  for col in st.session_state['working_frame'].columns:
1294
  if col not in excluded_cols:
1295
  player_names.update(st.session_state['working_frame'][col].unique())
1296
  if type_var == 'Showdown':
1297
  cpt_flex_focus = st.selectbox("Focus on Overall, CPT, or FLEX?", options=['Overall', 'CPT', 'FLEX'], index=0)
1298
+ player_lock = st.multiselect("Lock players?", options=sorted(list(player_names)), default=[])
1299
+ player_remove = st.multiselect("Remove players?", options=sorted(list(player_names)), default=[])
1300
+ team_include = st.multiselect("Include teams?", options=sorted(list(set(st.session_state['projections_df']['team'].unique()))), default=[])
1301
+ team_remove = st.multiselect("Remove teams?", options=sorted(list(set(st.session_state['projections_df']['team'].unique()))), default=[])
 
1302
  if sport_var in stacking_sports:
1303
+ size_include = st.multiselect("Include sizes?", options=sorted(list(set(st.session_state['working_frame']['Size'].unique()))), default=[])
1304
  else:
1305
  size_include = []
1306
 
global_func/predict_dupes.py CHANGED
@@ -118,16 +118,45 @@ def predict_dupes(portfolio, maps_dict, site_var, type_var, Contest_Size, streng
118
  percentile_multiplier = 1.10
119
  max_ownership = max(maps_dict['own_map'].values()) / 100
120
  average_ownership = np.mean(list(maps_dict['own_map'].values())) / 100
121
- if site_var == 'Fanduel':
122
- if type_var == 'Showdown':
123
- dup_count_columns = ['CPT_Own_percent_rank', 'FLEX1_Own_percent_rank', 'FLEX2_Own_percent_rank', 'FLEX3_Own_percent_rank', 'FLEX4_Own_percent_rank']
124
- own_columns = ['CPT_Own', 'FLEX1_Own', 'FLEX2_Own', 'FLEX3_Own', 'FLEX4_Own']
125
- calc_columns = ['own_product', 'own_average', 'own_sum', 'avg_own_rank', 'dupes_calc', 'low_own_count', 'own_ratio', 'Ref_Proj', 'Max_Proj', 'Min_Proj', 'Avg_Ref', 'own_ratio']
126
- # Get the original player columns (first 5 columns excluding salary, median, Own)
127
- player_columns = [col for col in portfolio.columns[:5] if col not in ['salary', 'median', 'Own']]
128
 
129
- n_rows = len(portfolio)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
130
 
 
 
 
 
 
 
 
131
  flex_ownerships = pd.concat([
132
  portfolio.iloc[:,1].map(maps_dict['own_map']),
133
  portfolio.iloc[:,2].map(maps_dict['own_map']),
@@ -137,6 +166,59 @@ def predict_dupes(portfolio, maps_dict, site_var, type_var, Contest_Size, streng
137
  ])
138
  flex_rank = flex_ownerships.rank(pct=True)
139
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
140
  # Assign ranks back to individual columns using the same rank scale
141
  portfolio['CPT_Own_percent_rank'] = portfolio.iloc[:,0].map(maps_dict['cpt_own_map']).rank(pct=True)
142
  portfolio['FLEX1_Own_percent_rank'] = flex_rank.iloc[0:n_rows].values
@@ -151,16 +233,72 @@ def predict_dupes(portfolio, maps_dict, site_var, type_var, Contest_Size, streng
151
  portfolio['FLEX3_Own'] = portfolio.iloc[:,3].map(maps_dict['own_map']).astype('float32') / 100
152
  portfolio['FLEX4_Own'] = portfolio.iloc[:,4].map(maps_dict['own_map']).astype('float32') / 100
153
  portfolio['FLEX5_Own'] = portfolio.iloc[:,5].map(maps_dict['own_map']).astype('float32') / 100
154
-
155
  portfolio['own_product'] = (portfolio[own_columns].product(axis=1)) * max(Contest_Size / 10000, 1)
156
  portfolio['own_average'] = (portfolio['Own'].max() * .33) / 100
157
  portfolio['own_sum'] = portfolio[own_columns].sum(axis=1)
158
  portfolio['avg_own_rank'] = portfolio[dup_count_columns].mean(axis=1)
159
 
160
  # Calculate dupes formula
161
- portfolio['dupes_calc'] = (portfolio['own_product'] * portfolio['avg_own_rank']) * (portfolio['Own'] / 100) * Contest_Size + ((portfolio['salary'] - (max_salary - portfolio['Own'])) / 100) - ((max_salary - portfolio['salary']) / 100)
162
  portfolio['dupes_calc'] = portfolio['dupes_calc'] * dupes_multiplier * (portfolio['Own'] / (90 + (Contest_Size / 1000)))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
164
  # Round and handle negative values
165
  portfolio['Dupes'] = np.where(
166
  portfolio['salary'] == max_salary,
@@ -172,11 +310,11 @@ def predict_dupes(portfolio, maps_dict, site_var, type_var, Contest_Size, streng
172
  0,
173
  np.round(portfolio['Dupes'], 0) - 1
174
  )
175
- elif type_var == 'Classic':
176
  num_players = len([col for col in portfolio.columns if col not in ['salary', 'median', 'Own']])
177
  dup_count_columns = [f'player_{i}_percent_rank' for i in range(1, num_players + 1)]
178
  own_columns = [f'player_{i}_own' for i in range(1, num_players + 1)]
179
- calc_columns = ['own_product', 'own_average', 'own_sum', 'avg_own_rank', 'dupes_calc', 'low_own_count', 'own_ratio', 'Ref_Proj', 'Max_Proj', 'Min_Proj', 'Avg_Ref', 'own_ratio']
180
  # Get the original player columns (first num_players columns excluding salary, median, Own)
181
  player_columns = [col for col in portfolio.columns[:num_players] if col not in ['salary', 'median', 'Own']]
182
 
@@ -202,78 +340,25 @@ def predict_dupes(portfolio, maps_dict, site_var, type_var, Contest_Size, streng
202
  0,
203
  np.round(portfolio['Dupes'], 0) - 1
204
  )
205
-
206
- elif site_var == 'Draftkings':
207
- if type_var == 'Showdown':
208
- if sport_var == 'GOLF':
209
- dup_count_columns = ['FLEX1_Own_percent_rank', 'FLEX2_Own_percent_rank', 'FLEX3_Own_percent_rank', 'FLEX4_Own_percent_rank', 'FLEX5_Own_percent_rank', 'FLEX6_Own_percent_rank']
210
- own_columns = ['FLEX1_Own', 'FLEX2_Own', 'FLEX3_Own', 'FLEX4_Own', 'FLEX5_Own', 'FLEX6_Own']
211
- else:
212
- 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']
213
- own_columns = ['CPT_Own', 'FLEX1_Own', 'FLEX2_Own', 'FLEX3_Own', 'FLEX4_Own', 'FLEX5_Own']
214
  calc_columns = ['own_product', 'own_average', 'own_sum', 'avg_own_rank', 'dupes_calc', 'low_own_count', 'Ref_Proj', 'Max_Proj', 'Min_Proj', 'Avg_Ref', 'own_ratio']
215
- # Get the original player columns (first 6 columns excluding salary, median, Own)
216
- player_columns = [col for col in portfolio.columns[:6] if col not in ['salary', 'median', 'Own']]
217
- n_rows = len(portfolio)
 
 
 
218
 
219
- # Assign ranks back to individual columns using the same rank scale
220
- if sport_var == 'GOLF':
221
- flex_ownerships = pd.concat([
222
- portfolio.iloc[:,1].map(maps_dict['own_map']),
223
- portfolio.iloc[:,2].map(maps_dict['own_map']),
224
- portfolio.iloc[:,3].map(maps_dict['own_map']),
225
- portfolio.iloc[:,4].map(maps_dict['own_map']),
226
- portfolio.iloc[:,5].map(maps_dict['own_map']),
227
- portfolio.iloc[:,6].map(maps_dict['own_map'])
228
- ])
229
- flex_rank = flex_ownerships.rank(pct=True)
230
-
231
- portfolio['FLEX1_Own_percent_rank'] = flex_rank.iloc[0:n_rows].values
232
- portfolio['FLEX2_Own_percent_rank'] = flex_rank.iloc[n_rows:2*n_rows].values
233
- portfolio['FLEX3_Own_percent_rank'] = flex_rank.iloc[2*n_rows:3*n_rows].values
234
- portfolio['FLEX4_Own_percent_rank'] = flex_rank.iloc[3*n_rows:4*n_rows].values
235
- portfolio['FLEX5_Own_percent_rank'] = flex_rank.iloc[4*n_rows:5*n_rows].values
236
- portfolio['FLEX6_Own_percent_rank'] = flex_rank.iloc[5*n_rows:6*n_rows].values
237
-
238
- portfolio['FLEX1_Own'] = portfolio.iloc[:,0].map(maps_dict['own_map']).astype('float32') / 100
239
- portfolio['FLEX2_Own'] = portfolio.iloc[:,1].map(maps_dict['own_map']).astype('float32') / 100
240
- portfolio['FLEX3_Own'] = portfolio.iloc[:,2].map(maps_dict['own_map']).astype('float32') / 100
241
- portfolio['FLEX4_Own'] = portfolio.iloc[:,3].map(maps_dict['own_map']).astype('float32') / 100
242
- portfolio['FLEX5_Own'] = portfolio.iloc[:,4].map(maps_dict['own_map']).astype('float32') / 100
243
- portfolio['FLEX6_Own'] = portfolio.iloc[:,5].map(maps_dict['own_map']).astype('float32') / 100
244
- else:
245
- flex_ownerships = pd.concat([
246
- portfolio.iloc[:,1].map(maps_dict['own_map']),
247
- portfolio.iloc[:,2].map(maps_dict['own_map']),
248
- portfolio.iloc[:,3].map(maps_dict['own_map']),
249
- portfolio.iloc[:,4].map(maps_dict['own_map']),
250
- portfolio.iloc[:,5].map(maps_dict['own_map'])
251
- ])
252
- flex_rank = flex_ownerships.rank(pct=True)
253
-
254
- portfolio['CPT_Own_percent_rank'] = portfolio.iloc[:,0].map(maps_dict['cpt_own_map']).rank(pct=True)
255
- portfolio['FLEX1_Own_percent_rank'] = flex_rank.iloc[0:n_rows].values
256
- portfolio['FLEX2_Own_percent_rank'] = flex_rank.iloc[n_rows:2*n_rows].values
257
- portfolio['FLEX3_Own_percent_rank'] = flex_rank.iloc[2*n_rows:3*n_rows].values
258
- portfolio['FLEX4_Own_percent_rank'] = flex_rank.iloc[3*n_rows:4*n_rows].values
259
- portfolio['FLEX5_Own_percent_rank'] = flex_rank.iloc[4*n_rows:5*n_rows].values
260
-
261
- portfolio['CPT_Own'] = portfolio.iloc[:,0].map(maps_dict['cpt_own_map']).astype('float32') / 100
262
- portfolio['FLEX1_Own'] = portfolio.iloc[:,1].map(maps_dict['own_map']).astype('float32') / 100
263
- portfolio['FLEX2_Own'] = portfolio.iloc[:,2].map(maps_dict['own_map']).astype('float32') / 100
264
- portfolio['FLEX3_Own'] = portfolio.iloc[:,3].map(maps_dict['own_map']).astype('float32') / 100
265
- portfolio['FLEX4_Own'] = portfolio.iloc[:,4].map(maps_dict['own_map']).astype('float32') / 100
266
- portfolio['FLEX5_Own'] = portfolio.iloc[:,5].map(maps_dict['own_map']).astype('float32') / 100
267
-
268
  portfolio['own_product'] = (portfolio[own_columns].product(axis=1))
269
  portfolio['own_average'] = (portfolio['Own'].max() * .33) / 100
270
  portfolio['own_sum'] = portfolio[own_columns].sum(axis=1)
271
  portfolio['avg_own_rank'] = portfolio[dup_count_columns].mean(axis=1)
272
 
273
- # Calculate dupes formula
274
  portfolio['dupes_calc'] = (portfolio['own_product'] * portfolio['avg_own_rank']) * Contest_Size + ((portfolio['salary'] - (max_salary - portfolio['Own'])) / 100) - ((max_salary - portfolio['salary']) / 100)
275
- portfolio['dupes_calc'] = portfolio['dupes_calc'] * dupes_multiplier * (portfolio['Own'] / (120 + (Contest_Size / 1000)))
276
-
277
  # Round and handle negative values
278
  portfolio['Dupes'] = np.where(
279
  portfolio['salary'] == max_salary,
@@ -285,176 +370,6 @@ def predict_dupes(portfolio, maps_dict, site_var, type_var, Contest_Size, streng
285
  0,
286
  np.round(portfolio['Dupes'], 0) - 1
287
  )
288
- elif type_var == 'Classic':
289
- if sport_var == 'CS2':
290
- 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']
291
- own_columns = ['CPT_Own', 'FLEX1_Own', 'FLEX2_Own', 'FLEX3_Own', 'FLEX4_Own', 'FLEX5_Own']
292
- calc_columns = ['own_product', 'own_average', 'own_sum', 'avg_own_rank', 'dupes_calc', 'low_own_count', 'Ref_Proj', 'Max_Proj', 'Min_Proj', 'Avg_Ref', 'own_ratio']
293
- # Get the original player columns (first 6 columns excluding salary, median, Own)
294
- player_columns = [col for col in portfolio.columns[:6] if col not in ['salary', 'median', 'Own']]
295
-
296
- n_rows = len(portfolio)
297
-
298
- flex_ownerships = pd.concat([
299
- portfolio.iloc[:,1].map(maps_dict['own_map']),
300
- portfolio.iloc[:,2].map(maps_dict['own_map']),
301
- portfolio.iloc[:,3].map(maps_dict['own_map']),
302
- portfolio.iloc[:,4].map(maps_dict['own_map']),
303
- portfolio.iloc[:,5].map(maps_dict['own_map'])
304
- ])
305
- flex_rank = flex_ownerships.rank(pct=True)
306
-
307
- # Assign ranks back to individual columns using the same rank scale
308
- portfolio['CPT_Own_percent_rank'] = portfolio.iloc[:,0].map(maps_dict['cpt_own_map']).rank(pct=True)
309
- portfolio['FLEX1_Own_percent_rank'] = flex_rank.iloc[0:n_rows].values
310
- portfolio['FLEX2_Own_percent_rank'] = flex_rank.iloc[n_rows:2*n_rows].values
311
- portfolio['FLEX3_Own_percent_rank'] = flex_rank.iloc[2*n_rows:3*n_rows].values
312
- portfolio['FLEX4_Own_percent_rank'] = flex_rank.iloc[3*n_rows:4*n_rows].values
313
- portfolio['FLEX5_Own_percent_rank'] = flex_rank.iloc[4*n_rows:5*n_rows].values
314
-
315
- portfolio['CPT_Own'] = portfolio.iloc[:,0].map(maps_dict['cpt_own_map']).astype('float32') / 100
316
- portfolio['FLEX1_Own'] = portfolio.iloc[:,1].map(maps_dict['own_map']).astype('float32') / 100
317
- portfolio['FLEX2_Own'] = portfolio.iloc[:,2].map(maps_dict['own_map']).astype('float32') / 100
318
- portfolio['FLEX3_Own'] = portfolio.iloc[:,3].map(maps_dict['own_map']).astype('float32') / 100
319
- portfolio['FLEX4_Own'] = portfolio.iloc[:,4].map(maps_dict['own_map']).astype('float32') / 100
320
- portfolio['FLEX5_Own'] = portfolio.iloc[:,5].map(maps_dict['own_map']).astype('float32') / 100
321
-
322
- portfolio['own_product'] = (portfolio[own_columns].product(axis=1)) * max(Contest_Size / 10000, 1)
323
- portfolio['own_average'] = (portfolio['Own'].max() * .33) / 100
324
- portfolio['own_sum'] = portfolio[own_columns].sum(axis=1)
325
- portfolio['avg_own_rank'] = portfolio[dup_count_columns].mean(axis=1)
326
-
327
- # Calculate dupes formula
328
- portfolio['dupes_calc'] = ((portfolio['own_product'] * 10) * portfolio['avg_own_rank']) * Contest_Size + ((portfolio['salary'] - (max_salary - portfolio['Own'])) / 50) - ((max_salary - portfolio['salary']) / 50)
329
- portfolio['dupes_calc'] = portfolio['dupes_calc'] * dupes_multiplier * (portfolio['Own'] / (90 + (Contest_Size / 1000)))
330
-
331
- # Round and handle negative values
332
- portfolio['Dupes'] = np.where(
333
- portfolio['salary'] == max_salary,
334
- portfolio['dupes_calc'] + (portfolio['dupes_calc'] * .10),
335
- portfolio['dupes_calc']
336
- )
337
- portfolio['Dupes'] = np.where(
338
- np.round(portfolio['Dupes'], 0) <= 0,
339
- 0,
340
- np.round(portfolio['Dupes'], 0) - 1
341
- )
342
- if sport_var == 'LOL':
343
- dup_count_columns = ['CPT_Own_percent_rank', 'TOP_Own_percent_rank', 'JNG_Own_percent_rank', 'MID_Own_percent_rank', 'ADC_Own_percent_rank', 'SUP_Own_percent_rank', 'Team_Own_percent_rank']
344
- own_columns = ['CPT_Own', 'TOP_Own', 'JNG_Own', 'MID_Own', 'ADC_Own', 'SUP_Own', 'Team_Own']
345
- calc_columns = ['own_product', 'own_average', 'own_sum', 'avg_own_rank', 'dupes_calc', 'low_own_count', 'Ref_Proj', 'Max_Proj', 'Min_Proj', 'Avg_Ref', 'own_ratio']
346
- # Get the original player columns (first 6 columns excluding salary, median, Own)
347
- player_columns = [col for col in portfolio.columns[:7] if col not in ['salary', 'median', 'Own']]
348
-
349
- n_rows = len(portfolio)
350
-
351
- flex_ownerships = pd.concat([
352
- portfolio.iloc[:,1].map(maps_dict['own_map']),
353
- portfolio.iloc[:,2].map(maps_dict['own_map']),
354
- portfolio.iloc[:,3].map(maps_dict['own_map']),
355
- portfolio.iloc[:,4].map(maps_dict['own_map']),
356
- portfolio.iloc[:,5].map(maps_dict['own_map']),
357
- portfolio.iloc[:,6].map(maps_dict['own_map'])
358
- ])
359
- flex_rank = flex_ownerships.rank(pct=True)
360
-
361
- # Assign ranks back to individual columns using the same rank scale
362
- portfolio['CPT_Own_percent_rank'] = portfolio.iloc[:,0].map(maps_dict['cpt_own_map']).rank(pct=True)
363
- portfolio['TOP_Own_percent_rank'] = flex_rank.iloc[0:n_rows].values
364
- portfolio['JNG_Own_percent_rank'] = flex_rank.iloc[n_rows:2*n_rows].values
365
- portfolio['MID_Own_percent_rank'] = flex_rank.iloc[2*n_rows:3*n_rows].values
366
- portfolio['ADC_Own_percent_rank'] = flex_rank.iloc[3*n_rows:4*n_rows].values
367
- portfolio['SUP_Own_percent_rank'] = flex_rank.iloc[4*n_rows:5*n_rows].values
368
- portfolio['Team_Own_percent_rank'] = flex_rank.iloc[5*n_rows:6*n_rows].values
369
-
370
- portfolio['CPT_Own'] = portfolio.iloc[:,0].map(maps_dict['cpt_own_map']).astype('float32') / 100
371
- portfolio['TOP_Own'] = portfolio.iloc[:,1].map(maps_dict['own_map']).astype('float32') / 100
372
- portfolio['JNG_Own'] = portfolio.iloc[:,2].map(maps_dict['own_map']).astype('float32') / 100
373
- portfolio['MID_Own'] = portfolio.iloc[:,3].map(maps_dict['own_map']).astype('float32') / 100
374
- portfolio['ADC_Own'] = portfolio.iloc[:,4].map(maps_dict['own_map']).astype('float32') / 100
375
- portfolio['SUP_Own'] = portfolio.iloc[:,5].map(maps_dict['own_map']).astype('float32') / 100
376
- portfolio['Team_Own'] = portfolio.iloc[:,6].map(maps_dict['own_map']).astype('float32') / 100
377
-
378
- portfolio['own_product'] = (portfolio[own_columns].product(axis=1)) * max(Contest_Size / 10000, 1)
379
- portfolio['own_average'] = (portfolio['Own'].max() * .33) / 100
380
- portfolio['own_sum'] = portfolio[own_columns].sum(axis=1)
381
- portfolio['avg_own_rank'] = portfolio[dup_count_columns].mean(axis=1)
382
-
383
- # Calculate dupes formula
384
- portfolio['dupes_calc'] = ((portfolio['own_product'] * 10) * portfolio['avg_own_rank']) * Contest_Size + ((portfolio['salary'] - (max_salary - portfolio['Own'])) / 50) - ((max_salary - portfolio['salary']) / 50)
385
- portfolio['dupes_calc'] = portfolio['dupes_calc'] * dupes_multiplier * (portfolio['Own'] / (90 + (Contest_Size / 1000)))
386
-
387
- # Round and handle negative values
388
- portfolio['Dupes'] = np.where(
389
- portfolio['salary'] == max_salary,
390
- portfolio['dupes_calc'] + (portfolio['dupes_calc'] * .10),
391
- portfolio['dupes_calc']
392
- )
393
- portfolio['Dupes'] = np.where(
394
- np.round(portfolio['Dupes'], 0) <= 0,
395
- 0,
396
- np.round(portfolio['Dupes'], 0) - 1
397
- )
398
- elif sport_var == 'GOLF':
399
- num_players = len([col for col in portfolio.columns if col not in ['salary', 'median', 'Own']])
400
- dup_count_columns = [f'player_{i}_percent_rank' for i in range(1, num_players + 1)]
401
- own_columns = [f'player_{i}_own' for i in range(1, num_players + 1)]
402
- calc_columns = ['own_product', 'own_average', 'own_sum', 'avg_own_rank', 'dupes_calc', 'low_own_count', 'Ref_Proj', 'Max_Proj', 'Min_Proj', 'Avg_Ref', 'own_ratio']
403
- # Get the original player columns (first num_players columns excluding salary, median, Own)
404
- player_columns = [col for col in portfolio.columns[:num_players] if col not in ['salary', 'median', 'Own']]
405
-
406
- for i in range(1, num_players + 1):
407
- portfolio[f'player_{i}_percent_rank'] = portfolio.iloc[:,i-1].map(maps_dict['own_percent_rank'])
408
- portfolio[f'player_{i}_own'] = portfolio.iloc[:,i-1].map(maps_dict['own_map']).astype('float32') / 100
409
-
410
- portfolio['own_product'] = (portfolio[own_columns].product(axis=1)) * max(Contest_Size / 10000, 1)
411
- portfolio['own_average'] = (portfolio['Own'].max() * .33) / 100
412
- portfolio['own_sum'] = portfolio[own_columns].sum(axis=1)
413
- portfolio['avg_own_rank'] = portfolio[dup_count_columns].mean(axis=1)
414
-
415
- portfolio['dupes_calc'] = (portfolio['own_product'] * portfolio['avg_own_rank']) * Contest_Size + ((portfolio['salary'] - (max_salary - portfolio['Own'])) / 100) - ((max_salary - portfolio['salary']) / 100)
416
- portfolio['dupes_calc'] = portfolio['dupes_calc'] * dupes_multiplier * (portfolio['Own'] / (90 + (Contest_Size / 1000)))
417
- # Round and handle negative values
418
- portfolio['Dupes'] = np.where(
419
- portfolio['salary'] == max_salary,
420
- portfolio['dupes_calc'] + (portfolio['dupes_calc'] * .10),
421
- portfolio['dupes_calc']
422
- )
423
- portfolio['Dupes'] = np.where(
424
- np.round(portfolio['Dupes'], 0) <= 0,
425
- 0,
426
- np.round(portfolio['Dupes'], 0) - 1
427
- )
428
- else:
429
- num_players = len([col for col in portfolio.columns if col not in ['salary', 'median', 'Own']])
430
- dup_count_columns = [f'player_{i}_percent_rank' for i in range(1, num_players + 1)]
431
- own_columns = [f'player_{i}_own' for i in range(1, num_players + 1)]
432
- calc_columns = ['own_product', 'own_average', 'own_sum', 'avg_own_rank', 'dupes_calc', 'low_own_count', 'Ref_Proj', 'Max_Proj', 'Min_Proj', 'Avg_Ref', 'own_ratio']
433
- # Get the original player columns (first num_players columns excluding salary, median, Own)
434
- player_columns = [col for col in portfolio.columns[:num_players] if col not in ['salary', 'median', 'Own']]
435
-
436
- for i in range(1, num_players + 1):
437
- portfolio[f'player_{i}_percent_rank'] = portfolio.iloc[:,i-1].map(maps_dict['own_percent_rank'])
438
- portfolio[f'player_{i}_own'] = portfolio.iloc[:,i-1].map(maps_dict['own_map']).astype('float32') / 100
439
-
440
- portfolio['own_product'] = (portfolio[own_columns].product(axis=1))
441
- portfolio['own_average'] = (portfolio['Own'].max() * .33) / 100
442
- portfolio['own_sum'] = portfolio[own_columns].sum(axis=1)
443
- portfolio['avg_own_rank'] = portfolio[dup_count_columns].mean(axis=1)
444
-
445
- portfolio['dupes_calc'] = (portfolio['own_product'] * portfolio['avg_own_rank']) * Contest_Size + ((portfolio['salary'] - (max_salary - portfolio['Own'])) / 100) - ((max_salary - portfolio['salary']) / 100)
446
- portfolio['dupes_calc'] = portfolio['dupes_calc'] * dupes_multiplier * (portfolio['Own'] / (90 + (Contest_Size / 1000)))
447
- # Round and handle negative values
448
- portfolio['Dupes'] = np.where(
449
- portfolio['salary'] == max_salary,
450
- portfolio['dupes_calc'] + (portfolio['dupes_calc'] * .10),
451
- portfolio['dupes_calc']
452
- )
453
- portfolio['Dupes'] = np.where(
454
- np.round(portfolio['Dupes'], 0) <= 0,
455
- 0,
456
- np.round(portfolio['Dupes'], 0) - 1
457
- )
458
 
459
 
460
  portfolio['Dupes'] = np.round(portfolio['Dupes'], 0)
 
118
  percentile_multiplier = 1.10
119
  max_ownership = max(maps_dict['own_map'].values()) / 100
120
  average_ownership = np.mean(list(maps_dict['own_map'].values())) / 100
 
 
 
 
 
 
 
121
 
122
+ if type_var == 'Showdown':
123
+ if sport_var == 'GOLF':
124
+ dup_count_columns = ['FLEX1_Own_percent_rank', 'FLEX2_Own_percent_rank', 'FLEX3_Own_percent_rank', 'FLEX4_Own_percent_rank', 'FLEX5_Own_percent_rank', 'FLEX6_Own_percent_rank']
125
+ own_columns = ['FLEX1_Own', 'FLEX2_Own', 'FLEX3_Own', 'FLEX4_Own', 'FLEX5_Own', 'FLEX6_Own']
126
+ else:
127
+ 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']
128
+ own_columns = ['CPT_Own', 'FLEX1_Own', 'FLEX2_Own', 'FLEX3_Own', 'FLEX4_Own', 'FLEX5_Own']
129
+ calc_columns = ['own_product', 'own_average', 'own_sum', 'avg_own_rank', 'dupes_calc', 'low_own_count', 'Ref_Proj', 'Max_Proj', 'Min_Proj', 'Avg_Ref', 'own_ratio']
130
+ # Get the original player columns (first 6 columns excluding salary, median, Own)
131
+ player_columns = [col for col in portfolio.columns[:6] if col not in ['salary', 'median', 'Own']]
132
+ n_rows = len(portfolio)
133
+
134
+ # Assign ranks back to individual columns using the same rank scale
135
+ if sport_var == 'GOLF':
136
+ flex_ownerships = pd.concat([
137
+ portfolio.iloc[:,1].map(maps_dict['own_map']),
138
+ portfolio.iloc[:,2].map(maps_dict['own_map']),
139
+ portfolio.iloc[:,3].map(maps_dict['own_map']),
140
+ portfolio.iloc[:,4].map(maps_dict['own_map']),
141
+ portfolio.iloc[:,5].map(maps_dict['own_map']),
142
+ portfolio.iloc[:,6].map(maps_dict['own_map'])
143
+ ])
144
+ flex_rank = flex_ownerships.rank(pct=True)
145
+
146
+ portfolio['FLEX1_Own_percent_rank'] = flex_rank.iloc[0:n_rows].values
147
+ portfolio['FLEX2_Own_percent_rank'] = flex_rank.iloc[n_rows:2*n_rows].values
148
+ portfolio['FLEX3_Own_percent_rank'] = flex_rank.iloc[2*n_rows:3*n_rows].values
149
+ portfolio['FLEX4_Own_percent_rank'] = flex_rank.iloc[3*n_rows:4*n_rows].values
150
+ portfolio['FLEX5_Own_percent_rank'] = flex_rank.iloc[4*n_rows:5*n_rows].values
151
+ portfolio['FLEX6_Own_percent_rank'] = flex_rank.iloc[5*n_rows:6*n_rows].values
152
 
153
+ portfolio['FLEX1_Own'] = portfolio.iloc[:,0].map(maps_dict['own_map']).astype('float32') / 100
154
+ portfolio['FLEX2_Own'] = portfolio.iloc[:,1].map(maps_dict['own_map']).astype('float32') / 100
155
+ portfolio['FLEX3_Own'] = portfolio.iloc[:,2].map(maps_dict['own_map']).astype('float32') / 100
156
+ portfolio['FLEX4_Own'] = portfolio.iloc[:,3].map(maps_dict['own_map']).astype('float32') / 100
157
+ portfolio['FLEX5_Own'] = portfolio.iloc[:,4].map(maps_dict['own_map']).astype('float32') / 100
158
+ portfolio['FLEX6_Own'] = portfolio.iloc[:,5].map(maps_dict['own_map']).astype('float32') / 100
159
+ else:
160
  flex_ownerships = pd.concat([
161
  portfolio.iloc[:,1].map(maps_dict['own_map']),
162
  portfolio.iloc[:,2].map(maps_dict['own_map']),
 
166
  ])
167
  flex_rank = flex_ownerships.rank(pct=True)
168
 
169
+ portfolio['CPT_Own_percent_rank'] = portfolio.iloc[:,0].map(maps_dict['cpt_own_map']).rank(pct=True)
170
+ portfolio['FLEX1_Own_percent_rank'] = flex_rank.iloc[0:n_rows].values
171
+ portfolio['FLEX2_Own_percent_rank'] = flex_rank.iloc[n_rows:2*n_rows].values
172
+ portfolio['FLEX3_Own_percent_rank'] = flex_rank.iloc[2*n_rows:3*n_rows].values
173
+ portfolio['FLEX4_Own_percent_rank'] = flex_rank.iloc[3*n_rows:4*n_rows].values
174
+ portfolio['FLEX5_Own_percent_rank'] = flex_rank.iloc[4*n_rows:5*n_rows].values
175
+
176
+ portfolio['CPT_Own'] = portfolio.iloc[:,0].map(maps_dict['cpt_own_map']).astype('float32') / 100
177
+ portfolio['FLEX1_Own'] = portfolio.iloc[:,1].map(maps_dict['own_map']).astype('float32') / 100
178
+ portfolio['FLEX2_Own'] = portfolio.iloc[:,2].map(maps_dict['own_map']).astype('float32') / 100
179
+ portfolio['FLEX3_Own'] = portfolio.iloc[:,3].map(maps_dict['own_map']).astype('float32') / 100
180
+ portfolio['FLEX4_Own'] = portfolio.iloc[:,4].map(maps_dict['own_map']).astype('float32') / 100
181
+ portfolio['FLEX5_Own'] = portfolio.iloc[:,5].map(maps_dict['own_map']).astype('float32') / 100
182
+
183
+ portfolio['own_product'] = (portfolio[own_columns].product(axis=1))
184
+ portfolio['own_average'] = (portfolio['Own'].max() * .33) / 100
185
+ portfolio['own_sum'] = portfolio[own_columns].sum(axis=1)
186
+ portfolio['avg_own_rank'] = portfolio[dup_count_columns].mean(axis=1)
187
+
188
+ # Calculate dupes formula
189
+ portfolio['dupes_calc'] = (portfolio['own_product'] * portfolio['avg_own_rank']) * Contest_Size + ((portfolio['salary'] - (max_salary - portfolio['Own'])) / 100) - ((max_salary - portfolio['salary']) / 100)
190
+ portfolio['dupes_calc'] = portfolio['dupes_calc'] * dupes_multiplier * (portfolio['Own'] / (120 + (Contest_Size / 1000)))
191
+
192
+ # Round and handle negative values
193
+ portfolio['Dupes'] = np.where(
194
+ portfolio['salary'] == max_salary,
195
+ portfolio['dupes_calc'] + (portfolio['dupes_calc'] * .10),
196
+ portfolio['dupes_calc']
197
+ )
198
+ portfolio['Dupes'] = np.where(
199
+ np.round(portfolio['Dupes'], 0) <= 0,
200
+ 0,
201
+ np.round(portfolio['Dupes'], 0) - 1
202
+ )
203
+ elif type_var == 'Classic':
204
+ if sport_var == 'CS2':
205
+ 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']
206
+ own_columns = ['CPT_Own', 'FLEX1_Own', 'FLEX2_Own', 'FLEX3_Own', 'FLEX4_Own', 'FLEX5_Own']
207
+ calc_columns = ['own_product', 'own_average', 'own_sum', 'avg_own_rank', 'dupes_calc', 'low_own_count', 'Ref_Proj', 'Max_Proj', 'Min_Proj', 'Avg_Ref', 'own_ratio']
208
+ # Get the original player columns (first 6 columns excluding salary, median, Own)
209
+ player_columns = [col for col in portfolio.columns[:6] if col not in ['salary', 'median', 'Own']]
210
+
211
+ n_rows = len(portfolio)
212
+
213
+ flex_ownerships = pd.concat([
214
+ portfolio.iloc[:,1].map(maps_dict['own_map']),
215
+ portfolio.iloc[:,2].map(maps_dict['own_map']),
216
+ portfolio.iloc[:,3].map(maps_dict['own_map']),
217
+ portfolio.iloc[:,4].map(maps_dict['own_map']),
218
+ portfolio.iloc[:,5].map(maps_dict['own_map'])
219
+ ])
220
+ flex_rank = flex_ownerships.rank(pct=True)
221
+
222
  # Assign ranks back to individual columns using the same rank scale
223
  portfolio['CPT_Own_percent_rank'] = portfolio.iloc[:,0].map(maps_dict['cpt_own_map']).rank(pct=True)
224
  portfolio['FLEX1_Own_percent_rank'] = flex_rank.iloc[0:n_rows].values
 
233
  portfolio['FLEX3_Own'] = portfolio.iloc[:,3].map(maps_dict['own_map']).astype('float32') / 100
234
  portfolio['FLEX4_Own'] = portfolio.iloc[:,4].map(maps_dict['own_map']).astype('float32') / 100
235
  portfolio['FLEX5_Own'] = portfolio.iloc[:,5].map(maps_dict['own_map']).astype('float32') / 100
236
+
237
  portfolio['own_product'] = (portfolio[own_columns].product(axis=1)) * max(Contest_Size / 10000, 1)
238
  portfolio['own_average'] = (portfolio['Own'].max() * .33) / 100
239
  portfolio['own_sum'] = portfolio[own_columns].sum(axis=1)
240
  portfolio['avg_own_rank'] = portfolio[dup_count_columns].mean(axis=1)
241
 
242
  # Calculate dupes formula
243
+ portfolio['dupes_calc'] = ((portfolio['own_product'] * 10) * portfolio['avg_own_rank']) * Contest_Size + ((portfolio['salary'] - (max_salary - portfolio['Own'])) / 50) - ((max_salary - portfolio['salary']) / 50)
244
  portfolio['dupes_calc'] = portfolio['dupes_calc'] * dupes_multiplier * (portfolio['Own'] / (90 + (Contest_Size / 1000)))
245
+
246
+ # Round and handle negative values
247
+ portfolio['Dupes'] = np.where(
248
+ portfolio['salary'] == max_salary,
249
+ portfolio['dupes_calc'] + (portfolio['dupes_calc'] * .10),
250
+ portfolio['dupes_calc']
251
+ )
252
+ portfolio['Dupes'] = np.where(
253
+ np.round(portfolio['Dupes'], 0) <= 0,
254
+ 0,
255
+ np.round(portfolio['Dupes'], 0) - 1
256
+ )
257
+ if sport_var == 'LOL':
258
+ dup_count_columns = ['CPT_Own_percent_rank', 'TOP_Own_percent_rank', 'JNG_Own_percent_rank', 'MID_Own_percent_rank', 'ADC_Own_percent_rank', 'SUP_Own_percent_rank', 'Team_Own_percent_rank']
259
+ own_columns = ['CPT_Own', 'TOP_Own', 'JNG_Own', 'MID_Own', 'ADC_Own', 'SUP_Own', 'Team_Own']
260
+ calc_columns = ['own_product', 'own_average', 'own_sum', 'avg_own_rank', 'dupes_calc', 'low_own_count', 'Ref_Proj', 'Max_Proj', 'Min_Proj', 'Avg_Ref', 'own_ratio']
261
+ # Get the original player columns (first 6 columns excluding salary, median, Own)
262
+ player_columns = [col for col in portfolio.columns[:7] if col not in ['salary', 'median', 'Own']]
263
+
264
+ n_rows = len(portfolio)
265
+
266
+ flex_ownerships = pd.concat([
267
+ portfolio.iloc[:,1].map(maps_dict['own_map']),
268
+ portfolio.iloc[:,2].map(maps_dict['own_map']),
269
+ portfolio.iloc[:,3].map(maps_dict['own_map']),
270
+ portfolio.iloc[:,4].map(maps_dict['own_map']),
271
+ portfolio.iloc[:,5].map(maps_dict['own_map']),
272
+ portfolio.iloc[:,6].map(maps_dict['own_map'])
273
+ ])
274
+ flex_rank = flex_ownerships.rank(pct=True)
275
 
276
+ # Assign ranks back to individual columns using the same rank scale
277
+ portfolio['CPT_Own_percent_rank'] = portfolio.iloc[:,0].map(maps_dict['cpt_own_map']).rank(pct=True)
278
+ portfolio['TOP_Own_percent_rank'] = flex_rank.iloc[0:n_rows].values
279
+ portfolio['JNG_Own_percent_rank'] = flex_rank.iloc[n_rows:2*n_rows].values
280
+ portfolio['MID_Own_percent_rank'] = flex_rank.iloc[2*n_rows:3*n_rows].values
281
+ portfolio['ADC_Own_percent_rank'] = flex_rank.iloc[3*n_rows:4*n_rows].values
282
+ portfolio['SUP_Own_percent_rank'] = flex_rank.iloc[4*n_rows:5*n_rows].values
283
+ portfolio['Team_Own_percent_rank'] = flex_rank.iloc[5*n_rows:6*n_rows].values
284
+
285
+ portfolio['CPT_Own'] = portfolio.iloc[:,0].map(maps_dict['cpt_own_map']).astype('float32') / 100
286
+ portfolio['TOP_Own'] = portfolio.iloc[:,1].map(maps_dict['own_map']).astype('float32') / 100
287
+ portfolio['JNG_Own'] = portfolio.iloc[:,2].map(maps_dict['own_map']).astype('float32') / 100
288
+ portfolio['MID_Own'] = portfolio.iloc[:,3].map(maps_dict['own_map']).astype('float32') / 100
289
+ portfolio['ADC_Own'] = portfolio.iloc[:,4].map(maps_dict['own_map']).astype('float32') / 100
290
+ portfolio['SUP_Own'] = portfolio.iloc[:,5].map(maps_dict['own_map']).astype('float32') / 100
291
+ portfolio['Team_Own'] = portfolio.iloc[:,6].map(maps_dict['own_map']).astype('float32') / 100
292
+
293
+ portfolio['own_product'] = (portfolio[own_columns].product(axis=1)) * max(Contest_Size / 10000, 1)
294
+ portfolio['own_average'] = (portfolio['Own'].max() * .33) / 100
295
+ portfolio['own_sum'] = portfolio[own_columns].sum(axis=1)
296
+ portfolio['avg_own_rank'] = portfolio[dup_count_columns].mean(axis=1)
297
+
298
+ # Calculate dupes formula
299
+ portfolio['dupes_calc'] = ((portfolio['own_product'] * 10) * portfolio['avg_own_rank']) * Contest_Size + ((portfolio['salary'] - (max_salary - portfolio['Own'])) / 50) - ((max_salary - portfolio['salary']) / 50)
300
+ portfolio['dupes_calc'] = portfolio['dupes_calc'] * dupes_multiplier * (portfolio['Own'] / (90 + (Contest_Size / 1000)))
301
+
302
  # Round and handle negative values
303
  portfolio['Dupes'] = np.where(
304
  portfolio['salary'] == max_salary,
 
310
  0,
311
  np.round(portfolio['Dupes'], 0) - 1
312
  )
313
+ elif sport_var == 'GOLF':
314
  num_players = len([col for col in portfolio.columns if col not in ['salary', 'median', 'Own']])
315
  dup_count_columns = [f'player_{i}_percent_rank' for i in range(1, num_players + 1)]
316
  own_columns = [f'player_{i}_own' for i in range(1, num_players + 1)]
317
+ calc_columns = ['own_product', 'own_average', 'own_sum', 'avg_own_rank', 'dupes_calc', 'low_own_count', 'Ref_Proj', 'Max_Proj', 'Min_Proj', 'Avg_Ref', 'own_ratio']
318
  # Get the original player columns (first num_players columns excluding salary, median, Own)
319
  player_columns = [col for col in portfolio.columns[:num_players] if col not in ['salary', 'median', 'Own']]
320
 
 
340
  0,
341
  np.round(portfolio['Dupes'], 0) - 1
342
  )
343
+ else:
344
+ num_players = len([col for col in portfolio.columns if col not in ['salary', 'median', 'Own']])
345
+ dup_count_columns = [f'player_{i}_percent_rank' for i in range(1, num_players + 1)]
346
+ own_columns = [f'player_{i}_own' for i in range(1, num_players + 1)]
 
 
 
 
 
347
  calc_columns = ['own_product', 'own_average', 'own_sum', 'avg_own_rank', 'dupes_calc', 'low_own_count', 'Ref_Proj', 'Max_Proj', 'Min_Proj', 'Avg_Ref', 'own_ratio']
348
+ # Get the original player columns (first num_players columns excluding salary, median, Own)
349
+ player_columns = [col for col in portfolio.columns[:num_players] if col not in ['salary', 'median', 'Own']]
350
+
351
+ for i in range(1, num_players + 1):
352
+ portfolio[f'player_{i}_percent_rank'] = portfolio.iloc[:,i-1].map(maps_dict['own_percent_rank'])
353
+ portfolio[f'player_{i}_own'] = portfolio.iloc[:,i-1].map(maps_dict['own_map']).astype('float32') / 100
354
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
355
  portfolio['own_product'] = (portfolio[own_columns].product(axis=1))
356
  portfolio['own_average'] = (portfolio['Own'].max() * .33) / 100
357
  portfolio['own_sum'] = portfolio[own_columns].sum(axis=1)
358
  portfolio['avg_own_rank'] = portfolio[dup_count_columns].mean(axis=1)
359
 
 
360
  portfolio['dupes_calc'] = (portfolio['own_product'] * portfolio['avg_own_rank']) * Contest_Size + ((portfolio['salary'] - (max_salary - portfolio['Own'])) / 100) - ((max_salary - portfolio['salary']) / 100)
361
+ portfolio['dupes_calc'] = portfolio['dupes_calc'] * dupes_multiplier * (portfolio['Own'] / (90 + (Contest_Size / 1000)))
 
362
  # Round and handle negative values
363
  portfolio['Dupes'] = np.where(
364
  portfolio['salary'] == max_salary,
 
370
  0,
371
  np.round(portfolio['Dupes'], 0) - 1
372
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
373
 
374
 
375
  portfolio['Dupes'] = np.round(portfolio['Dupes'], 0)