James McCool commited on
Commit
690e673
·
1 Parent(s): 1165007

Enhance duplicate prediction logic in predict_dupes.py by introducing 'own_rank_percentile' calculation. This addition improves the accuracy of the dupes calculation by factoring in player ownership rankings, ensuring more precise predictions across different contest types.

Browse files
Files changed (1) hide show
  1. global_func/predict_dupes.py +19 -12
global_func/predict_dupes.py CHANGED
@@ -295,7 +295,7 @@ def predict_dupes(portfolio, maps_dict, site_var, type_var, Contest_Size, streng
295
  if type_var == 'Showdown':
296
  dup_count_columns = ['CPT_Own_percent_rank', 'FLEX1_Own_percent_rank', 'FLEX2_Own_percent_rank', 'FLEX3_Own_percent_rank', 'FLEX4_Own_percent_rank']
297
  own_columns = ['CPT_Own', 'FLEX1_Own', 'FLEX2_Own', 'FLEX3_Own', 'FLEX4_Own']
298
- 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']
299
  # Get the original player columns (first 5 columns excluding salary, median, Own)
300
  player_columns = [col for col in portfolio.columns[:5] if col not in ['salary', 'median', 'Own']]
301
 
@@ -326,6 +326,7 @@ def predict_dupes(portfolio, maps_dict, site_var, type_var, Contest_Size, streng
326
  portfolio['own_average'] = (portfolio['Own'].max() * .33) / 100
327
  portfolio['own_sum'] = portfolio[own_columns].sum(axis=1)
328
  portfolio['avg_own_rank'] = portfolio[dup_count_columns].mean(axis=1)
 
329
 
330
  # Calculate dupes formula
331
  portfolio['dupes_calc'] = (portfolio['own_product'] * portfolio['avg_own_rank']) * (portfolio['Own'] / 100) * Contest_Size + ((portfolio['salary'] - (60000 - portfolio['Own'])) / 100) - ((60000 - portfolio['salary']) / 100)
@@ -335,13 +336,14 @@ def predict_dupes(portfolio, maps_dict, site_var, type_var, Contest_Size, streng
335
  portfolio['Dupes'] = np.where(
336
  np.round(portfolio['dupes_calc'], 0) <= 0,
337
  0,
338
- np.round(portfolio['dupes_calc'], 0) - 1
339
  )
 
340
  elif type_var == 'Classic':
341
  num_players = len([col for col in portfolio.columns if col not in ['salary', 'median', 'Own']])
342
  dup_count_columns = [f'player_{i}_percent_rank' for i in range(1, num_players + 1)]
343
  own_columns = [f'player_{i}_own' for i in range(1, num_players + 1)]
344
- 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']
345
  # Get the original player columns (first num_players columns excluding salary, median, Own)
346
  player_columns = [col for col in portfolio.columns[:num_players] if col not in ['salary', 'median', 'Own']]
347
 
@@ -353,6 +355,7 @@ def predict_dupes(portfolio, maps_dict, site_var, type_var, Contest_Size, streng
353
  portfolio['own_average'] = (portfolio['Own'].max() * .33) / 100
354
  portfolio['own_sum'] = portfolio[own_columns].sum(axis=1)
355
  portfolio['avg_own_rank'] = portfolio[dup_count_columns].mean(axis=1)
 
356
 
357
  portfolio['dupes_calc'] = (portfolio['own_product'] * portfolio['avg_own_rank']) * Contest_Size + ((portfolio['salary'] - (60000 - portfolio['Own'])) / 100) - ((60000 - portfolio['salary']) / 100)
358
  portfolio['dupes_calc'] = portfolio['dupes_calc'] * dupes_multiplier * (portfolio['Own'] / (100 + (Contest_Size / 1000)))
@@ -360,7 +363,7 @@ def predict_dupes(portfolio, maps_dict, site_var, type_var, Contest_Size, streng
360
  portfolio['Dupes'] = np.where(
361
  np.round(portfolio['dupes_calc'], 0) <= 0,
362
  0,
363
- np.round(portfolio['dupes_calc'], 0) - 1
364
  )
365
 
366
  elif site_var == 'Draftkings':
@@ -371,7 +374,7 @@ def predict_dupes(portfolio, maps_dict, site_var, type_var, Contest_Size, streng
371
  else:
372
  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']
373
  own_columns = ['CPT_Own', 'FLEX1_Own', 'FLEX2_Own', 'FLEX3_Own', 'FLEX4_Own', 'FLEX5_Own']
374
- 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']
375
  # Get the original player columns (first 6 columns excluding salary, median, Own)
376
  player_columns = [col for col in portfolio.columns[:6] if col not in ['salary', 'median', 'Own']]
377
  if sport_var == 'GOLF':
@@ -427,6 +430,7 @@ def predict_dupes(portfolio, maps_dict, site_var, type_var, Contest_Size, streng
427
  portfolio['own_average'] = (portfolio['Own'].max() * .33) / 100
428
  portfolio['own_sum'] = portfolio[own_columns].sum(axis=1)
429
  portfolio['avg_own_rank'] = portfolio[dup_count_columns].mean(axis=1)
 
430
 
431
  # Calculate dupes formula
432
  portfolio['dupes_calc'] = (portfolio['own_product'] * portfolio['avg_own_rank']) * Contest_Size + ((portfolio['salary'] - (50000 - portfolio['Own'])) / 100) - ((50000 - portfolio['salary']) / 100)
@@ -436,13 +440,13 @@ def predict_dupes(portfolio, maps_dict, site_var, type_var, Contest_Size, streng
436
  portfolio['Dupes'] = np.where(
437
  np.round(portfolio['dupes_calc'], 0) <= 0,
438
  0,
439
- np.round(portfolio['dupes_calc'], 0) - 1
440
  )
441
  elif type_var == 'Classic':
442
  if sport_var == 'CS2':
443
  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']
444
  own_columns = ['CPT_Own', 'FLEX1_Own', 'FLEX2_Own', 'FLEX3_Own', 'FLEX4_Own', 'FLEX5_Own']
445
- 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']
446
  # Get the original player columns (first 6 columns excluding salary, median, Own)
447
  player_columns = [col for col in portfolio.columns[:6] if col not in ['salary', 'median', 'Own']]
448
 
@@ -474,6 +478,7 @@ def predict_dupes(portfolio, maps_dict, site_var, type_var, Contest_Size, streng
474
  portfolio['own_average'] = (portfolio['Own'].max() * .33) / 100
475
  portfolio['own_sum'] = portfolio[own_columns].sum(axis=1)
476
  portfolio['avg_own_rank'] = portfolio[dup_count_columns].mean(axis=1)
 
477
 
478
  # Calculate dupes formula
479
  portfolio['dupes_calc'] = ((portfolio['own_product'] * 10) * portfolio['avg_own_rank']) * Contest_Size + ((portfolio['salary'] - (50000 - portfolio['Own'])) / 50) - ((50000 - portfolio['salary']) / 50)
@@ -483,12 +488,12 @@ def predict_dupes(portfolio, maps_dict, site_var, type_var, Contest_Size, streng
483
  portfolio['Dupes'] = np.where(
484
  np.round(portfolio['dupes_calc'], 0) <= 0,
485
  0,
486
- np.round(portfolio['dupes_calc'], 0) - 1
487
  )
488
  if sport_var == 'LOL':
489
  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']
490
  own_columns = ['CPT_Own', 'TOP_Own', 'JNG_Own', 'MID_Own', 'ADC_Own', 'SUP_Own', 'Team_Own']
491
- 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']
492
  # Get the original player columns (first 6 columns excluding salary, median, Own)
493
  player_columns = [col for col in portfolio.columns[:7] if col not in ['salary', 'median', 'Own']]
494
 
@@ -523,6 +528,7 @@ def predict_dupes(portfolio, maps_dict, site_var, type_var, Contest_Size, streng
523
  portfolio['own_average'] = (portfolio['Own'].max() * .33) / 100
524
  portfolio['own_sum'] = portfolio[own_columns].sum(axis=1)
525
  portfolio['avg_own_rank'] = portfolio[dup_count_columns].mean(axis=1)
 
526
 
527
  # Calculate dupes formula
528
  portfolio['dupes_calc'] = ((portfolio['own_product'] * 10) * portfolio['avg_own_rank']) * Contest_Size + ((portfolio['salary'] - (50000 - portfolio['Own'])) / 50) - ((50000 - portfolio['salary']) / 50)
@@ -532,13 +538,13 @@ def predict_dupes(portfolio, maps_dict, site_var, type_var, Contest_Size, streng
532
  portfolio['Dupes'] = np.where(
533
  np.round(portfolio['dupes_calc'], 0) <= 0,
534
  0,
535
- np.round(portfolio['dupes_calc'], 0) - 1
536
  )
537
  elif sport_var != 'CS2' and sport_var != 'LOL':
538
  num_players = len([col for col in portfolio.columns if col not in ['salary', 'median', 'Own']])
539
  dup_count_columns = [f'player_{i}_percent_rank' for i in range(1, num_players + 1)]
540
  own_columns = [f'player_{i}_own' for i in range(1, num_players + 1)]
541
- 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']
542
  # Get the original player columns (first num_players columns excluding salary, median, Own)
543
  player_columns = [col for col in portfolio.columns[:num_players] if col not in ['salary', 'median', 'Own']]
544
 
@@ -550,6 +556,7 @@ def predict_dupes(portfolio, maps_dict, site_var, type_var, Contest_Size, streng
550
  portfolio['own_average'] = (portfolio['Own'].max() * .33) / 100
551
  portfolio['own_sum'] = portfolio[own_columns].sum(axis=1)
552
  portfolio['avg_own_rank'] = portfolio[dup_count_columns].mean(axis=1)
 
553
 
554
  portfolio['dupes_calc'] = (portfolio['own_product'] * portfolio['avg_own_rank']) * Contest_Size + ((portfolio['salary'] - (50000 - portfolio['Own'])) / 100) - ((50000 - portfolio['salary']) / 100)
555
  portfolio['dupes_calc'] = portfolio['dupes_calc'] * dupes_multiplier * (portfolio['Own'] / (100 + (Contest_Size / 1000)))
@@ -557,7 +564,7 @@ def predict_dupes(portfolio, maps_dict, site_var, type_var, Contest_Size, streng
557
  portfolio['Dupes'] = np.where(
558
  np.round(portfolio['dupes_calc'], 0) <= 0,
559
  0,
560
- np.round(portfolio['dupes_calc'], 0) - 1
561
  )
562
 
563
  portfolio['Dupes'] = np.round(portfolio['Dupes'], 0)
 
295
  if type_var == 'Showdown':
296
  dup_count_columns = ['CPT_Own_percent_rank', 'FLEX1_Own_percent_rank', 'FLEX2_Own_percent_rank', 'FLEX3_Own_percent_rank', 'FLEX4_Own_percent_rank']
297
  own_columns = ['CPT_Own', 'FLEX1_Own', 'FLEX2_Own', 'FLEX3_Own', 'FLEX4_Own']
298
+ calc_columns = ['own_product', 'own_average', 'own_sum', 'avg_own_rank', 'own_rank_percentile', 'dupes_calc', 'low_own_count', 'own_ratio', 'Ref_Proj', 'Max_Proj', 'Min_Proj', 'Avg_Ref', 'own_ratio']
299
  # Get the original player columns (first 5 columns excluding salary, median, Own)
300
  player_columns = [col for col in portfolio.columns[:5] if col not in ['salary', 'median', 'Own']]
301
 
 
326
  portfolio['own_average'] = (portfolio['Own'].max() * .33) / 100
327
  portfolio['own_sum'] = portfolio[own_columns].sum(axis=1)
328
  portfolio['avg_own_rank'] = portfolio[dup_count_columns].mean(axis=1)
329
+ portfolio['own_rank_percentile'] = portfolio[dup_count_columns].rank(pct=True)
330
 
331
  # Calculate dupes formula
332
  portfolio['dupes_calc'] = (portfolio['own_product'] * portfolio['avg_own_rank']) * (portfolio['Own'] / 100) * Contest_Size + ((portfolio['salary'] - (60000 - portfolio['Own'])) / 100) - ((60000 - portfolio['salary']) / 100)
 
336
  portfolio['Dupes'] = np.where(
337
  np.round(portfolio['dupes_calc'], 0) <= 0,
338
  0,
339
+ np.round((portfolio['dupes_calc'] * (1 + portfolio['own_rank_percentile'])), 0) - 1
340
  )
341
+
342
  elif type_var == 'Classic':
343
  num_players = len([col for col in portfolio.columns if col not in ['salary', 'median', 'Own']])
344
  dup_count_columns = [f'player_{i}_percent_rank' for i in range(1, num_players + 1)]
345
  own_columns = [f'player_{i}_own' for i in range(1, num_players + 1)]
346
+ calc_columns = ['own_product', 'own_average', 'own_sum', 'avg_own_rank', 'own_rank_percentile', 'dupes_calc', 'low_own_count', 'own_ratio', 'Ref_Proj', 'Max_Proj', 'Min_Proj', 'Avg_Ref', 'own_ratio']
347
  # Get the original player columns (first num_players columns excluding salary, median, Own)
348
  player_columns = [col for col in portfolio.columns[:num_players] if col not in ['salary', 'median', 'Own']]
349
 
 
355
  portfolio['own_average'] = (portfolio['Own'].max() * .33) / 100
356
  portfolio['own_sum'] = portfolio[own_columns].sum(axis=1)
357
  portfolio['avg_own_rank'] = portfolio[dup_count_columns].mean(axis=1)
358
+ portfolio['own_rank_percentile'] = portfolio[dup_count_columns].rank(pct=True)
359
 
360
  portfolio['dupes_calc'] = (portfolio['own_product'] * portfolio['avg_own_rank']) * Contest_Size + ((portfolio['salary'] - (60000 - portfolio['Own'])) / 100) - ((60000 - portfolio['salary']) / 100)
361
  portfolio['dupes_calc'] = portfolio['dupes_calc'] * dupes_multiplier * (portfolio['Own'] / (100 + (Contest_Size / 1000)))
 
363
  portfolio['Dupes'] = np.where(
364
  np.round(portfolio['dupes_calc'], 0) <= 0,
365
  0,
366
+ np.round((portfolio['dupes_calc'] * (1 + portfolio['own_rank_percentile'])), 0) - 1
367
  )
368
 
369
  elif site_var == 'Draftkings':
 
374
  else:
375
  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']
376
  own_columns = ['CPT_Own', 'FLEX1_Own', 'FLEX2_Own', 'FLEX3_Own', 'FLEX4_Own', 'FLEX5_Own']
377
+ calc_columns = ['own_product', 'own_average', 'own_sum', 'avg_own_rank', 'own_rank_percentile', 'dupes_calc', 'low_own_count', 'Ref_Proj', 'Max_Proj', 'Min_Proj', 'Avg_Ref', 'own_ratio']
378
  # Get the original player columns (first 6 columns excluding salary, median, Own)
379
  player_columns = [col for col in portfolio.columns[:6] if col not in ['salary', 'median', 'Own']]
380
  if sport_var == 'GOLF':
 
430
  portfolio['own_average'] = (portfolio['Own'].max() * .33) / 100
431
  portfolio['own_sum'] = portfolio[own_columns].sum(axis=1)
432
  portfolio['avg_own_rank'] = portfolio[dup_count_columns].mean(axis=1)
433
+ portfolio['own_rank_percentile'] = portfolio[dup_count_columns].rank(pct=True)
434
 
435
  # Calculate dupes formula
436
  portfolio['dupes_calc'] = (portfolio['own_product'] * portfolio['avg_own_rank']) * Contest_Size + ((portfolio['salary'] - (50000 - portfolio['Own'])) / 100) - ((50000 - portfolio['salary']) / 100)
 
440
  portfolio['Dupes'] = np.where(
441
  np.round(portfolio['dupes_calc'], 0) <= 0,
442
  0,
443
+ np.round((portfolio['dupes_calc'] * (1 + portfolio['own_rank_percentile'])), 0) - 1
444
  )
445
  elif type_var == 'Classic':
446
  if sport_var == 'CS2':
447
  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']
448
  own_columns = ['CPT_Own', 'FLEX1_Own', 'FLEX2_Own', 'FLEX3_Own', 'FLEX4_Own', 'FLEX5_Own']
449
+ calc_columns = ['own_product', 'own_average', 'own_sum', 'avg_own_rank', 'own_rank_percentile', 'dupes_calc', 'low_own_count', 'Ref_Proj', 'Max_Proj', 'Min_Proj', 'Avg_Ref', 'own_ratio']
450
  # Get the original player columns (first 6 columns excluding salary, median, Own)
451
  player_columns = [col for col in portfolio.columns[:6] if col not in ['salary', 'median', 'Own']]
452
 
 
478
  portfolio['own_average'] = (portfolio['Own'].max() * .33) / 100
479
  portfolio['own_sum'] = portfolio[own_columns].sum(axis=1)
480
  portfolio['avg_own_rank'] = portfolio[dup_count_columns].mean(axis=1)
481
+ portfolio['own_rank_percentile'] = portfolio[dup_count_columns].rank(pct=True)
482
 
483
  # Calculate dupes formula
484
  portfolio['dupes_calc'] = ((portfolio['own_product'] * 10) * portfolio['avg_own_rank']) * Contest_Size + ((portfolio['salary'] - (50000 - portfolio['Own'])) / 50) - ((50000 - portfolio['salary']) / 50)
 
488
  portfolio['Dupes'] = np.where(
489
  np.round(portfolio['dupes_calc'], 0) <= 0,
490
  0,
491
+ np.round((portfolio['dupes_calc'] * (1 + portfolio['own_rank_percentile'])), 0) - 1
492
  )
493
  if sport_var == 'LOL':
494
  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']
495
  own_columns = ['CPT_Own', 'TOP_Own', 'JNG_Own', 'MID_Own', 'ADC_Own', 'SUP_Own', 'Team_Own']
496
+ calc_columns = ['own_product', 'own_average', 'own_sum', 'avg_own_rank', 'own_rank_percentile', 'dupes_calc', 'low_own_count', 'Ref_Proj', 'Max_Proj', 'Min_Proj', 'Avg_Ref', 'own_ratio']
497
  # Get the original player columns (first 6 columns excluding salary, median, Own)
498
  player_columns = [col for col in portfolio.columns[:7] if col not in ['salary', 'median', 'Own']]
499
 
 
528
  portfolio['own_average'] = (portfolio['Own'].max() * .33) / 100
529
  portfolio['own_sum'] = portfolio[own_columns].sum(axis=1)
530
  portfolio['avg_own_rank'] = portfolio[dup_count_columns].mean(axis=1)
531
+ portfolio['own_rank_percentile'] = portfolio[dup_count_columns].rank(pct=True)
532
 
533
  # Calculate dupes formula
534
  portfolio['dupes_calc'] = ((portfolio['own_product'] * 10) * portfolio['avg_own_rank']) * Contest_Size + ((portfolio['salary'] - (50000 - portfolio['Own'])) / 50) - ((50000 - portfolio['salary']) / 50)
 
538
  portfolio['Dupes'] = np.where(
539
  np.round(portfolio['dupes_calc'], 0) <= 0,
540
  0,
541
+ np.round((portfolio['dupes_calc'] * (1 + portfolio['own_rank_percentile'])), 0) - 1
542
  )
543
  elif sport_var != 'CS2' and sport_var != 'LOL':
544
  num_players = len([col for col in portfolio.columns if col not in ['salary', 'median', 'Own']])
545
  dup_count_columns = [f'player_{i}_percent_rank' for i in range(1, num_players + 1)]
546
  own_columns = [f'player_{i}_own' for i in range(1, num_players + 1)]
547
+ calc_columns = ['own_product', 'own_average', 'own_sum', 'avg_own_rank', 'own_rank_percentile', 'dupes_calc', 'low_own_count', 'Ref_Proj', 'Max_Proj', 'Min_Proj', 'Avg_Ref', 'own_ratio']
548
  # Get the original player columns (first num_players columns excluding salary, median, Own)
549
  player_columns = [col for col in portfolio.columns[:num_players] if col not in ['salary', 'median', 'Own']]
550
 
 
556
  portfolio['own_average'] = (portfolio['Own'].max() * .33) / 100
557
  portfolio['own_sum'] = portfolio[own_columns].sum(axis=1)
558
  portfolio['avg_own_rank'] = portfolio[dup_count_columns].mean(axis=1)
559
+ portfolio['own_rank_percentile'] = portfolio[dup_count_columns].rank(pct=True)
560
 
561
  portfolio['dupes_calc'] = (portfolio['own_product'] * portfolio['avg_own_rank']) * Contest_Size + ((portfolio['salary'] - (50000 - portfolio['Own'])) / 100) - ((50000 - portfolio['salary']) / 100)
562
  portfolio['dupes_calc'] = portfolio['dupes_calc'] * dupes_multiplier * (portfolio['Own'] / (100 + (Contest_Size / 1000)))
 
564
  portfolio['Dupes'] = np.where(
565
  np.round(portfolio['dupes_calc'], 0) <= 0,
566
  0,
567
+ np.round((portfolio['dupes_calc'] * (1 + portfolio['own_rank_percentile'])), 0) - 1
568
  )
569
 
570
  portfolio['Dupes'] = np.round(portfolio['Dupes'], 0)