James McCool commited on
Commit
c58a9f3
·
1 Parent(s): 0eef2b8

Add ownership percent rank calculations and dupes logic for FanDuel and DraftKings in app.py

Browse files

This commit introduces new columns for percent rank ownership at each roster position and implements a dupes calculation based on ownership metrics for both FanDuel and DraftKings. The changes enhance the simulation's accuracy by providing a more detailed analysis of player ownership and potential duplicates in contest lineups, improving overall data handling for contest simulations.

Files changed (1) hide show
  1. app.py +43 -0
app.py CHANGED
@@ -550,6 +550,49 @@ with tab1:
550
  Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=column_names + ['Fantasy'])
551
  Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['proj'] + Sim_Winner_Frame['Fantasy']) / 2
552
  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)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
553
  Sim_Winner_Frame = Sim_Winner_Frame.assign(win_count=Sim_Winner_Frame['unique_id'].map(Sim_Winner_Frame['unique_id'].value_counts()))
554
 
555
  # Type Casting
 
550
  Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=column_names + ['Fantasy'])
551
  Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['proj'] + Sim_Winner_Frame['Fantasy']) / 2
552
  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)
553
+ # Add percent rank columns for ownership at each roster position
554
+ 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']
555
+ Sim_Winner_Frame['CPT_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,0].map(maps_dict['Own_map']).rank(pct=True)
556
+ Sim_Winner_Frame['FLEX1_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,1].map(maps_dict['Own_map']).rank(pct=True)
557
+ Sim_Winner_Frame['FLEX2_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,2].map(maps_dict['Own_map']).rank(pct=True)
558
+ Sim_Winner_Frame['FLEX3_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,3].map(maps_dict['Own_map']).rank(pct=True)
559
+ Sim_Winner_Frame['FLEX4_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,4].map(maps_dict['Own_map']).rank(pct=True)
560
+ Sim_Winner_Frame['FLEX5_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,5].map(maps_dict['Own_map']).rank(pct=True)
561
+ # Calculate Dupes column for Fanduel
562
+ if sim_site_var1 == 'Fanduel':
563
+ # Calculate ownership product and convert to probability
564
+ own_product = (Sim_Winner_Frame['Own'].product() / 100) + 0.0001
565
+
566
+ # Calculate average of ownership percent rank columns
567
+ avg_own_rank = Sim_Winner_Frame[dup_count_columns].mean(axis=1)
568
+
569
+ # Calculate dupes formula
570
+ dupes_calc = (own_product * avg_own_rank * Contest_Size) + ((Sim_Winner_Frame['salary'] - 59800) / 100)
571
+
572
+ # Round and handle negative values
573
+ Sim_Winner_Frame['Dupes'] = np.where(
574
+ np.round(dupes_calc, 0) <= 0,
575
+ 0,
576
+ np.round(dupes_calc, 0) - 1
577
+ )
578
+ elif sim_site_var1 == 'Draftkings':
579
+ # Calculate ownership product and convert to probability
580
+ own_product = (Sim_Winner_Frame['Own'].product() / 100)
581
+
582
+ # Calculate average of ownership percent rank columns
583
+ avg_own_rank = Sim_Winner_Frame[dup_count_columns].mean(axis=1)
584
+
585
+ # Calculate dupes formula
586
+ dupes_calc = (own_product * avg_own_rank * Contest_Size) + ((Sim_Winner_Frame['salary'] - 49800) / 100)
587
+
588
+ # Round and handle negative values
589
+ Sim_Winner_Frame['Dupes'] = np.where(
590
+ np.round(dupes_calc, 0) <= 0,
591
+ 0,
592
+ np.round(dupes_calc, 0) - 1
593
+ )
594
+ Sim_Winner_Frame = Sim_Winner_Frame.drop(columns=dup_count_columns)
595
+
596
  Sim_Winner_Frame = Sim_Winner_Frame.assign(win_count=Sim_Winner_Frame['unique_id'].map(Sim_Winner_Frame['unique_id'].value_counts()))
597
 
598
  # Type Casting