James McCool
commited on
Commit
·
5481883
1
Parent(s):
144cddf
removing Fanduel specific logic from Predict Dupes
Browse files- app.py +5 -7
- 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 |
-
|
| 1300 |
-
|
| 1301 |
-
|
| 1302 |
-
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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'] *
|
| 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
|
| 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', '
|
| 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 |
-
|
| 207 |
-
|
| 208 |
-
|
| 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
|
| 216 |
-
player_columns = [col for col in portfolio.columns[:
|
| 217 |
-
|
|
|
|
|
|
|
|
|
|
| 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'] / (
|
| 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)
|