diff --git "a/app.py" "b/app.py" --- "a/app.py" +++ "b/app.py" @@ -89,210 +89,221 @@ with tab1: with col1: st.info(t_stamp) if st.button("Load/Reset Data", key='reset1'): - st.cache_data.clear() - player_stats, dk_stacks_raw, fd_stacks_raw, dk_roo_raw, fd_roo_raw, site_slates = player_stat_table() - t_stamp = f"Last Update: " + str(dk_roo_raw['timestamp'][0]) + f" CST" + st.cache_data.clear() + player_stats, dk_stacks_raw, fd_stacks_raw, dk_roo_raw, fd_roo_raw, site_slates = player_stat_table() + t_stamp = f"Last Update: " + str(dk_roo_raw['timestamp'][0]) + f" CST" slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate', 'Late Slate', 'Thurs-Mon Slate'), key='slate_var1') site_var1 = st.radio("What table would you like to display?", ('Draftkings', 'Fanduel'), key='site_var1') + view_var1 = st.radio("What view would you like to display?", ('Advanced', 'Simple'), key='view_var1') custom_var1 = st.radio("Are you creating a custom table?", ('No', 'Yes'), key='custom_var1') if custom_var1 == 'No': - if site_var1 == 'Draftkings': - raw_baselines = dk_stacks_raw[dk_stacks_raw['slate'] == str(slate_var1)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'overall'] - raw_baselines = raw_baselines.iloc[:,:-2] - elif site_var1 == 'Fanduel': - raw_baselines = fd_stacks_raw[fd_stacks_raw['slate'] == str(slate_var1)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'overall'] - raw_baselines = raw_baselines.iloc[:,:-2] - split_var1 = st.radio("Would you like to view the whole slate or just specific games?", ('Full Slate Run', 'Specific Games'), key='split_var1') - if split_var1 == 'Specific Games': - team_var1 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var1') - elif split_var1 == 'Full Slate Run': - team_var1 = raw_baselines.Team.values.tolist() + if site_var1 == 'Draftkings': + raw_baselines = dk_stacks_raw[dk_stacks_raw['slate'] == str(slate_var1)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'overall'] + raw_baselines = raw_baselines.iloc[:,:-2] + elif site_var1 == 'Fanduel': + raw_baselines = fd_stacks_raw[fd_stacks_raw['slate'] == str(slate_var1)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'overall'] + raw_baselines = raw_baselines.iloc[:,:-2] + split_var1 = st.radio("Would you like to view the whole slate or just specific games?", ('Full Slate Run', 'Specific Games'), key='split_var1') + if split_var1 == 'Specific Games': + team_var1 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var1') + elif split_var1 == 'Full Slate Run': + team_var1 = raw_baselines.Team.values.tolist() if custom_var1 == 'Yes': - contest_var1 = st.selectbox("What contest type are you running for?", ('Cash', 'Small Field GPP', 'Large Field GPP'), key='contest_var1') - if site_var1 == 'Draftkings': - raw_baselines = dk_stacks_raw[dk_stacks_raw['slate'] == str(slate_var1)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'overall'] - elif site_var1 == 'Fanduel': - raw_baselines = fd_stacks_raw[fd_stacks_raw['slate'] == str(slate_var1)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'overall'] - split_var1 = st.radio("Are you running the full slate or certain games?", ('Full Slate Run', 'Specific Games'), key='split_var1') - if split_var1 == 'Specific Games': - team_var1 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var1') - elif split_var1 == 'Full Slate Run': - team_var1 = raw_baselines.Team.values.tolist() + contest_var1 = st.selectbox("What contest type are you running for?", ('Cash', 'Small Field GPP', 'Large Field GPP'), key='contest_var1') + if site_var1 == 'Draftkings': + raw_baselines = dk_stacks_raw[dk_stacks_raw['slate'] == str(slate_var1)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'overall'] + elif site_var1 == 'Fanduel': + raw_baselines = fd_stacks_raw[fd_stacks_raw['slate'] == str(slate_var1)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'overall'] + split_var1 = st.radio("Are you running the full slate or certain games?", ('Full Slate Run', 'Specific Games'), key='split_var1') + if split_var1 == 'Specific Games': + team_var1 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var1') + elif split_var1 == 'Full Slate Run': + team_var1 = raw_baselines.Team.values.tolist() with col2: if custom_var1 == 'No': - final_stacks = raw_baselines[raw_baselines['Team'].isin(team_var1)] - st.dataframe(final_stacks.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True) - st.download_button( + final_stacks = raw_baselines[raw_baselines['Team'].isin(team_var1)] + if view_var1 == 'Simple': + final_stacks = final_stacks[['Team', 'QB', 'WR1_TE', 'WR2_TE', 'Salary', 'Median', '60+%', '4x%']] + elif view_var1 == 'Advanced': + final_stacks = final_stacks[['Team', 'QB', 'WR1_TE', 'WR2_TE', 'Total', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', + 'Top_10_finish', '60+%', '2x%', '3x%', '4x%', 'Own', 'LevX']] + st.dataframe(final_stacks.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True) + st.download_button( label="Export Tables", data=convert_df_to_csv(final_stacks), file_name='NFL_stacks_export.csv', mime='text/csv', - ) + ) elif custom_var1 == 'Yes': - hold_container = st.empty() - if st.button('Create Range of Outcomes for Slate'): - with hold_container: - if site_var1 == 'Draftkings': - working_roo = player_stats - working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "PPR": "Fantasy"}, inplace = True) - working_roo.replace('', 0, inplace=True) - if site_var1 == 'Fanduel': - working_roo = player_stats - working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "Half_PPR": "Fantasy"}, inplace = True) - working_roo.replace('', 0, inplace=True) - working_roo = working_roo[working_roo['Team'].isin(team_var1)] - - total_sims = 1000 - - salary_dict = dict(zip(working_roo.name, working_roo.Salary)) - own_dict = dict(zip(working_roo.name, working_roo.Own)) - fantasy_dict = dict(zip(working_roo.name, working_roo.Fantasy)) - - QB_group = working_roo.loc[working_roo['Position'] == 'QB'] - stacks_df = pd.DataFrame(columns=['Team','QB', 'WR1', 'WR2_TE']) - - for stack in range(0,len(QB_group)): - team_var = QB_group.iat[stack,1] - WR_group_1 = working_roo.loc[working_roo['Position'] == 'WR'] - WR_group_2 = WR_group_1.loc[working_roo['Team'] == team_var] - TE_group_1 = working_roo.loc[working_roo['Position'] == 'TE'] - TE_group_2 = TE_group_1.loc[working_roo['Team'] == team_var] - cur_list = [] - qb_piece = QB_group.iat[stack,0] - wr_piece = WR_group_2.iat[0,0] - te_piece = TE_group_2.iat[0,0] - cur_list.append(team_var) - cur_list.append(qb_piece) - cur_list.append(wr_piece) - cur_list.append(te_piece) - stacks_df.loc[len(stacks_df)] = cur_list - cur_list = [] - qb_piece = QB_group.iat[stack,0] - wr_piece = WR_group_2.iat[1,0] - te_piece = TE_group_2.iat[0,0] - cur_list.append(team_var) - cur_list.append(qb_piece) - cur_list.append(wr_piece) - cur_list.append(te_piece) - stacks_df.loc[len(stacks_df)] = cur_list - cur_list = [] - qb_piece = QB_group.iat[stack,0] - wr_piece = WR_group_2.iat[0,0] - te_piece = WR_group_2.iat[1,0] - cur_list.append(team_var) - cur_list.append(qb_piece) - cur_list.append(wr_piece) - cur_list.append(te_piece) - stacks_df.loc[len(stacks_df)] = cur_list - - stacks_df['Salary'] = sum([stacks_df['QB'].map(salary_dict), - stacks_df['WR1'].map(salary_dict), - stacks_df['WR2_TE'].map(salary_dict)]) - - stacks_df['Fantasy'] = sum([stacks_df['QB'].map(fantasy_dict), - stacks_df['WR1'].map(fantasy_dict), - stacks_df['WR2_TE'].map(fantasy_dict)]) - - stacks_df['Own'] = sum([stacks_df['QB'].map(own_dict), - stacks_df['WR1'].map(own_dict), - stacks_df['WR2_TE'].map(own_dict)]) - - stacks_df['team_combo'] = stacks_df['Team'] + " " + stacks_df['QB'] + " " + stacks_df['WR1'] + " " + stacks_df['WR2_TE'] - - own_dict = dict(zip(stacks_df.team_combo, stacks_df.Own)) - qb_dict = dict(zip(stacks_df.team_combo, stacks_df.QB)) - wr1_dict = dict(zip(stacks_df.team_combo, stacks_df.WR1)) - wr2_dict = dict(zip(stacks_df.team_combo, stacks_df.WR2_TE)) - team_dict = dict(zip(stacks_df.team_combo, stacks_df.Team)) - - flex_file = stacks_df[['team_combo', 'Salary', 'Fantasy']] - flex_file.rename(columns={"Fantasy": "Median"}, inplace = True) - flex_file['Floor'] = flex_file['Median']*.25 - flex_file['Ceiling'] = flex_file['Median'] + flex_file['Floor'] - flex_file['STD'] = flex_file['Median']/4 - flex_file = flex_file[['team_combo', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']] - hold_file = flex_file - overall_file = flex_file - salary_file = flex_file - - overall_players = overall_file[['team_combo']] - - for x in range(0,total_sims): - salary_file[x] = salary_file['Salary'] - - salary_file=salary_file.drop(['team_combo', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) - salary_file.astype('int').dtypes - - salary_file = salary_file.div(1000) - - for x in range(0,total_sims): - overall_file[x] = np.random.normal(overall_file['Median'],overall_file['STD']) - - overall_file=overall_file.drop(['team_combo', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) - overall_file.astype('int').dtypes - - players_only = hold_file[['team_combo']] - raw_lineups_file = players_only - - for x in range(0,total_sims): - maps_dict = {'proj_map':dict(zip(hold_file.team_combo,hold_file[x]))} - raw_lineups_file[x] = sum([raw_lineups_file['team_combo'].map(maps_dict['proj_map'])]) - players_only[x] = raw_lineups_file[x].rank(ascending=False) - - players_only=players_only.drop(['team_combo'], axis=1) - players_only.astype('int').dtypes - - salary_2x_check = (overall_file - (salary_file*2)) - salary_3x_check = (overall_file - (salary_file*3)) - salary_4x_check = (overall_file - (salary_file*4)) - - players_only['Average_Rank'] = players_only.mean(axis=1) - players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims - players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims - players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims - players_only['60+%'] = overall_file[overall_file >= 60].count(axis=1)/float(total_sims) - players_only['2x%'] = salary_2x_check[salary_2x_check >= 1].count(axis=1)/float(total_sims) - players_only['3x%'] = salary_3x_check[salary_3x_check >= 1].count(axis=1)/float(total_sims) - players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims) - - players_only['team_combo'] = hold_file[['team_combo']] - - final_outcomes = players_only[['team_combo', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '60+%', '2x%', '3x%', '4x%']] - - final_stacks = pd.merge(hold_file, final_outcomes, on="team_combo") - final_stacks = final_stacks[['team_combo', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '60+%', '2x%', '3x%', '4x%']] - final_stacks['Own'] = final_stacks['team_combo'].map(own_dict) - final_stacks = final_stacks[['team_combo', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '60+%', '2x%', '3x%', '4x%', 'Own']] - final_stacks['Projection Rank'] = final_stacks.Median.rank(pct = True) - final_stacks['Own Rank'] = final_stacks.Own.rank(pct = True) - final_stacks['LevX'] = final_stacks['Projection Rank'] - final_stacks['Own Rank'] - final_stacks['Team'] = final_stacks['team_combo'].map(team_dict) - final_stacks['QB'] = final_stacks['team_combo'].map(qb_dict) - final_stacks['WR1_TE'] = final_stacks['team_combo'].map(wr1_dict) - final_stacks['WR2_TE'] = final_stacks['team_combo'].map(wr2_dict) - - final_stacks = final_stacks[['Team', 'QB', 'WR1_TE', 'WR2_TE', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', - 'Top_10_finish', '60+%', '2x%', '3x%', '4x%', 'Own', 'LevX']] + hold_container = st.empty() + if st.button('Create Range of Outcomes for Slate'): + with hold_container: + if site_var1 == 'Draftkings': + working_roo = player_stats + working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "PPR": "Fantasy"}, inplace = True) + working_roo.replace('', 0, inplace=True) + if site_var1 == 'Fanduel': + working_roo = player_stats + working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "Half_PPR": "Fantasy"}, inplace = True) + working_roo.replace('', 0, inplace=True) + working_roo = working_roo[working_roo['Team'].isin(team_var1)] + + total_sims = 1000 + + salary_dict = dict(zip(working_roo.name, working_roo.Salary)) + own_dict = dict(zip(working_roo.name, working_roo.Own)) + fantasy_dict = dict(zip(working_roo.name, working_roo.Fantasy)) - final_stacks = final_stacks.sort_values(by='Median', ascending=False) - - with hold_container: - hold_container = st.empty() - final_stacks = final_stacks - st.dataframe(final_stacks.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True) - - st.download_button( - label="Export Tables", - data=convert_df_to_csv(final_stacks), - file_name='Custom_NFL_stacks_export.csv', - mime='text/csv', - ) + QB_group = working_roo.loc[working_roo['Position'] == 'QB'] + stacks_df = pd.DataFrame(columns=['Team','QB', 'WR1', 'WR2_TE']) + + for stack in range(0,len(QB_group)): + team_var = QB_group.iat[stack,1] + WR_group_1 = working_roo.loc[working_roo['Position'] == 'WR'] + WR_group_2 = WR_group_1.loc[working_roo['Team'] == team_var] + TE_group_1 = working_roo.loc[working_roo['Position'] == 'TE'] + TE_group_2 = TE_group_1.loc[working_roo['Team'] == team_var] + cur_list = [] + qb_piece = QB_group.iat[stack,0] + wr_piece = WR_group_2.iat[0,0] + te_piece = TE_group_2.iat[0,0] + cur_list.append(team_var) + cur_list.append(qb_piece) + cur_list.append(wr_piece) + cur_list.append(te_piece) + stacks_df.loc[len(stacks_df)] = cur_list + cur_list = [] + qb_piece = QB_group.iat[stack,0] + wr_piece = WR_group_2.iat[1,0] + te_piece = TE_group_2.iat[0,0] + cur_list.append(team_var) + cur_list.append(qb_piece) + cur_list.append(wr_piece) + cur_list.append(te_piece) + stacks_df.loc[len(stacks_df)] = cur_list + cur_list = [] + qb_piece = QB_group.iat[stack,0] + wr_piece = WR_group_2.iat[0,0] + te_piece = WR_group_2.iat[1,0] + cur_list.append(team_var) + cur_list.append(qb_piece) + cur_list.append(wr_piece) + cur_list.append(te_piece) + stacks_df.loc[len(stacks_df)] = cur_list + + stacks_df['Salary'] = sum([stacks_df['QB'].map(salary_dict), + stacks_df['WR1'].map(salary_dict), + stacks_df['WR2_TE'].map(salary_dict)]) + + stacks_df['Fantasy'] = sum([stacks_df['QB'].map(fantasy_dict), + stacks_df['WR1'].map(fantasy_dict), + stacks_df['WR2_TE'].map(fantasy_dict)]) + + stacks_df['Own'] = sum([stacks_df['QB'].map(own_dict), + stacks_df['WR1'].map(own_dict), + stacks_df['WR2_TE'].map(own_dict)]) + + stacks_df['team_combo'] = stacks_df['Team'] + " " + stacks_df['QB'] + " " + stacks_df['WR1'] + " " + stacks_df['WR2_TE'] + + own_dict = dict(zip(stacks_df.team_combo, stacks_df.Own)) + qb_dict = dict(zip(stacks_df.team_combo, stacks_df.QB)) + wr1_dict = dict(zip(stacks_df.team_combo, stacks_df.WR1)) + wr2_dict = dict(zip(stacks_df.team_combo, stacks_df.WR2_TE)) + team_dict = dict(zip(stacks_df.team_combo, stacks_df.Team)) + + flex_file = stacks_df[['team_combo', 'Salary', 'Fantasy']] + flex_file.rename(columns={"Fantasy": "Median"}, inplace = True) + flex_file['Floor'] = flex_file['Median']*.25 + flex_file['Ceiling'] = flex_file['Median'] + flex_file['Floor'] + flex_file['STD'] = flex_file['Median']/4 + flex_file = flex_file[['team_combo', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']] + hold_file = flex_file + overall_file = flex_file + salary_file = flex_file + + overall_players = overall_file[['team_combo']] + + for x in range(0,total_sims): + salary_file[x] = salary_file['Salary'] + + salary_file=salary_file.drop(['team_combo', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) + salary_file.astype('int').dtypes + + salary_file = salary_file.div(1000) + + for x in range(0,total_sims): + overall_file[x] = np.random.normal(overall_file['Median'],overall_file['STD']) + + overall_file=overall_file.drop(['team_combo', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) + overall_file.astype('int').dtypes + + players_only = hold_file[['team_combo']] + raw_lineups_file = players_only + + for x in range(0,total_sims): + maps_dict = {'proj_map':dict(zip(hold_file.team_combo,hold_file[x]))} + raw_lineups_file[x] = sum([raw_lineups_file['team_combo'].map(maps_dict['proj_map'])]) + players_only[x] = raw_lineups_file[x].rank(ascending=False) + + players_only=players_only.drop(['team_combo'], axis=1) + players_only.astype('int').dtypes + + salary_2x_check = (overall_file - (salary_file*2)) + salary_3x_check = (overall_file - (salary_file*3)) + salary_4x_check = (overall_file - (salary_file*4)) + + players_only['Average_Rank'] = players_only.mean(axis=1) + players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims + players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims + players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims + players_only['60+%'] = overall_file[overall_file >= 60].count(axis=1)/float(total_sims) + players_only['2x%'] = salary_2x_check[salary_2x_check >= 1].count(axis=1)/float(total_sims) + players_only['3x%'] = salary_3x_check[salary_3x_check >= 1].count(axis=1)/float(total_sims) + players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims) + + players_only['team_combo'] = hold_file[['team_combo']] + + final_outcomes = players_only[['team_combo', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '60+%', '2x%', '3x%', '4x%']] + + final_stacks = pd.merge(hold_file, final_outcomes, on="team_combo") + final_stacks = final_stacks[['team_combo', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '60+%', '2x%', '3x%', '4x%']] + final_stacks['Own'] = final_stacks['team_combo'].map(own_dict) + final_stacks = final_stacks[['team_combo', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '60+%', '2x%', '3x%', '4x%', 'Own']] + final_stacks['Projection Rank'] = final_stacks.Median.rank(pct = True) + final_stacks['Own Rank'] = final_stacks.Own.rank(pct = True) + final_stacks['LevX'] = final_stacks['Projection Rank'] - final_stacks['Own Rank'] + final_stacks['Team'] = final_stacks['team_combo'].map(team_dict) + final_stacks['QB'] = final_stacks['team_combo'].map(qb_dict) + final_stacks['WR1_TE'] = final_stacks['team_combo'].map(wr1_dict) + final_stacks['WR2_TE'] = final_stacks['team_combo'].map(wr2_dict) + + final_stacks = final_stacks[['Team', 'QB', 'WR1_TE', 'WR2_TE', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', + 'Top_10_finish', '60+%', '2x%', '3x%', '4x%', 'Own', 'LevX']] + + final_stacks = final_stacks.sort_values(by='Median', ascending=False) + + with hold_container: + hold_container = st.empty() + final_stacks = final_stacks + if view_var1 == 'Simple': + final_stacks = final_stacks[['Team', 'QB', 'WR1_TE', 'WR2_TE', 'Salary', 'Median', '60+%', '4x%']] + elif view_var1 == 'Advanced': + final_stacks = final_stacks[['Team', 'QB', 'WR1_TE', 'WR2_TE', 'Total', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', + 'Top_10_finish', '60+%', '2x%', '3x%', '4x%', 'Own', 'LevX']] + st.dataframe(final_stacks.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True) + + st.download_button( + label="Export Tables", + data=convert_df_to_csv(final_stacks), + file_name='Custom_NFL_stacks_export.csv', + mime='text/csv', + ) with tab2: col1, col2 = st.columns([1, 5]) @@ -304,46 +315,47 @@ with tab2: t_stamp = f"Last Update: " + str(dk_roo_raw['timestamp'][0]) + f" CST" slate_var2 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate', 'Late Slate', 'Thurs-Mon Slate'), key='slate_var2') site_var2 = st.radio("What table would you like to display?", ('Draftkings', 'Fanduel'), key='site_var2') + view_var2 = st.radio("What view would you like to display?", ('Advanced', 'Simple'), key='view_var2') custom_var2 = st.radio("Are you creating a custom table?", ('No', 'Yes'), key='custom_var2') if custom_var2 == 'No': - if site_var2 == 'Draftkings': - raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var2)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'overall'] - raw_baselines = raw_baselines.iloc[:,:-2] - elif site_var2 == 'Fanduel': - raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var2)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'overall'] - raw_baselines = raw_baselines.iloc[:,:-2] - split_var2 = st.radio("Would you like to view the whole slate or just specific games?", ('Full Slate Run', 'Specific Games'), key='split_var2') - if split_var2 == 'Specific Games': - team_var2 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var2') - elif split_var2 == 'Full Slate Run': - team_var2 = raw_baselines.Team.values.tolist() - pos_split2 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split2') - if pos_split2 == 'Specific Positions': - pos_var2 = st.multiselect('What Positions would you like to view?', options = ['QB', 'RB', 'WR', 'TE']) - elif pos_split2 == 'All Positions': - pos_var2 = 'All' - sal_var2 = st.slider("Is there a certain price range you want to view?", 2000, 15000, (2000, 15000), key='sal_var2') + if site_var2 == 'Draftkings': + raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var2)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'overall'] + raw_baselines = raw_baselines.iloc[:,:-2] + elif site_var2 == 'Fanduel': + raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var2)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'overall'] + raw_baselines = raw_baselines.iloc[:,:-2] + split_var2 = st.radio("Would you like to view the whole slate or just specific games?", ('Full Slate Run', 'Specific Games'), key='split_var2') + if split_var2 == 'Specific Games': + team_var2 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var2') + elif split_var2 == 'Full Slate Run': + team_var2 = raw_baselines.Team.values.tolist() + pos_split2 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split2') + if pos_split2 == 'Specific Positions': + pos_var2 = st.multiselect('What Positions would you like to view?', options = ['QB', 'RB', 'WR', 'TE']) + elif pos_split2 == 'All Positions': + pos_var2 = 'All' + sal_var2 = st.slider("Is there a certain price range you want to view?", 2000, 15000, (2000, 15000), key='sal_var2') if custom_var2 == 'Yes': - contest_var2 = st.selectbox("What contest type are you running for?", ('Cash', 'Small Field GPP', 'Large Field GPP'), key='contest_var2') - if site_var2 == 'Draftkings': - raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var2)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'overall'] - elif site_var2 == 'Fanduel': - raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var2)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'overall'] - split_var2 = st.radio("Are you running the full slate or certain games?", ('Full Slate Run', 'Specific Games'), key='split_var2') - if split_var2 == 'Specific Games': - team_var2 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var2') - elif split_var2 == 'Full Slate Run': - team_var2 = raw_baselines.Team.values.tolist() - pos_split2 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split2') - if pos_split2 == 'Specific Positions': - pos_var2 = st.multiselect('What Positions would you like to view?', options = ['QB', 'RB', 'WR', 'TE']) - elif pos_split2 == 'All Positions': - pos_var2 = 'All' - sal_var2 = st.slider("Is there a certain price range you want to view?", 2000, 15000, (2000, 15000), key='sal_var2') + contest_var2 = st.selectbox("What contest type are you running for?", ('Cash', 'Small Field GPP', 'Large Field GPP'), key='contest_var2') + if site_var2 == 'Draftkings': + raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var2)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'overall'] + elif site_var2 == 'Fanduel': + raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var2)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'overall'] + split_var2 = st.radio("Are you running the full slate or certain games?", ('Full Slate Run', 'Specific Games'), key='split_var2') + if split_var2 == 'Specific Games': + team_var2 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var2') + elif split_var2 == 'Full Slate Run': + team_var2 = raw_baselines.Team.values.tolist() + pos_split2 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split2') + if pos_split2 == 'Specific Positions': + pos_var2 = st.multiselect('What Positions would you like to view?', options = ['QB', 'RB', 'WR', 'TE']) + elif pos_split2 == 'All Positions': + pos_var2 = 'All' + sal_var2 = st.slider("Is there a certain price range you want to view?", 2000, 15000, (2000, 15000), key='sal_var2') with col2: @@ -356,7 +368,12 @@ with tab2: final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] final_Proj = final_Proj.sort_values(by='Median', ascending=False) - final_Proj = final_Proj.set_index('Player') + if view_var2 == 'Simple': + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Salary', 'Median', 'Top_5_finish', '4x%']] + final_Proj = final_Proj.set_index('Player') + elif view_var2 == 'Advanced': + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] + final_Proj = final_Proj.set_index('Player') st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True) st.download_button( label="Export Tables", @@ -365,162 +382,169 @@ with tab2: mime='text/csv', ) elif custom_var2 == 'Yes': - hold_container = st.empty() - if st.button('Create Range of Outcomes for Slate'): - with hold_container: - if site_var2 == 'Draftkings': - working_roo = player_stats - working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "PPR": "Fantasy"}, inplace = True) - working_roo.replace('', 0, inplace=True) - if site_var2 == 'Fanduel': - working_roo = player_stats - working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "Half_PPR": "Fantasy"}, inplace = True) - working_roo.replace('', 0, inplace=True) - working_roo = working_roo[working_roo['Team'].isin(team_var2)] - working_roo = working_roo[working_roo['Salary'] >= sal_var2[0]] - working_roo = working_roo[working_roo['Salary'] <= sal_var2[1]] - own_dict = dict(zip(working_roo.Player, working_roo.Own)) - team_dict = dict(zip(working_roo.Player, working_roo.Team)) - opp_dict = dict(zip(working_roo.Player, working_roo.Opp)) - total_sims = 1000 - - flex_file = working_roo[['Player', 'Position', 'Salary', 'Fantasy', 'Rush Yards', 'Receptions']] - flex_file.rename(columns={"Fantasy": "Median", "Pos": "Position"}, inplace = True) - flex_file['Floor'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median']*.25) + (flex_file['Rush Yards']*.01),flex_file['Median']*.25) - flex_file['Ceiling'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median'] + flex_file['Floor']) + (flex_file['Rush Yards']*.01), flex_file['Median'] + flex_file['Floor'] + flex_file['Receptions']) - flex_file['STD'] = (flex_file['Median']/4) + flex_file['Receptions'] - flex_file = flex_file[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']] - hold_file = flex_file - overall_file = flex_file - salary_file = flex_file - - overall_players = overall_file[['Player']] - - for x in range(0,total_sims): - salary_file[x] = salary_file['Salary'] - - salary_file=salary_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) - salary_file.astype('int').dtypes - - salary_file = salary_file.div(1000) - - for x in range(0,total_sims): - overall_file[x] = np.random.normal(overall_file['Median'],overall_file['STD']) - - overall_file=overall_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) - overall_file.astype('int').dtypes - - players_only = hold_file[['Player']] - raw_lineups_file = players_only - - for x in range(0,total_sims): - maps_dict = {'proj_map':dict(zip(hold_file.Player,hold_file[x]))} - raw_lineups_file[x] = sum([raw_lineups_file['Player'].map(maps_dict['proj_map'])]) - players_only[x] = raw_lineups_file[x].rank(ascending=False) - - players_only=players_only.drop(['Player'], axis=1) - players_only.astype('int').dtypes - - salary_2x_check = (overall_file - (salary_file*2)) - salary_3x_check = (overall_file - (salary_file*3)) - salary_4x_check = (overall_file - (salary_file*4)) - - players_only['Average_Rank'] = players_only.mean(axis=1) - players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims - players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims - players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims - players_only['20+%'] = overall_file[overall_file >= 20].count(axis=1)/float(total_sims) - players_only['2x%'] = salary_2x_check[salary_2x_check >= 1].count(axis=1)/float(total_sims) - players_only['3x%'] = salary_3x_check[salary_3x_check >= 1].count(axis=1)/float(total_sims) - players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims) - - players_only['Player'] = hold_file[['Player']] - - final_outcomes = players_only[['Player', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']] - - final_Proj = pd.merge(hold_file, final_outcomes, on="Player") - final_Proj = final_Proj[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']] - final_Proj['Own'] = final_Proj['Player'].map(own_dict) - final_Proj['Team'] = final_Proj['Player'].map(team_dict) - final_Proj['Opp'] = final_Proj['Player'].map(opp_dict) - final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own']] - final_Proj['Projection Rank'] = final_Proj.Median.rank(pct = True) - final_Proj['Own Rank'] = final_Proj.Own.rank(pct = True) - final_Proj['LevX'] = 0 - final_Proj['LevX'] = np.where(final_Proj['Position'] == 'QB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) - final_Proj['LevX'] = np.where(final_Proj['Position'] == 'TE', final_Proj[['Projection Rank', '2x%']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) - final_Proj['LevX'] = np.where(final_Proj['Position'] == 'RB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['20+%'] - final_Proj['Own Rank'], final_Proj['LevX']) - final_Proj['LevX'] = np.where(final_Proj['Position'] == 'WR', final_Proj[['Projection Rank', 'Top_10_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) - final_Proj['CPT_Own'] = final_Proj['Own'] / 4 - - final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] - final_Proj = final_Proj.set_index('Player') - final_Proj = final_Proj.sort_values(by='Median', ascending=False) - - with hold_container: - hold_container = st.empty() - final_Proj = final_Proj - st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True) - - st.download_button( - label="Export Tables", - data=convert_df_to_csv(final_Proj), - file_name='Custom_NFL_overall_export.csv', - mime='text/csv', - ) + hold_container = st.empty() + if st.button('Create Range of Outcomes for Slate'): + with hold_container: + if site_var2 == 'Draftkings': + working_roo = player_stats + working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "PPR": "Fantasy"}, inplace = True) + working_roo.replace('', 0, inplace=True) + if site_var2 == 'Fanduel': + working_roo = player_stats + working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "Half_PPR": "Fantasy"}, inplace = True) + working_roo.replace('', 0, inplace=True) + working_roo = working_roo[working_roo['Team'].isin(team_var2)] + working_roo = working_roo[working_roo['Salary'] >= sal_var2[0]] + working_roo = working_roo[working_roo['Salary'] <= sal_var2[1]] + own_dict = dict(zip(working_roo.Player, working_roo.Own)) + team_dict = dict(zip(working_roo.Player, working_roo.Team)) + opp_dict = dict(zip(working_roo.Player, working_roo.Opp)) + total_sims = 1000 + + flex_file = working_roo[['Player', 'Position', 'Salary', 'Fantasy', 'Rush Yards', 'Receptions']] + flex_file.rename(columns={"Fantasy": "Median", "Pos": "Position"}, inplace = True) + flex_file['Floor'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median']*.25) + (flex_file['Rush Yards']*.01),flex_file['Median']*.25) + flex_file['Ceiling'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median'] + flex_file['Floor']) + (flex_file['Rush Yards']*.01), flex_file['Median'] + flex_file['Floor'] + flex_file['Receptions']) + flex_file['STD'] = (flex_file['Median']/4) + flex_file['Receptions'] + flex_file = flex_file[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']] + hold_file = flex_file + overall_file = flex_file + salary_file = flex_file + + overall_players = overall_file[['Player']] + + for x in range(0,total_sims): + salary_file[x] = salary_file['Salary'] + + salary_file=salary_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) + salary_file.astype('int').dtypes + + salary_file = salary_file.div(1000) + + for x in range(0,total_sims): + overall_file[x] = np.random.normal(overall_file['Median'],overall_file['STD']) + + overall_file=overall_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) + overall_file.astype('int').dtypes + + players_only = hold_file[['Player']] + raw_lineups_file = players_only + + for x in range(0,total_sims): + maps_dict = {'proj_map':dict(zip(hold_file.Player,hold_file[x]))} + raw_lineups_file[x] = sum([raw_lineups_file['Player'].map(maps_dict['proj_map'])]) + players_only[x] = raw_lineups_file[x].rank(ascending=False) + + players_only=players_only.drop(['Player'], axis=1) + players_only.astype('int').dtypes + + salary_2x_check = (overall_file - (salary_file*2)) + salary_3x_check = (overall_file - (salary_file*3)) + salary_4x_check = (overall_file - (salary_file*4)) + + players_only['Average_Rank'] = players_only.mean(axis=1) + players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims + players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims + players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims + players_only['20+%'] = overall_file[overall_file >= 20].count(axis=1)/float(total_sims) + players_only['2x%'] = salary_2x_check[salary_2x_check >= 1].count(axis=1)/float(total_sims) + players_only['3x%'] = salary_3x_check[salary_3x_check >= 1].count(axis=1)/float(total_sims) + players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims) + + players_only['Player'] = hold_file[['Player']] + + final_outcomes = players_only[['Player', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']] + + final_Proj = pd.merge(hold_file, final_outcomes, on="Player") + final_Proj = final_Proj[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']] + final_Proj['Own'] = final_Proj['Player'].map(own_dict) + final_Proj['Team'] = final_Proj['Player'].map(team_dict) + final_Proj['Opp'] = final_Proj['Player'].map(opp_dict) + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own']] + final_Proj['Projection Rank'] = final_Proj.Median.rank(pct = True) + final_Proj['Own Rank'] = final_Proj.Own.rank(pct = True) + final_Proj['LevX'] = 0 + final_Proj['LevX'] = np.where(final_Proj['Position'] == 'QB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) + final_Proj['LevX'] = np.where(final_Proj['Position'] == 'TE', final_Proj[['Projection Rank', '2x%']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) + final_Proj['LevX'] = np.where(final_Proj['Position'] == 'RB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['20+%'] - final_Proj['Own Rank'], final_Proj['LevX']) + final_Proj['LevX'] = np.where(final_Proj['Position'] == 'WR', final_Proj[['Projection Rank', 'Top_10_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) + final_Proj['CPT_Own'] = final_Proj['Own'] / 4 + + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] + final_Proj = final_Proj.set_index('Player') + final_Proj = final_Proj.sort_values(by='Median', ascending=False) + + with hold_container: + hold_container = st.empty() + final_Proj = final_Proj + if view_var2 == 'Simple': + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Salary', 'Median', 'Top_5_finish', '4x%']] + final_Proj = final_Proj.set_index('Player') + elif view_var2 == 'Advanced': + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] + final_Proj = final_Proj.set_index('Player') + st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True) + + st.download_button( + label="Export Tables", + data=convert_df_to_csv(final_Proj), + file_name='Custom_NFL_overall_export.csv', + mime='text/csv', + ) with tab3: col1, col2 = st.columns([1, 5]) with col1: st.info(t_stamp) if st.button("Load/Reset Data", key='reset3'): - st.cache_data.clear() - player_stats, dk_stacks_raw, fd_stacks_raw, dk_roo_raw, fd_roo_raw, site_slates = player_stat_table() - t_stamp = f"Last Update: " + str(dk_roo_raw['timestamp'][0]) + f" CST" + st.cache_data.clear() + player_stats, dk_stacks_raw, fd_stacks_raw, dk_roo_raw, fd_roo_raw, site_slates = player_stat_table() + t_stamp = f"Last Update: " + str(dk_roo_raw['timestamp'][0]) + f" CST" slate_var3 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate', 'Late Slate', 'Thurs-Mon Slate'), key='slate_var3') site_var3 = st.radio("What table would you like to display?", ('Draftkings', 'Fanduel'), key='site_var3') + view_var3 = st.radio("What view would you like to display?", ('Advanced', 'Simple'), key='view_var3') custom_var3 = st.radio("Are you creating a custom table?", ('No', 'Yes'), key='custom_var3') if custom_var3 == 'No': - if site_var3 == 'Draftkings': - raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var3)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_qbs'] - raw_baselines = raw_baselines.iloc[:,:-3] - elif site_var3 == 'Fanduel': - raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var3)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_qbs'] - raw_baselines = raw_baselines.iloc[:,:-3] - split_var3 = st.radio("Would you like to view the whole slate or just specific games?", ('Full Slate Run', 'Specific Games'), key='split_var3') - if split_var3 == 'Specific Games': - team_var3 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var3') - elif split_var3 == 'Full Slate Run': - team_var3 = raw_baselines.Team.values.tolist() - pos_split3 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split3') - if pos_split3 == 'Specific Positions': - pos_var3 = st.multiselect('What Positions would you like to view?', options = ['QB'], key='pos_var3') - elif pos_split3 == 'All Positions': - pos_var3 = 'All' - sal_var3 = st.slider("Is there a certain price range you want to view?", 2000, 15000, (2000, 15000), key='sal_var3') + if site_var3 == 'Draftkings': + raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var3)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_qbs'] + raw_baselines = raw_baselines.iloc[:,:-3] + elif site_var3 == 'Fanduel': + raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var3)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_qbs'] + raw_baselines = raw_baselines.iloc[:,:-3] + split_var3 = st.radio("Would you like to view the whole slate or just specific games?", ('Full Slate Run', 'Specific Games'), key='split_var3') + if split_var3 == 'Specific Games': + team_var3 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var3') + elif split_var3 == 'Full Slate Run': + team_var3 = raw_baselines.Team.values.tolist() + pos_split3 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split3') + if pos_split3 == 'Specific Positions': + pos_var3 = st.multiselect('What Positions would you like to view?', options = ['QB'], key='pos_var3') + elif pos_split3 == 'All Positions': + pos_var3 = 'All' + sal_var3 = st.slider("Is there a certain price range you want to view?", 2000, 15000, (2000, 15000), key='sal_var3') if custom_var3 == 'Yes': - contest_var3 = st.selectbox("What contest type are you running for?", ('Cash', 'Small Field GPP', 'Large Field GPP'), key='contest_var3') - if site_var3 == 'Draftkings': - raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var3)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_qbs'] - raw_baselines = raw_baselines.iloc[:,:-3] - elif site_var3 == 'Fanduel': - raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var3)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_qbs'] - raw_baselines = raw_baselines.iloc[:,:-3] - split_var3 = st.radio("Are you running the full slate or certain games?", ('Full Slate Run', 'Specific Games'), key='split_var3') - if split_var3 == 'Specific Games': - team_var3 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var3') - elif split_var3 == 'Full Slate Run': - team_var3 = raw_baselines.Team.values.tolist() - pos_split3 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split3') - if pos_split3 == 'Specific Positions': - pos_var3 = st.multiselect('What Positions would you like to view?', options = ['QB']) - elif pos_split3 == 'All Positions': - pos_var3 = 'All' - sal_var3 = st.slider("Is there a certain price range you want to view?", 2000, 15000, (2000, 15000), key='sal_var3') + contest_var3 = st.selectbox("What contest type are you running for?", ('Cash', 'Small Field GPP', 'Large Field GPP'), key='contest_var3') + if site_var3 == 'Draftkings': + raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var3)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_qbs'] + raw_baselines = raw_baselines.iloc[:,:-3] + elif site_var3 == 'Fanduel': + raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var3)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_qbs'] + raw_baselines = raw_baselines.iloc[:,:-3] + split_var3 = st.radio("Are you running the full slate or certain games?", ('Full Slate Run', 'Specific Games'), key='split_var3') + if split_var3 == 'Specific Games': + team_var3 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var3') + elif split_var3 == 'Full Slate Run': + team_var3 = raw_baselines.Team.values.tolist() + pos_split3 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split3') + if pos_split3 == 'Specific Positions': + pos_var3 = st.multiselect('What Positions would you like to view?', options = ['QB']) + elif pos_split3 == 'All Positions': + pos_var3 = 'All' + sal_var3 = st.slider("Is there a certain price range you want to view?", 2000, 15000, (2000, 15000), key='sal_var3') with col2: @@ -529,11 +553,16 @@ with tab3: final_Proj = final_Proj[final_Proj['Salary'] >= sal_var3[0]] final_Proj = final_Proj[final_Proj['Salary'] <= sal_var3[1]] if pos_var3 != 'All': - final_Proj = raw_baselines[raw_baselines['Position'].str.contains('|'.join(pos_var3))] - final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] - final_Proj = final_Proj.sort_values(by='Median', ascending=False) + final_Proj = raw_baselines[raw_baselines['Position'].str.contains('|'.join(pos_var3))] + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] + final_Proj = final_Proj.sort_values(by='Median', ascending=False) - final_Proj = final_Proj.set_index('Player') + if view_var3 == 'Simple': + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Salary', 'Median', 'Top_5_finish', '4x%']] + final_Proj = final_Proj.set_index('Player') + elif view_var3 == 'Advanced': + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] + final_Proj = final_Proj.set_index('Player') st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True) st.download_button( label="Export Tables", @@ -542,162 +571,169 @@ with tab3: mime='text/csv', ) elif custom_var3 == 'Yes': - hold_container = st.empty() - if st.button('Create Range of Outcomes for Slate'): - with hold_container: - if site_var3 == 'Draftkings': - working_roo = player_stats - working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "PPR": "Fantasy"}, inplace = True) - working_roo.replace('', 0, inplace=True) - working_roo = working_roo[working_roo['Position'] == 'QB'] - if site_var3 == 'Fanduel': - working_roo = player_stats - working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "Half_PPR": "Fantasy"}, inplace = True) - working_roo.replace('', 0, inplace=True) - working_roo = working_roo[working_roo['Position'] == 'QB'] - working_roo = working_roo[working_roo['Team'].isin(team_var3)] - working_roo = working_roo[working_roo['Salary'] >= sal_var2[0]] - working_roo = working_roo[working_roo['Salary'] <= sal_var2[1]] - own_dict = dict(zip(working_roo.Player, working_roo.Own)) - team_dict = dict(zip(working_roo.Player, working_roo.Team)) - opp_dict = dict(zip(working_roo.Player, working_roo.Opp)) - total_sims = 1000 - - flex_file = working_roo[['Player', 'Position', 'Salary', 'Fantasy', 'Rush Yards', 'Receptions']] - flex_file.rename(columns={"Fantasy": "Median", "Pos": "Position"}, inplace = True) - flex_file['Floor'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median']*.25) + (flex_file['Rush Yards']*.01),flex_file['Median']*.25) - flex_file['Ceiling'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median'] + flex_file['Floor']) + (flex_file['Rush Yards']*.01), flex_file['Median'] + flex_file['Floor'] + flex_file['Receptions']) - flex_file['STD'] = (flex_file['Median']/4) + flex_file['Receptions'] - flex_file = flex_file[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']] - hold_file = flex_file - overall_file = flex_file - salary_file = flex_file - - overall_players = overall_file[['Player']] - - for x in range(0,total_sims): - salary_file[x] = salary_file['Salary'] - - salary_file=salary_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) - salary_file.astype('int').dtypes - - salary_file = salary_file.div(1000) - - for x in range(0,total_sims): - overall_file[x] = np.random.normal(overall_file['Median'],overall_file['STD']) - - overall_file=overall_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) - overall_file.astype('int').dtypes - - players_only = hold_file[['Player']] - raw_lineups_file = players_only - - for x in range(0,total_sims): - maps_dict = {'proj_map':dict(zip(hold_file.Player,hold_file[x]))} - raw_lineups_file[x] = sum([raw_lineups_file['Player'].map(maps_dict['proj_map'])]) - players_only[x] = raw_lineups_file[x].rank(ascending=False) - - players_only=players_only.drop(['Player'], axis=1) - players_only.astype('int').dtypes - - salary_2x_check = (overall_file - (salary_file*2)) - salary_3x_check = (overall_file - (salary_file*3)) - salary_4x_check = (overall_file - (salary_file*4)) - - players_only['Average_Rank'] = players_only.mean(axis=1) - players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims - players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims - players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims - players_only['20+%'] = overall_file[overall_file >= 20].count(axis=1)/float(total_sims) - players_only['2x%'] = salary_2x_check[salary_2x_check >= 1].count(axis=1)/float(total_sims) - players_only['3x%'] = salary_3x_check[salary_3x_check >= 1].count(axis=1)/float(total_sims) - players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims) - - players_only['Player'] = hold_file[['Player']] - - final_outcomes = players_only[['Player', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']] - - final_Proj = pd.merge(hold_file, final_outcomes, on="Player") - final_Proj = final_Proj[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']] - final_Proj['Own'] = final_Proj['Player'].map(own_dict) - final_Proj['Team'] = final_Proj['Player'].map(team_dict) - final_Proj['Opp'] = final_Proj['Player'].map(opp_dict) - final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own']] - final_Proj['Projection Rank'] = final_Proj.Median.rank(pct = True) - final_Proj['Own Rank'] = final_Proj.Own.rank(pct = True) - final_Proj['LevX'] = 0 - final_Proj['LevX'] = np.where(final_Proj['Position'] == 'QB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) - final_Proj['LevX'] = np.where(final_Proj['Position'] == 'TE', final_Proj[['Projection Rank', '2x%']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) - final_Proj['LevX'] = np.where(final_Proj['Position'] == 'RB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['20+%'] - final_Proj['Own Rank'], final_Proj['LevX']) - final_Proj['LevX'] = np.where(final_Proj['Position'] == 'WR', final_Proj[['Projection Rank', 'Top_10_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) - final_Proj['CPT_Own'] = final_Proj['Own'] / 4 - - final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] - final_Proj = final_Proj.set_index('Player') - final_Proj = final_Proj.sort_values(by='Median', ascending=False) - - with hold_container: - hold_container = st.empty() - final_Proj = final_Proj - st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True) - - st.download_button( - label="Export Tables", - data=convert_df_to_csv(final_Proj), - file_name='Custom_NFL_qb_export.csv', - mime='text/csv', - ) + hold_container = st.empty() + if st.button('Create Range of Outcomes for Slate'): + with hold_container: + if site_var3 == 'Draftkings': + working_roo = player_stats + working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "PPR": "Fantasy"}, inplace = True) + working_roo.replace('', 0, inplace=True) + working_roo = working_roo[working_roo['Position'] == 'QB'] + if site_var3 == 'Fanduel': + working_roo = player_stats + working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "Half_PPR": "Fantasy"}, inplace = True) + working_roo.replace('', 0, inplace=True) + working_roo = working_roo[working_roo['Position'] == 'QB'] + working_roo = working_roo[working_roo['Team'].isin(team_var3)] + working_roo = working_roo[working_roo['Salary'] >= sal_var2[0]] + working_roo = working_roo[working_roo['Salary'] <= sal_var2[1]] + own_dict = dict(zip(working_roo.Player, working_roo.Own)) + team_dict = dict(zip(working_roo.Player, working_roo.Team)) + opp_dict = dict(zip(working_roo.Player, working_roo.Opp)) + total_sims = 1000 + + flex_file = working_roo[['Player', 'Position', 'Salary', 'Fantasy', 'Rush Yards', 'Receptions']] + flex_file.rename(columns={"Fantasy": "Median", "Pos": "Position"}, inplace = True) + flex_file['Floor'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median']*.25) + (flex_file['Rush Yards']*.01),flex_file['Median']*.25) + flex_file['Ceiling'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median'] + flex_file['Floor']) + (flex_file['Rush Yards']*.01), flex_file['Median'] + flex_file['Floor'] + flex_file['Receptions']) + flex_file['STD'] = (flex_file['Median']/4) + flex_file['Receptions'] + flex_file = flex_file[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']] + hold_file = flex_file + overall_file = flex_file + salary_file = flex_file + + overall_players = overall_file[['Player']] + + for x in range(0,total_sims): + salary_file[x] = salary_file['Salary'] + + salary_file=salary_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) + salary_file.astype('int').dtypes + + salary_file = salary_file.div(1000) + + for x in range(0,total_sims): + overall_file[x] = np.random.normal(overall_file['Median'],overall_file['STD']) + + overall_file=overall_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) + overall_file.astype('int').dtypes + + players_only = hold_file[['Player']] + raw_lineups_file = players_only + + for x in range(0,total_sims): + maps_dict = {'proj_map':dict(zip(hold_file.Player,hold_file[x]))} + raw_lineups_file[x] = sum([raw_lineups_file['Player'].map(maps_dict['proj_map'])]) + players_only[x] = raw_lineups_file[x].rank(ascending=False) + + players_only=players_only.drop(['Player'], axis=1) + players_only.astype('int').dtypes + + salary_2x_check = (overall_file - (salary_file*2)) + salary_3x_check = (overall_file - (salary_file*3)) + salary_4x_check = (overall_file - (salary_file*4)) + + players_only['Average_Rank'] = players_only.mean(axis=1) + players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims + players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims + players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims + players_only['20+%'] = overall_file[overall_file >= 20].count(axis=1)/float(total_sims) + players_only['2x%'] = salary_2x_check[salary_2x_check >= 1].count(axis=1)/float(total_sims) + players_only['3x%'] = salary_3x_check[salary_3x_check >= 1].count(axis=1)/float(total_sims) + players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims) + + players_only['Player'] = hold_file[['Player']] + + final_outcomes = players_only[['Player', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']] + + final_Proj = pd.merge(hold_file, final_outcomes, on="Player") + final_Proj = final_Proj[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']] + final_Proj['Own'] = final_Proj['Player'].map(own_dict) + final_Proj['Team'] = final_Proj['Player'].map(team_dict) + final_Proj['Opp'] = final_Proj['Player'].map(opp_dict) + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own']] + final_Proj['Projection Rank'] = final_Proj.Median.rank(pct = True) + final_Proj['Own Rank'] = final_Proj.Own.rank(pct = True) + final_Proj['LevX'] = 0 + final_Proj['LevX'] = np.where(final_Proj['Position'] == 'QB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) + final_Proj['LevX'] = np.where(final_Proj['Position'] == 'TE', final_Proj[['Projection Rank', '2x%']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) + final_Proj['LevX'] = np.where(final_Proj['Position'] == 'RB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['20+%'] - final_Proj['Own Rank'], final_Proj['LevX']) + final_Proj['LevX'] = np.where(final_Proj['Position'] == 'WR', final_Proj[['Projection Rank', 'Top_10_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) + final_Proj['CPT_Own'] = final_Proj['Own'] / 4 + + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] + final_Proj = final_Proj.set_index('Player') + final_Proj = final_Proj.sort_values(by='Median', ascending=False) + + with hold_container: + hold_container = st.empty() + final_Proj = final_Proj + if view_var3 == 'Simple': + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Salary', 'Median', 'Top_5_finish', '4x%']] + final_Proj = final_Proj.set_index('Player') + elif view_var3 == 'Advanced': + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] + final_Proj = final_Proj.set_index('Player') + st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True) + + st.download_button( + label="Export Tables", + data=convert_df_to_csv(final_Proj), + file_name='Custom_NFL_qb_export.csv', + mime='text/csv', + ) with tab4: col1, col2 = st.columns([1, 5]) with col1: st.info(t_stamp) if st.button("Load/Reset Data", key='reset4'): - st.cache_data.clear() - player_stats, dk_stacks_raw, fd_stacks_raw, dk_roo_raw, fd_roo_raw, site_slates = player_stat_table() - t_stamp = f"Last Update: " + str(dk_roo_raw['timestamp'][0]) + f" CST" + st.cache_data.clear() + player_stats, dk_stacks_raw, fd_stacks_raw, dk_roo_raw, fd_roo_raw, site_slates = player_stat_table() + t_stamp = f"Last Update: " + str(dk_roo_raw['timestamp'][0]) + f" CST" slate_var4 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate', 'Late Slate', 'Thurs-Mon Slate'), key='slate_var4') site_var4 = st.radio("What table would you like to display?", ('Draftkings', 'Fanduel'), key='site_var4') + view_var4 = st.radio("What view would you like to display?", ('Advanced', 'Simple'), key='view_var4') custom_var4 = st.radio("Are you creating a custom table?", ('No', 'Yes'), key='custom_var4') if custom_var4 == 'No': - if site_var4 == 'Draftkings': - raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var4)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_rbs'] - raw_baselines = raw_baselines.iloc[:,:-3] - elif site_var4 == 'Fanduel': - raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var4)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_rbs'] - raw_baselines = raw_baselines.iloc[:,:-3] - split_var4 = st.radio("Would you like to view the whole slate or just specific games?", ('Full Slate Run', 'Specific Games'), key='split_var4') - if split_var4 == 'Specific Games': - team_var4 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var4') - elif split_var4 == 'Full Slate Run': - team_var4 = raw_baselines.Team.values.tolist() - pos_split4 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split4') - if pos_split4 == 'Specific Positions': - pos_var4 = st.multiselect('What Positions would you like to view?', options = ['RB'], key='pos_var4') - elif pos_split4 == 'All Positions': - pos_var4 = 'All' - sal_var4 = st.slider("Is there a certain price range you want to view?", 2000, 15000, (2000, 15000), key='sal_var4') + if site_var4 == 'Draftkings': + raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var4)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_rbs'] + raw_baselines = raw_baselines.iloc[:,:-3] + elif site_var4 == 'Fanduel': + raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var4)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_rbs'] + raw_baselines = raw_baselines.iloc[:,:-3] + split_var4 = st.radio("Would you like to view the whole slate or just specific games?", ('Full Slate Run', 'Specific Games'), key='split_var4') + if split_var4 == 'Specific Games': + team_var4 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var4') + elif split_var4 == 'Full Slate Run': + team_var4 = raw_baselines.Team.values.tolist() + pos_split4 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split4') + if pos_split4 == 'Specific Positions': + pos_var4 = st.multiselect('What Positions would you like to view?', options = ['RB'], key='pos_var4') + elif pos_split4 == 'All Positions': + pos_var4 = 'All' + sal_var4 = st.slider("Is there a certain price range you want to view?", 2000, 15000, (2000, 15000), key='sal_var4') if custom_var4 == 'Yes': - contest_var4 = st.selectbox("What contest type are you running for?", ('Cash', 'Small Field GPP', 'Large Field GPP'), key='contest_var4') - if site_var4 == 'Draftkings': - raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var4)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_rbs'] - elif site_var4 == 'Fanduel': - raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var4)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_rbs'] - split_var4 = st.radio("Are you running the full slate or certain games?", ('Full Slate Run', 'Specific Games'), key='split_var4') - if split_var4 == 'Specific Games': - team_var4 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var4') - elif split_var4 == 'Full Slate Run': - team_var4 = raw_baselines.Team.values.tolist() - pos_split4 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split4') - if pos_split4 == 'Specific Positions': - pos_var4 = st.multiselect('What Positions would you like to view?', options = ['RB']) - elif pos_split4 == 'All Positions': - pos_var4 = 'All' - sal_var4 = st.slider("Is there a certain price range you want to view?", 2000, 15000, (2000, 15000), key='sal_var4') + contest_var4 = st.selectbox("What contest type are you running for?", ('Cash', 'Small Field GPP', 'Large Field GPP'), key='contest_var4') + if site_var4 == 'Draftkings': + raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var4)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_rbs'] + elif site_var4 == 'Fanduel': + raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var4)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_rbs'] + split_var4 = st.radio("Are you running the full slate or certain games?", ('Full Slate Run', 'Specific Games'), key='split_var4') + if split_var4 == 'Specific Games': + team_var4 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var4') + elif split_var4 == 'Full Slate Run': + team_var4 = raw_baselines.Team.values.tolist() + pos_split4 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split4') + if pos_split4 == 'Specific Positions': + pos_var4 = st.multiselect('What Positions would you like to view?', options = ['RB']) + elif pos_split4 == 'All Positions': + pos_var4 = 'All' + sal_var4 = st.slider("Is there a certain price range you want to view?", 2000, 15000, (2000, 15000), key='sal_var4') with col2: @@ -706,12 +742,17 @@ with tab4: final_Proj = final_Proj[final_Proj['Salary'] >= sal_var4[0]] final_Proj = final_Proj[final_Proj['Salary'] <= sal_var4[1]] if pos_var4 != 'All': - final_Proj = raw_baselines[raw_baselines['Position'].str.contains('|'.join(pos_var4))] - final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] - final_Proj = final_Proj.set_index('Player') - final_Proj = final_Proj.sort_values(by='Median', ascending=False) + final_Proj = raw_baselines[raw_baselines['Position'].str.contains('|'.join(pos_var4))] + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] + final_Proj = final_Proj.set_index('Player') + final_Proj = final_Proj.sort_values(by='Median', ascending=False) - final_Proj = final_Proj.set_index('Player') + if view_var4 == 'Simple': + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Salary', 'Median', 'Top_5_finish', '4x%']] + final_Proj = final_Proj.set_index('Player') + elif view_var4 == 'Advanced': + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] + final_Proj = final_Proj.set_index('Player') st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True) st.download_button( label="Export Tables", @@ -720,162 +761,169 @@ with tab4: mime='text/csv', ) elif custom_var4 == 'Yes': - hold_container = st.empty() - if st.button('Create Range of Outcomes for Slate'): - with hold_container: - if site_var4 == 'Draftkings': - working_roo = player_stats - working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "PPR": "Fantasy"}, inplace = True) - working_roo.replace('', 0, inplace=True) - working_roo = working_roo[working_roo['Position'] == 'RB'] - if site_var4 == 'Fanduel': - working_roo = player_stats - working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "Half_PPR": "Fantasy"}, inplace = True) - working_roo.replace('', 0, inplace=True) - working_roo = working_roo[working_roo['Position'] == 'RB'] - working_roo = working_roo[working_roo['Team'].isin(team_var4)] - working_roo = working_roo[working_roo['Salary'] >= sal_var4[0]] - working_roo = working_roo[working_roo['Salary'] <= sal_var4[1]] - own_dict = dict(zip(working_roo.Player, working_roo.Own)) - team_dict = dict(zip(working_roo.Player, working_roo.Team)) - opp_dict = dict(zip(working_roo.Player, working_roo.Opp)) - total_sims = 1000 - - flex_file = working_roo[['Player', 'Position', 'Salary', 'Fantasy', 'Rush Yards', 'Receptions']] - flex_file.rename(columns={"Fantasy": "Median", "Pos": "Position"}, inplace = True) - flex_file['Floor'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median']*.25) + (flex_file['Rush Yards']*.01),flex_file['Median']*.25) - flex_file['Ceiling'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median'] + flex_file['Floor']) + (flex_file['Rush Yards']*.01), flex_file['Median'] + flex_file['Floor'] + flex_file['Receptions']) - flex_file['STD'] = (flex_file['Median']/4) + flex_file['Receptions'] - flex_file = flex_file[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']] - hold_file = flex_file - overall_file = flex_file - salary_file = flex_file - - overall_players = overall_file[['Player']] - - for x in range(0,total_sims): - salary_file[x] = salary_file['Salary'] - - salary_file=salary_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) - salary_file.astype('int').dtypes - - salary_file = salary_file.div(1000) - - for x in range(0,total_sims): - overall_file[x] = np.random.normal(overall_file['Median'],overall_file['STD']) - - overall_file=overall_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) - overall_file.astype('int').dtypes - - players_only = hold_file[['Player']] - raw_lineups_file = players_only - - for x in range(0,total_sims): - maps_dict = {'proj_map':dict(zip(hold_file.Player,hold_file[x]))} - raw_lineups_file[x] = sum([raw_lineups_file['Player'].map(maps_dict['proj_map'])]) - players_only[x] = raw_lineups_file[x].rank(ascending=False) - - players_only=players_only.drop(['Player'], axis=1) - players_only.astype('int').dtypes - - salary_2x_check = (overall_file - (salary_file*2)) - salary_3x_check = (overall_file - (salary_file*3)) - salary_4x_check = (overall_file - (salary_file*4)) - - players_only['Average_Rank'] = players_only.mean(axis=1) - players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims - players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims - players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims - players_only['20+%'] = overall_file[overall_file >= 20].count(axis=1)/float(total_sims) - players_only['2x%'] = salary_2x_check[salary_2x_check >= 1].count(axis=1)/float(total_sims) - players_only['3x%'] = salary_3x_check[salary_3x_check >= 1].count(axis=1)/float(total_sims) - players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims) - - players_only['Player'] = hold_file[['Player']] - - final_outcomes = players_only[['Player', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']] - - final_Proj = pd.merge(hold_file, final_outcomes, on="Player") - final_Proj = final_Proj[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']] - final_Proj['Own'] = final_Proj['Player'].map(own_dict) - final_Proj['Team'] = final_Proj['Player'].map(team_dict) - final_Proj['Opp'] = final_Proj['Player'].map(opp_dict) - final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own']] - final_Proj['Projection Rank'] = final_Proj.Median.rank(pct = True) - final_Proj['Own Rank'] = final_Proj.Own.rank(pct = True) - final_Proj['LevX'] = 0 - final_Proj['LevX'] = np.where(final_Proj['Position'] == 'QB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) - final_Proj['LevX'] = np.where(final_Proj['Position'] == 'TE', final_Proj[['Projection Rank', '2x%']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) - final_Proj['LevX'] = np.where(final_Proj['Position'] == 'RB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['20+%'] - final_Proj['Own Rank'], final_Proj['LevX']) - final_Proj['LevX'] = np.where(final_Proj['Position'] == 'WR', final_Proj[['Projection Rank', 'Top_10_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) - final_Proj['CPT_Own'] = final_Proj['Own'] / 4 - - final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] - final_Proj = final_Proj.set_index('Player') - final_Proj = final_Proj.sort_values(by='Median', ascending=False) - - with hold_container: - hold_container = st.empty() - final_Proj = final_Proj - st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True) - - st.download_button( - label="Export Tables", - data=convert_df_to_csv(final_Proj), - file_name='Custom_NFL_rb_export.csv', - mime='text/csv', - ) + hold_container = st.empty() + if st.button('Create Range of Outcomes for Slate'): + with hold_container: + if site_var4 == 'Draftkings': + working_roo = player_stats + working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "PPR": "Fantasy"}, inplace = True) + working_roo.replace('', 0, inplace=True) + working_roo = working_roo[working_roo['Position'] == 'RB'] + if site_var4 == 'Fanduel': + working_roo = player_stats + working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "Half_PPR": "Fantasy"}, inplace = True) + working_roo.replace('', 0, inplace=True) + working_roo = working_roo[working_roo['Position'] == 'RB'] + working_roo = working_roo[working_roo['Team'].isin(team_var4)] + working_roo = working_roo[working_roo['Salary'] >= sal_var4[0]] + working_roo = working_roo[working_roo['Salary'] <= sal_var4[1]] + own_dict = dict(zip(working_roo.Player, working_roo.Own)) + team_dict = dict(zip(working_roo.Player, working_roo.Team)) + opp_dict = dict(zip(working_roo.Player, working_roo.Opp)) + total_sims = 1000 + + flex_file = working_roo[['Player', 'Position', 'Salary', 'Fantasy', 'Rush Yards', 'Receptions']] + flex_file.rename(columns={"Fantasy": "Median", "Pos": "Position"}, inplace = True) + flex_file['Floor'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median']*.25) + (flex_file['Rush Yards']*.01),flex_file['Median']*.25) + flex_file['Ceiling'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median'] + flex_file['Floor']) + (flex_file['Rush Yards']*.01), flex_file['Median'] + flex_file['Floor'] + flex_file['Receptions']) + flex_file['STD'] = (flex_file['Median']/4) + flex_file['Receptions'] + flex_file = flex_file[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']] + hold_file = flex_file + overall_file = flex_file + salary_file = flex_file + + overall_players = overall_file[['Player']] + + for x in range(0,total_sims): + salary_file[x] = salary_file['Salary'] + + salary_file=salary_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) + salary_file.astype('int').dtypes + + salary_file = salary_file.div(1000) + + for x in range(0,total_sims): + overall_file[x] = np.random.normal(overall_file['Median'],overall_file['STD']) + + overall_file=overall_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) + overall_file.astype('int').dtypes + + players_only = hold_file[['Player']] + raw_lineups_file = players_only + + for x in range(0,total_sims): + maps_dict = {'proj_map':dict(zip(hold_file.Player,hold_file[x]))} + raw_lineups_file[x] = sum([raw_lineups_file['Player'].map(maps_dict['proj_map'])]) + players_only[x] = raw_lineups_file[x].rank(ascending=False) + + players_only=players_only.drop(['Player'], axis=1) + players_only.astype('int').dtypes + + salary_2x_check = (overall_file - (salary_file*2)) + salary_3x_check = (overall_file - (salary_file*3)) + salary_4x_check = (overall_file - (salary_file*4)) + + players_only['Average_Rank'] = players_only.mean(axis=1) + players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims + players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims + players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims + players_only['20+%'] = overall_file[overall_file >= 20].count(axis=1)/float(total_sims) + players_only['2x%'] = salary_2x_check[salary_2x_check >= 1].count(axis=1)/float(total_sims) + players_only['3x%'] = salary_3x_check[salary_3x_check >= 1].count(axis=1)/float(total_sims) + players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims) + + players_only['Player'] = hold_file[['Player']] + + final_outcomes = players_only[['Player', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']] + + final_Proj = pd.merge(hold_file, final_outcomes, on="Player") + final_Proj = final_Proj[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']] + final_Proj['Own'] = final_Proj['Player'].map(own_dict) + final_Proj['Team'] = final_Proj['Player'].map(team_dict) + final_Proj['Opp'] = final_Proj['Player'].map(opp_dict) + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own']] + final_Proj['Projection Rank'] = final_Proj.Median.rank(pct = True) + final_Proj['Own Rank'] = final_Proj.Own.rank(pct = True) + final_Proj['LevX'] = 0 + final_Proj['LevX'] = np.where(final_Proj['Position'] == 'QB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) + final_Proj['LevX'] = np.where(final_Proj['Position'] == 'TE', final_Proj[['Projection Rank', '2x%']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) + final_Proj['LevX'] = np.where(final_Proj['Position'] == 'RB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['20+%'] - final_Proj['Own Rank'], final_Proj['LevX']) + final_Proj['LevX'] = np.where(final_Proj['Position'] == 'WR', final_Proj[['Projection Rank', 'Top_10_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) + final_Proj['CPT_Own'] = final_Proj['Own'] / 4 + + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] + final_Proj = final_Proj.set_index('Player') + final_Proj = final_Proj.sort_values(by='Median', ascending=False) + + with hold_container: + hold_container = st.empty() + final_Proj = final_Proj + if view_var4 == 'Simple': + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Salary', 'Median', 'Top_5_finish', '4x%']] + final_Proj = final_Proj.set_index('Player') + elif view_var4 == 'Advanced': + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] + final_Proj = final_Proj.set_index('Player') + st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True) + + st.download_button( + label="Export Tables", + data=convert_df_to_csv(final_Proj), + file_name='Custom_NFL_rb_export.csv', + mime='text/csv', + ) with tab5: col1, col2 = st.columns([1, 5]) with col1: st.info(t_stamp) if st.button("Load/Reset Data", key='reset5'): - st.cache_data.clear() - player_stats, dk_stacks_raw, fd_stacks_raw, dk_roo_raw, fd_roo_raw, site_slates = player_stat_table() - t_stamp = f"Last Update: " + str(dk_roo_raw['timestamp'][0]) + f" CST" + st.cache_data.clear() + player_stats, dk_stacks_raw, fd_stacks_raw, dk_roo_raw, fd_roo_raw, site_slates = player_stat_table() + t_stamp = f"Last Update: " + str(dk_roo_raw['timestamp'][0]) + f" CST" slate_var5 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate', 'Late Slate', 'Thurs-Mon Slate'), key='slate_var5') site_var5 = st.radio("What table would you like to display?", ('Draftkings', 'Fanduel'), key='site_var5') + view_var5 = st.radio("What view would you like to display?", ('Advanced', 'Simple'), key='view_var5') custom_var5 = st.radio("Are you creating a custom table?", ('No', 'Yes'), key='custom_var5') if custom_var5 == 'No': - if site_var5 == 'Draftkings': - raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var5)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_wrs'] - raw_baselines = raw_baselines.iloc[:,:-3] - elif site_var5 == 'Fanduel': - raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var5)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_wrs'] - raw_baselines = raw_baselines.iloc[:,:-3] - split_var5 = st.radio("Would you like to view the whole slate or just specific games?", ('Full Slate Run', 'Specific Games'), key='split_var5') - if split_var5 == 'Specific Games': - team_var5 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var5') - elif split_var5 == 'Full Slate Run': - team_var5 = raw_baselines.Team.values.tolist() - pos_split5 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split5') - if pos_split5 == 'Specific Positions': - pos_var5 = st.multiselect('What Positions would you like to view?', options = ['WR'], key='pos_var5') - elif pos_split5 == 'All Positions': - pos_var5 = 'All' - sal_var5 = st.slider("Is there a certain price range you want to view?", 2000, 15000, (2000, 15000), key='sal_var5') + if site_var5 == 'Draftkings': + raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var5)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_wrs'] + raw_baselines = raw_baselines.iloc[:,:-3] + elif site_var5 == 'Fanduel': + raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var5)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_wrs'] + raw_baselines = raw_baselines.iloc[:,:-3] + split_var5 = st.radio("Would you like to view the whole slate or just specific games?", ('Full Slate Run', 'Specific Games'), key='split_var5') + if split_var5 == 'Specific Games': + team_var5 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var5') + elif split_var5 == 'Full Slate Run': + team_var5 = raw_baselines.Team.values.tolist() + pos_split5 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split5') + if pos_split5 == 'Specific Positions': + pos_var5 = st.multiselect('What Positions would you like to view?', options = ['WR'], key='pos_var5') + elif pos_split5 == 'All Positions': + pos_var5 = 'All' + sal_var5 = st.slider("Is there a certain price range you want to view?", 2000, 15000, (2000, 15000), key='sal_var5') if custom_var5 == 'Yes': - contest_var5 = st.selectbox("What contest type are you running for?", ('Cash', 'Small Field GPP', 'Large Field GPP'), key='contest_var5') - if site_var5 == 'Draftkings': - raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var5)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_wrs'] - elif site_var5 == 'Fanduel': - raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var5)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_wrs'] - split_var5 = st.radio("Are you running the full slate or certain games?", ('Full Slate Run', 'Specific Games'), key='split_var5') - if split_var5 == 'Specific Games': - team_var5 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var5') - elif split_var5 == 'Full Slate Run': - team_var5 = raw_baselines.Team.values.tolist() - pos_split5 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split5') - if pos_split5 == 'Specific Positions': - pos_var5 = st.multiselect('What Positions would you like to view?', options = ['WR']) - elif pos_split5 == 'All Positions': - pos_var5 = 'All' - sal_var5 = st.slider("Is there a certain price range you want to view?", 2000, 15000, (2000, 15000), key='sal_var5') + contest_var5 = st.selectbox("What contest type are you running for?", ('Cash', 'Small Field GPP', 'Large Field GPP'), key='contest_var5') + if site_var5 == 'Draftkings': + raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var5)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_wrs'] + elif site_var5 == 'Fanduel': + raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var5)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_wrs'] + split_var5 = st.radio("Are you running the full slate or certain games?", ('Full Slate Run', 'Specific Games'), key='split_var5') + if split_var5 == 'Specific Games': + team_var5 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var5') + elif split_var5 == 'Full Slate Run': + team_var5 = raw_baselines.Team.values.tolist() + pos_split5 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split5') + if pos_split5 == 'Specific Positions': + pos_var5 = st.multiselect('What Positions would you like to view?', options = ['WR']) + elif pos_split5 == 'All Positions': + pos_var5 = 'All' + sal_var5 = st.slider("Is there a certain price range you want to view?", 2000, 15000, (2000, 15000), key='sal_var5') with col2: @@ -884,12 +932,17 @@ with tab5: final_Proj = final_Proj[final_Proj['Salary'] >= sal_var5[0]] final_Proj = final_Proj[final_Proj['Salary'] <= sal_var5[1]] if pos_var5 != 'All': - final_Proj = raw_baselines[raw_baselines['Position'].str.contains('|'.join(pos_var5))] - final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] - final_Proj = final_Proj.set_index('Player') - final_Proj = final_Proj.sort_values(by='Median', ascending=False) + final_Proj = raw_baselines[raw_baselines['Position'].str.contains('|'.join(pos_var5))] + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] + final_Proj = final_Proj.set_index('Player') + final_Proj = final_Proj.sort_values(by='Median', ascending=False) - final_Proj = final_Proj.set_index('Player') + if view_var5 == 'Simple': + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Salary', 'Median', 'Top_5_finish', '4x%']] + final_Proj = final_Proj.set_index('Player') + elif view_var5 == 'Advanced': + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] + final_Proj = final_Proj.set_index('Player') st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True) st.download_button( label="Export Tables", @@ -898,162 +951,169 @@ with tab5: mime='text/csv', ) elif custom_var5 == 'Yes': - hold_container = st.empty() - if st.button('Create Range of Outcomes for Slate'): - with hold_container: - if site_var5 == 'Draftkings': - working_roo = player_stats - working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "PPR": "Fantasy"}, inplace = True) - working_roo.replace('', 0, inplace=True) - working_roo = working_roo[working_roo['Position'] == 'WR'] - if site_var5 == 'Fanduel': - working_roo = player_stats - working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "Half_PPR": "Fantasy"}, inplace = True) - working_roo.replace('', 0, inplace=True) - working_roo = working_roo[working_roo['Position'] == 'WR'] - working_roo = working_roo[working_roo['Team'].isin(team_var5)] - working_roo = working_roo[working_roo['Salary'] >= sal_var5[0]] - working_roo = working_roo[working_roo['Salary'] <= sal_var5[1]] - own_dict = dict(zip(working_roo.Player, working_roo.Own)) - team_dict = dict(zip(working_roo.Player, working_roo.Team)) - opp_dict = dict(zip(working_roo.Player, working_roo.Opp)) - total_sims = 1000 - - flex_file = working_roo[['Player', 'Position', 'Salary', 'Fantasy', 'Rush Yards', 'Receptions']] - flex_file.rename(columns={"Fantasy": "Median", "Pos": "Position"}, inplace = True) - flex_file['Floor'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median']*.25) + (flex_file['Rush Yards']*.01),flex_file['Median']*.25) - flex_file['Ceiling'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median'] + flex_file['Floor']) + (flex_file['Rush Yards']*.01), flex_file['Median'] + flex_file['Floor'] + flex_file['Receptions']) - flex_file['STD'] = (flex_file['Median']/4) + flex_file['Receptions'] - flex_file = flex_file[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']] - hold_file = flex_file - overall_file = flex_file - salary_file = flex_file - - overall_players = overall_file[['Player']] - - for x in range(0,total_sims): - salary_file[x] = salary_file['Salary'] - - salary_file=salary_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) - salary_file.astype('int').dtypes - - salary_file = salary_file.div(1000) - - for x in range(0,total_sims): - overall_file[x] = np.random.normal(overall_file['Median'],overall_file['STD']) - - overall_file=overall_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) - overall_file.astype('int').dtypes - - players_only = hold_file[['Player']] - raw_lineups_file = players_only - - for x in range(0,total_sims): - maps_dict = {'proj_map':dict(zip(hold_file.Player,hold_file[x]))} - raw_lineups_file[x] = sum([raw_lineups_file['Player'].map(maps_dict['proj_map'])]) - players_only[x] = raw_lineups_file[x].rank(ascending=False) - - players_only=players_only.drop(['Player'], axis=1) - players_only.astype('int').dtypes - - salary_2x_check = (overall_file - (salary_file*2)) - salary_3x_check = (overall_file - (salary_file*3)) - salary_4x_check = (overall_file - (salary_file*4)) - - players_only['Average_Rank'] = players_only.mean(axis=1) - players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims - players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims - players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims - players_only['20+%'] = overall_file[overall_file >= 20].count(axis=1)/float(total_sims) - players_only['2x%'] = salary_2x_check[salary_2x_check >= 1].count(axis=1)/float(total_sims) - players_only['3x%'] = salary_3x_check[salary_3x_check >= 1].count(axis=1)/float(total_sims) - players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims) - - players_only['Player'] = hold_file[['Player']] - - final_outcomes = players_only[['Player', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']] - - final_Proj = pd.merge(hold_file, final_outcomes, on="Player") - final_Proj = final_Proj[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']] - final_Proj['Own'] = final_Proj['Player'].map(own_dict) - final_Proj['Team'] = final_Proj['Player'].map(team_dict) - final_Proj['Opp'] = final_Proj['Player'].map(opp_dict) - final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own']] - final_Proj['Projection Rank'] = final_Proj.Median.rank(pct = True) - final_Proj['Own Rank'] = final_Proj.Own.rank(pct = True) - final_Proj['LevX'] = 0 - final_Proj['LevX'] = np.where(final_Proj['Position'] == 'QB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) - final_Proj['LevX'] = np.where(final_Proj['Position'] == 'TE', final_Proj[['Projection Rank', '2x%']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) - final_Proj['LevX'] = np.where(final_Proj['Position'] == 'RB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['20+%'] - final_Proj['Own Rank'], final_Proj['LevX']) - final_Proj['LevX'] = np.where(final_Proj['Position'] == 'WR', final_Proj[['Projection Rank', 'Top_10_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) - final_Proj['CPT_Own'] = final_Proj['Own'] / 4 - - final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] - final_Proj = final_Proj.set_index('Player') - final_Proj = final_Proj.sort_values(by='Median', ascending=False) - - with hold_container: - hold_container = st.empty() - final_Proj = final_Proj - st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True) - - st.download_button( - label="Export Tables", - data=convert_df_to_csv(final_Proj), - file_name='Custom_NFL_wr_export.csv', - mime='text/csv', - ) + hold_container = st.empty() + if st.button('Create Range of Outcomes for Slate'): + with hold_container: + if site_var5 == 'Draftkings': + working_roo = player_stats + working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "PPR": "Fantasy"}, inplace = True) + working_roo.replace('', 0, inplace=True) + working_roo = working_roo[working_roo['Position'] == 'WR'] + if site_var5 == 'Fanduel': + working_roo = player_stats + working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "Half_PPR": "Fantasy"}, inplace = True) + working_roo.replace('', 0, inplace=True) + working_roo = working_roo[working_roo['Position'] == 'WR'] + working_roo = working_roo[working_roo['Team'].isin(team_var5)] + working_roo = working_roo[working_roo['Salary'] >= sal_var5[0]] + working_roo = working_roo[working_roo['Salary'] <= sal_var5[1]] + own_dict = dict(zip(working_roo.Player, working_roo.Own)) + team_dict = dict(zip(working_roo.Player, working_roo.Team)) + opp_dict = dict(zip(working_roo.Player, working_roo.Opp)) + total_sims = 1000 + + flex_file = working_roo[['Player', 'Position', 'Salary', 'Fantasy', 'Rush Yards', 'Receptions']] + flex_file.rename(columns={"Fantasy": "Median", "Pos": "Position"}, inplace = True) + flex_file['Floor'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median']*.25) + (flex_file['Rush Yards']*.01),flex_file['Median']*.25) + flex_file['Ceiling'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median'] + flex_file['Floor']) + (flex_file['Rush Yards']*.01), flex_file['Median'] + flex_file['Floor'] + flex_file['Receptions']) + flex_file['STD'] = (flex_file['Median']/4) + flex_file['Receptions'] + flex_file = flex_file[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']] + hold_file = flex_file + overall_file = flex_file + salary_file = flex_file + + overall_players = overall_file[['Player']] + + for x in range(0,total_sims): + salary_file[x] = salary_file['Salary'] + + salary_file=salary_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) + salary_file.astype('int').dtypes + + salary_file = salary_file.div(1000) + + for x in range(0,total_sims): + overall_file[x] = np.random.normal(overall_file['Median'],overall_file['STD']) + + overall_file=overall_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) + overall_file.astype('int').dtypes + + players_only = hold_file[['Player']] + raw_lineups_file = players_only + + for x in range(0,total_sims): + maps_dict = {'proj_map':dict(zip(hold_file.Player,hold_file[x]))} + raw_lineups_file[x] = sum([raw_lineups_file['Player'].map(maps_dict['proj_map'])]) + players_only[x] = raw_lineups_file[x].rank(ascending=False) + + players_only=players_only.drop(['Player'], axis=1) + players_only.astype('int').dtypes + + salary_2x_check = (overall_file - (salary_file*2)) + salary_3x_check = (overall_file - (salary_file*3)) + salary_4x_check = (overall_file - (salary_file*4)) + + players_only['Average_Rank'] = players_only.mean(axis=1) + players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims + players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims + players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims + players_only['20+%'] = overall_file[overall_file >= 20].count(axis=1)/float(total_sims) + players_only['2x%'] = salary_2x_check[salary_2x_check >= 1].count(axis=1)/float(total_sims) + players_only['3x%'] = salary_3x_check[salary_3x_check >= 1].count(axis=1)/float(total_sims) + players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims) + + players_only['Player'] = hold_file[['Player']] + + final_outcomes = players_only[['Player', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']] + + final_Proj = pd.merge(hold_file, final_outcomes, on="Player") + final_Proj = final_Proj[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']] + final_Proj['Own'] = final_Proj['Player'].map(own_dict) + final_Proj['Team'] = final_Proj['Player'].map(team_dict) + final_Proj['Opp'] = final_Proj['Player'].map(opp_dict) + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own']] + final_Proj['Projection Rank'] = final_Proj.Median.rank(pct = True) + final_Proj['Own Rank'] = final_Proj.Own.rank(pct = True) + final_Proj['LevX'] = 0 + final_Proj['LevX'] = np.where(final_Proj['Position'] == 'QB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) + final_Proj['LevX'] = np.where(final_Proj['Position'] == 'TE', final_Proj[['Projection Rank', '2x%']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) + final_Proj['LevX'] = np.where(final_Proj['Position'] == 'RB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['20+%'] - final_Proj['Own Rank'], final_Proj['LevX']) + final_Proj['LevX'] = np.where(final_Proj['Position'] == 'WR', final_Proj[['Projection Rank', 'Top_10_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) + final_Proj['CPT_Own'] = final_Proj['Own'] / 4 + + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] + final_Proj = final_Proj.set_index('Player') + final_Proj = final_Proj.sort_values(by='Median', ascending=False) + + with hold_container: + hold_container = st.empty() + final_Proj = final_Proj + if view_var5 == 'Simple': + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Salary', 'Median', 'Top_5_finish', '4x%']] + final_Proj = final_Proj.set_index('Player') + elif view_var5 == 'Advanced': + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] + final_Proj = final_Proj.set_index('Player') + st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True) + + st.download_button( + label="Export Tables", + data=convert_df_to_csv(final_Proj), + file_name='Custom_NFL_wr_export.csv', + mime='text/csv', + ) with tab6: col1, col2 = st.columns([1, 5]) with col1: st.info(t_stamp) if st.button("Load/Reset Data", key='reset6'): - st.cache_data.clear() - player_stats, dk_stacks_raw, fd_stacks_raw, dk_roo_raw, fd_roo_raw, site_slates = player_stat_table() - t_stamp = f"Last Update: " + str(dk_roo_raw['timestamp'][0]) + f" CST" + st.cache_data.clear() + player_stats, dk_stacks_raw, fd_stacks_raw, dk_roo_raw, fd_roo_raw, site_slates = player_stat_table() + t_stamp = f"Last Update: " + str(dk_roo_raw['timestamp'][0]) + f" CST" slate_var6 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate', 'Late Slate', 'Thurs-Mon Slate'), key='slate_var6') site_var6 = st.radio("What table would you like to display?", ('Draftkings', 'Fanduel'), key='site_var6') + view_var6 = st.radio("What view would you like to display?", ('Advanced', 'Simple'), key='view_var6') custom_var6 = st.radio("Are you creating a custom table?", ('No', 'Yes'), key='custom_var6') if custom_var6 == 'No': - if site_var6 == 'Draftkings': - raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var6)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_tes'] - raw_baselines = raw_baselines.iloc[:,:-3] - elif site_var6 == 'Fanduel': - raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var6)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_tes'] - raw_baselines = raw_baselines.iloc[:,:-3] - split_var6 = st.radio("Would you like to view the whole slate or just specific games?", ('Full Slate Run', 'Specific Games'), key='split_var6') - if split_var6 == 'Specific Games': - team_var6 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var6') - elif split_var6 == 'Full Slate Run': - team_var6 = raw_baselines.Team.values.tolist() - pos_split6 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split6') - if pos_split6 == 'Specific Positions': - pos_var6 = st.multiselect('What Positions would you like to view?', options = ['TE'], key='pos_var6') - elif pos_split5 == 'All Positions': - pos_var6 = 'All' - sal_var6 = st.slider("Is there a certain price range you want to view?", 2000, 15000, (2000, 15000), key='sal_var6') + if site_var6 == 'Draftkings': + raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var6)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_tes'] + raw_baselines = raw_baselines.iloc[:,:-3] + elif site_var6 == 'Fanduel': + raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var6)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_tes'] + raw_baselines = raw_baselines.iloc[:,:-3] + split_var6 = st.radio("Would you like to view the whole slate or just specific games?", ('Full Slate Run', 'Specific Games'), key='split_var6') + if split_var6 == 'Specific Games': + team_var6 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var6') + elif split_var6 == 'Full Slate Run': + team_var6 = raw_baselines.Team.values.tolist() + pos_split6 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split6') + if pos_split6 == 'Specific Positions': + pos_var6 = st.multiselect('What Positions would you like to view?', options = ['TE'], key='pos_var6') + elif pos_split5 == 'All Positions': + pos_var6 = 'All' + sal_var6 = st.slider("Is there a certain price range you want to view?", 2000, 15000, (2000, 15000), key='sal_var6') if custom_var6 == 'Yes': - contest_var6 = st.selectbox("What contest type are you running for?", ('Cash', 'Small Field GPP', 'Large Field GPP'), key='contest_var6') - if site_var6 == 'Draftkings': - raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var6)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_tes'] - elif site_var6 == 'Fanduel': - raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var6)] - raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_tes'] - split_var6 = st.radio("Are you running the full slate or certain games?", ('Full Slate Run', 'Specific Games'), key='split_var6') - if split_var6 == 'Specific Games': - team_var6 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var6') - elif split_var6 == 'Full Slate Run': - team_var6 = raw_baselines.Team.values.tolist() - pos_split6 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split6') - if pos_split6 == 'Specific Positions': - pos_var6 = st.multiselect('What Positions would you like to view?', options = ['TE']) - elif pos_split6 == 'All Positions': - pos_var6 = 'All' - sal_var6 = st.slider("Is there a certain price range you want to view?", 2000, 15000, (2000, 15000), key='sal_var6') + contest_var6 = st.selectbox("What contest type are you running for?", ('Cash', 'Small Field GPP', 'Large Field GPP'), key='contest_var6') + if site_var6 == 'Draftkings': + raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var6)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_tes'] + elif site_var6 == 'Fanduel': + raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var6)] + raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_tes'] + split_var6 = st.radio("Are you running the full slate or certain games?", ('Full Slate Run', 'Specific Games'), key='split_var6') + if split_var6 == 'Specific Games': + team_var6 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var6') + elif split_var6 == 'Full Slate Run': + team_var6 = raw_baselines.Team.values.tolist() + pos_split6 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split6') + if pos_split6 == 'Specific Positions': + pos_var6 = st.multiselect('What Positions would you like to view?', options = ['TE']) + elif pos_split6 == 'All Positions': + pos_var6 = 'All' + sal_var6 = st.slider("Is there a certain price range you want to view?", 2000, 15000, (2000, 15000), key='sal_var6') with col2: @@ -1062,12 +1122,17 @@ with tab6: final_Proj = final_Proj[final_Proj['Salary'] >= sal_var6[0]] final_Proj = final_Proj[final_Proj['Salary'] <= sal_var6[1]] if pos_var6 != 'All': - final_Proj = raw_baselines[raw_baselines['Position'].str.contains('|'.join(pos_var6))] - final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] - final_Proj = final_Proj.set_index('Player') - final_Proj = final_Proj.sort_values(by='Median', ascending=False) + final_Proj = raw_baselines[raw_baselines['Position'].str.contains('|'.join(pos_var6))] + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] + final_Proj = final_Proj.set_index('Player') + final_Proj = final_Proj.sort_values(by='Median', ascending=False) - final_Proj = final_Proj.set_index('Player') + if view_var6 == 'Simple': + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Salary', 'Median', 'Top_5_finish', '4x%']] + final_Proj = final_Proj.set_index('Player') + elif view_var6 == 'Advanced': + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] + final_Proj = final_Proj.set_index('Player') st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True) st.download_button( label="Export Tables", @@ -1076,108 +1141,114 @@ with tab6: mime='text/csv', ) elif custom_var6 == 'Yes': - hold_container = st.empty() - if st.button('Create Range of Outcomes for Slate'): - with hold_container: - if site_var6 == 'Draftkings': - working_roo = player_stats - working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "PPR": "Fantasy"}, inplace = True) - working_roo.replace('', 0, inplace=True) - working_roo = working_roo[working_roo['Position'] == 'TE'] - if site_var6 == 'Fanduel': - working_roo = player_stats - working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "Half_PPR": "Fantasy"}, inplace = True) - working_roo.replace('', 0, inplace=True) - working_roo = working_roo[working_roo['Position'] == 'TE'] - working_roo = working_roo[working_roo['Team'].isin(team_var6)] - working_roo = working_roo[working_roo['Salary'] >= sal_var6[0]] - working_roo = working_roo[working_roo['Salary'] <= sal_var6[1]] - own_dict = dict(zip(working_roo.Player, working_roo.Own)) - team_dict = dict(zip(working_roo.Player, working_roo.Team)) - opp_dict = dict(zip(working_roo.Player, working_roo.Opp)) - total_sims = 1000 - - flex_file = working_roo[['Player', 'Position', 'Salary', 'Fantasy', 'Rush Yards', 'Receptions']] - flex_file.rename(columns={"Fantasy": "Median", "Pos": "Position"}, inplace = True) - flex_file['Floor'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median']*.25) + (flex_file['Rush Yards']*.01),flex_file['Median']*.25) - flex_file['Ceiling'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median'] + flex_file['Floor']) + (flex_file['Rush Yards']*.01), flex_file['Median'] + flex_file['Floor'] + flex_file['Receptions']) - flex_file['STD'] = (flex_file['Median']/4) + flex_file['Receptions'] - flex_file = flex_file[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']] - hold_file = flex_file - overall_file = flex_file - salary_file = flex_file - - overall_players = overall_file[['Player']] - - for x in range(0,total_sims): - salary_file[x] = salary_file['Salary'] - - salary_file=salary_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) - salary_file.astype('int').dtypes - - salary_file = salary_file.div(1000) - - for x in range(0,total_sims): - overall_file[x] = np.random.normal(overall_file['Median'],overall_file['STD']) - - overall_file=overall_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) - overall_file.astype('int').dtypes - - players_only = hold_file[['Player']] - raw_lineups_file = players_only - - for x in range(0,total_sims): - maps_dict = {'proj_map':dict(zip(hold_file.Player,hold_file[x]))} - raw_lineups_file[x] = sum([raw_lineups_file['Player'].map(maps_dict['proj_map'])]) - players_only[x] = raw_lineups_file[x].rank(ascending=False) - - players_only=players_only.drop(['Player'], axis=1) - players_only.astype('int').dtypes - - salary_2x_check = (overall_file - (salary_file*2)) - salary_3x_check = (overall_file - (salary_file*3)) - salary_4x_check = (overall_file - (salary_file*4)) - - players_only['Average_Rank'] = players_only.mean(axis=1) - players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims - players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims - players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims - players_only['20+%'] = overall_file[overall_file >= 20].count(axis=1)/float(total_sims) - players_only['2x%'] = salary_2x_check[salary_2x_check >= 1].count(axis=1)/float(total_sims) - players_only['3x%'] = salary_3x_check[salary_3x_check >= 1].count(axis=1)/float(total_sims) - players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims) - - players_only['Player'] = hold_file[['Player']] - - final_outcomes = players_only[['Player', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']] - - final_Proj = pd.merge(hold_file, final_outcomes, on="Player") - final_Proj = final_Proj[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']] - final_Proj['Own'] = final_Proj['Player'].map(own_dict) - final_Proj['Team'] = final_Proj['Player'].map(team_dict) - final_Proj['Opp'] = final_Proj['Player'].map(opp_dict) - final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own']] - final_Proj['Projection Rank'] = final_Proj.Median.rank(pct = True) - final_Proj['Own Rank'] = final_Proj.Own.rank(pct = True) - final_Proj['LevX'] = 0 - final_Proj['LevX'] = np.where(final_Proj['Position'] == 'QB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) - final_Proj['LevX'] = np.where(final_Proj['Position'] == 'TE', final_Proj[['Projection Rank', '2x%']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) - final_Proj['LevX'] = np.where(final_Proj['Position'] == 'RB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['20+%'] - final_Proj['Own Rank'], final_Proj['LevX']) - final_Proj['LevX'] = np.where(final_Proj['Position'] == 'WR', final_Proj[['Projection Rank', 'Top_10_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) - final_Proj['CPT_Own'] = final_Proj['Own'] / 4 - - final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] - final_Proj = final_Proj.set_index('Player') - final_Proj = final_Proj.sort_values(by='Median', ascending=False) - - with hold_container: - hold_container = st.empty() - final_Proj = final_Proj - st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True) - - st.download_button( - label="Export Tables", - data=convert_df_to_csv(final_Proj), - file_name='Custom_NFL_te_export.csv', - mime='text/csv', - ) + hold_container = st.empty() + if st.button('Create Range of Outcomes for Slate'): + with hold_container: + if site_var6 == 'Draftkings': + working_roo = player_stats + working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "PPR": "Fantasy"}, inplace = True) + working_roo.replace('', 0, inplace=True) + working_roo = working_roo[working_roo['Position'] == 'TE'] + if site_var6 == 'Fanduel': + working_roo = player_stats + working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "Half_PPR": "Fantasy"}, inplace = True) + working_roo.replace('', 0, inplace=True) + working_roo = working_roo[working_roo['Position'] == 'TE'] + working_roo = working_roo[working_roo['Team'].isin(team_var6)] + working_roo = working_roo[working_roo['Salary'] >= sal_var6[0]] + working_roo = working_roo[working_roo['Salary'] <= sal_var6[1]] + own_dict = dict(zip(working_roo.Player, working_roo.Own)) + team_dict = dict(zip(working_roo.Player, working_roo.Team)) + opp_dict = dict(zip(working_roo.Player, working_roo.Opp)) + total_sims = 1000 + + flex_file = working_roo[['Player', 'Position', 'Salary', 'Fantasy', 'Rush Yards', 'Receptions']] + flex_file.rename(columns={"Fantasy": "Median", "Pos": "Position"}, inplace = True) + flex_file['Floor'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median']*.25) + (flex_file['Rush Yards']*.01),flex_file['Median']*.25) + flex_file['Ceiling'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median'] + flex_file['Floor']) + (flex_file['Rush Yards']*.01), flex_file['Median'] + flex_file['Floor'] + flex_file['Receptions']) + flex_file['STD'] = (flex_file['Median']/4) + flex_file['Receptions'] + flex_file = flex_file[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']] + hold_file = flex_file + overall_file = flex_file + salary_file = flex_file + + overall_players = overall_file[['Player']] + + for x in range(0,total_sims): + salary_file[x] = salary_file['Salary'] + + salary_file=salary_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) + salary_file.astype('int').dtypes + + salary_file = salary_file.div(1000) + + for x in range(0,total_sims): + overall_file[x] = np.random.normal(overall_file['Median'],overall_file['STD']) + + overall_file=overall_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1) + overall_file.astype('int').dtypes + + players_only = hold_file[['Player']] + raw_lineups_file = players_only + + for x in range(0,total_sims): + maps_dict = {'proj_map':dict(zip(hold_file.Player,hold_file[x]))} + raw_lineups_file[x] = sum([raw_lineups_file['Player'].map(maps_dict['proj_map'])]) + players_only[x] = raw_lineups_file[x].rank(ascending=False) + + players_only=players_only.drop(['Player'], axis=1) + players_only.astype('int').dtypes + + salary_2x_check = (overall_file - (salary_file*2)) + salary_3x_check = (overall_file - (salary_file*3)) + salary_4x_check = (overall_file - (salary_file*4)) + + players_only['Average_Rank'] = players_only.mean(axis=1) + players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims + players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims + players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims + players_only['20+%'] = overall_file[overall_file >= 20].count(axis=1)/float(total_sims) + players_only['2x%'] = salary_2x_check[salary_2x_check >= 1].count(axis=1)/float(total_sims) + players_only['3x%'] = salary_3x_check[salary_3x_check >= 1].count(axis=1)/float(total_sims) + players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims) + + players_only['Player'] = hold_file[['Player']] + + final_outcomes = players_only[['Player', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']] + + final_Proj = pd.merge(hold_file, final_outcomes, on="Player") + final_Proj = final_Proj[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']] + final_Proj['Own'] = final_Proj['Player'].map(own_dict) + final_Proj['Team'] = final_Proj['Player'].map(team_dict) + final_Proj['Opp'] = final_Proj['Player'].map(opp_dict) + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own']] + final_Proj['Projection Rank'] = final_Proj.Median.rank(pct = True) + final_Proj['Own Rank'] = final_Proj.Own.rank(pct = True) + final_Proj['LevX'] = 0 + final_Proj['LevX'] = np.where(final_Proj['Position'] == 'QB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) + final_Proj['LevX'] = np.where(final_Proj['Position'] == 'TE', final_Proj[['Projection Rank', '2x%']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) + final_Proj['LevX'] = np.where(final_Proj['Position'] == 'RB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['20+%'] - final_Proj['Own Rank'], final_Proj['LevX']) + final_Proj['LevX'] = np.where(final_Proj['Position'] == 'WR', final_Proj[['Projection Rank', 'Top_10_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX']) + final_Proj['CPT_Own'] = final_Proj['Own'] / 4 + + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] + final_Proj = final_Proj.set_index('Player') + final_Proj = final_Proj.sort_values(by='Median', ascending=False) + + with hold_container: + hold_container = st.empty() + final_Proj = final_Proj + if view_var6 == 'Simple': + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Salary', 'Median', 'Top_5_finish', '4x%']] + final_Proj = final_Proj.set_index('Player') + elif view_var6 == 'Advanced': + final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']] + final_Proj = final_Proj.set_index('Player') + st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True) + + st.download_button( + label="Export Tables", + data=convert_df_to_csv(final_Proj), + file_name='Custom_NFL_te_export.csv', + mime='text/csv', + )