Spaces:
Sleeping
Sleeping
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 filesThis 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.
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
|