Multichem commited on
Commit
ce34454
·
1 Parent(s): 4736f76

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +379 -382
app.py CHANGED
@@ -9,6 +9,9 @@ import numpy as np
9
  import pandas as pd
10
  import streamlit as st
11
  import gspread
 
 
 
12
 
13
  @st.cache_resource
14
  def init_conn():
@@ -750,406 +753,400 @@ with tab2:
750
  scaling_var = 15
751
 
752
  with col2:
753
- if st.button("Simulate Contest", key='sim1'):
754
- try:
755
- del dst_freq
756
- del flex_freq
757
- del te_freq
758
- del wr_freq
759
- del rb_freq
760
- del qb_freq
761
- del player_freq
762
- del Sim_Winner_Export
763
- del Sim_Winner_Frame
764
- except:
765
- pass
766
- with st.container():
767
- st.write('Contest Simulation Starting')
768
- Total_Runs = 1000000
769
- seed_depth1 = 5
770
- Total_Runs = 2500000
771
- if Contest_Size <= 1000:
772
- strength_grow = .01
773
- elif Contest_Size > 1000 and Contest_Size <= 2500:
774
- strength_grow = .025
775
- elif Contest_Size > 2500 and Contest_Size <= 5000:
776
- strength_grow = .05
777
- elif Contest_Size > 5000 and Contest_Size <= 20000:
778
- strength_grow = .075
779
- elif Contest_Size > 20000:
780
- strength_grow = .1
781
-
782
- field_growth = 100 * strength_grow
783
-
784
- Sort_function = 'Median'
785
- if Sort_function == 'Median':
786
- Sim_function = 'Projection'
787
- elif Sort_function == 'Own':
788
- Sim_function = 'Own'
789
-
790
- if slate_var1 == 'User':
791
- OwnFrame = proj_dataframe
792
- if contest_var1 == 'Large':
793
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (10 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
794
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (5 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
795
- OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
796
- OwnFrame['Own'] = OwnFrame['Own%'] * (500 / OwnFrame['Own%'].sum())
797
- if contest_var1 == 'Medium':
798
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (6 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
799
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (3 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
800
- OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
801
- OwnFrame['Own'] = OwnFrame['Own%'] * (500 / OwnFrame['Own%'].sum())
802
- if contest_var1 == 'Small':
803
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (3 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
804
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (1.5 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
805
- OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
806
- OwnFrame['Own'] = OwnFrame['Own%'] * (500 / OwnFrame['Own%'].sum())
807
- Overall_Proj = OwnFrame[['Player', 'Team', 'Position', 'Median', 'Own', 'Salary']]
808
-
809
- del OwnFrame
810
-
811
- elif slate_var1 != 'User':
812
- initial_proj = raw_baselines
813
- drop_frame = initial_proj.drop_duplicates(subset = 'Player',keep = 'first')
814
- OwnFrame = drop_frame[['Player', 'Team', 'Position', 'Median', 'Own', 'Floor', 'Ceiling', 'Salary']]
815
- if contest_var1 == 'Large':
816
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (10 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
817
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (5 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
818
- OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
819
- OwnFrame['Own'] = OwnFrame['Own%'] * (500 / OwnFrame['Own%'].sum())
820
- if contest_var1 == 'Medium':
821
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (6 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
822
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (3 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
823
- OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
824
- OwnFrame['Own'] = OwnFrame['Own%'] * (500 / OwnFrame['Own%'].sum())
825
- if contest_var1 == 'Small':
826
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (3 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
827
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (1.5 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
828
- OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
829
- OwnFrame['Own'] = OwnFrame['Own%'] * (500 / OwnFrame['Own%'].sum())
830
- Overall_Proj = OwnFrame[['Player', 'Team', 'Position', 'Median', 'Own', 'Floor', 'Ceiling', 'Salary']]
831
-
832
- del initial_proj
833
- del drop_frame
834
- del OwnFrame
835
-
836
- if insert_port == 1:
837
- UserPortfolio = portfolio_dataframe[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5']]
838
- elif insert_port == 0:
839
- UserPortfolio = pd.DataFrame(columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5'])
840
-
841
- Overall_Proj.replace('', np.nan, inplace=True)
842
- Overall_Proj = Overall_Proj.dropna(subset=['Median'])
843
- Overall_Proj = Overall_Proj.assign(Value=lambda x: (x.Median / (x.Salary / 1000)))
844
- Overall_Proj['Sort_var'] = (Overall_Proj['Median'].rank(ascending=False) + Overall_Proj['Value'].rank(ascending=False)) / 2
845
- Overall_Proj = Overall_Proj.sort_values(by='Sort_var', ascending=False)
846
- Overall_Proj['Own'] = np.where((Overall_Proj['Median'] > 0) & (Overall_Proj['Own'] == 0), 1, Overall_Proj['Own'])
847
- Overall_Proj = Overall_Proj.loc[Overall_Proj['Own'] > 0]
848
-
849
- Overall_Proj['Floor'] = np.where(Overall_Proj['Position'] == 'QB', Overall_Proj['Median'] * .5, Overall_Proj['Median'] * .25)
850
- Overall_Proj['Ceiling'] = np.where(Overall_Proj['Position'] == 'WR', Overall_Proj['Median'] + Overall_Proj['Median'], Overall_Proj['Median'] + Overall_Proj['Floor'])
851
- Overall_Proj['STDev'] = Overall_Proj['Median'] / 4
852
-
853
- Teams_used = Overall_Proj['Team'].drop_duplicates().reset_index(drop=True)
854
- Teams_used = Teams_used.reset_index()
855
- Teams_used['team_item'] = Teams_used['index'] + 1
856
- Teams_used = Teams_used.drop(columns=['index'])
857
- Teams_used_dictraw = Teams_used.drop(columns=['team_item'])
858
- Teams_used_dict = Teams_used_dictraw.to_dict()
859
-
860
- del Teams_used_dictraw
861
-
862
- team_list = Teams_used['Team'].to_list()
863
- item_list = Teams_used['team_item'].to_list()
864
-
865
- FieldStrength_raw = Strength_var + ((30 - len(Teams_used)) * .01)
866
- FieldStrength = FieldStrength_raw - (FieldStrength_raw * (20000 / Contest_Size))
867
-
868
- del FieldStrength_raw
869
-
870
- if FieldStrength < 0:
871
- FieldStrength = Strength_var
872
- field_split = Strength_var
873
-
874
- for checkVar in range(len(team_list)):
875
- Overall_Proj['Team'] = Overall_Proj['Team'].replace(team_list, item_list)
876
-
877
- flex_raw = Overall_Proj
878
- flex_raw.dropna(subset=['Median']).reset_index(drop=True)
879
- flex_raw = flex_raw.reset_index(drop=True)
880
- flex_raw = flex_raw.sort_values(by='Own', ascending=False)
881
-
882
- pos_players = flex_raw
883
- pos_players.dropna(subset=['Median']).reset_index(drop=True)
884
- pos_players = pos_players.reset_index(drop=True)
885
-
886
- del flex_raw
887
-
888
- if insert_port == 1:
889
- try:
890
- # Initialize an empty DataFrame to store raw portfolio data
891
- Raw_Portfolio = pd.DataFrame()
892
-
893
- # Split each portfolio column and concatenate to Raw_Portfolio
894
- columns_to_process = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5']
895
- for col in columns_to_process:
896
- temp_df = UserPortfolio[col].str.split("(", n=1, expand=True)
897
- temp_df.columns = [col, 'Drop']
898
- Raw_Portfolio = pd.concat([Raw_Portfolio, temp_df], axis=1)
899
-
900
- # Keep only required variables and remove whitespace
901
- keep_vars = columns_to_process
902
- CleanPortfolio = Raw_Portfolio[keep_vars]
903
- CleanPortfolio = CleanPortfolio.apply(lambda x: x.str.strip())
904
-
905
- # Reset index and clean up the DataFrame
906
- CleanPortfolio.reset_index(inplace=True)
907
- CleanPortfolio['User/Field'] = CleanPortfolio['index'] + 1
908
- CleanPortfolio.drop(columns=['index'], inplace=True)
909
- CleanPortfolio.replace('', np.nan, inplace=True)
910
- CleanPortfolio.dropna(subset=['CPT'], inplace=True)
911
-
912
- # Create cleaport_players DataFrame
913
- unique_vals, counts = np.unique(CleanPortfolio.iloc[:, 0:6].values, return_counts=True)
914
- cleaport_players = pd.DataFrame(np.column_stack([unique_vals, counts]), columns=['Player', 'Freq']).astype({'Freq': int}).sort_values('Freq', ascending=False).reset_index(drop=True)
915
-
916
- # Merge and update nerf_frame DataFrame
917
- nerf_frame = pd.merge(cleaport_players, Overall_Proj, on='Player', how='left')
918
- nerf_frame[['Median', 'Floor', 'Ceiling', 'STDev']] *= 1
919
 
920
- del Raw_Portfolio
921
- except:
922
- # Reset index and perform column-wise operations
923
- CleanPortfolio = UserPortfolio.reset_index(drop=True)
924
- CleanPortfolio['User/Field'] = CleanPortfolio.index + 1
925
- CleanPortfolio.replace('', np.nan, inplace=True)
926
- CleanPortfolio.dropna(subset=['CPT'], inplace=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
927
 
928
- # Create cleaport_players DataFrame
929
- unique_vals, counts = np.unique(CleanPortfolio.iloc[:, 0:6].values, return_counts=True)
930
- cleaport_players = pd.DataFrame({'Player': unique_vals, 'Freq': counts}).sort_values('Freq', ascending=False).reset_index(drop=True).astype({'Freq': int})
931
 
932
- # Merge and update nerf_frame DataFrame
933
- nerf_frame = pd.merge(cleaport_players, Overall_Proj, on='Player', how='left')
934
- nerf_frame[['Median', 'Floor', 'Ceiling', 'STDev']] *= 1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
935
 
936
- st.table(nerf_frame)
937
-
938
- elif insert_port == 0:
939
- CleanPortfolio = UserPortfolio
940
- cleaport_players = pd.DataFrame(np.column_stack(np.unique(CleanPortfolio.iloc[:,0:6].values, return_counts=True)),
941
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
942
- cleaport_players['Freq'] = cleaport_players['Freq'].astype(int)
943
- nerf_frame = Overall_Proj
944
 
945
- ref_dict = {
946
- 'pos':['FLEX'],
947
- 'pos_dfs':['FLEX_Table'],
948
- 'pos_dicts':['flex_dict']
949
- }
950
-
951
- maps_dict = {
952
- 'Floor_map':dict(zip(Overall_Proj.Player,Overall_Proj.Floor)),
953
- 'Projection_map':dict(zip(Overall_Proj.Player,Overall_Proj.Median)),
954
- 'Ceiling_map':dict(zip(Overall_Proj.Player,Overall_Proj.Ceiling)),
955
- 'Salary_map':dict(zip(Overall_Proj.Player,Overall_Proj.Salary)),
956
- 'Pos_map':dict(zip(Overall_Proj.Player,Overall_Proj.Position)),
957
- 'Own_map':dict(zip(Overall_Proj.Player,Overall_Proj.Own)),
958
- 'Team_map':dict(zip(Overall_Proj.Player,Overall_Proj.Team)),
959
- 'STDev_map':dict(zip(Overall_Proj.Player,Overall_Proj.STDev)),
960
- 'team_check_map':dict(zip(Overall_Proj.Player,Overall_Proj.Team))
961
- }
962
-
963
- up_dict = {
964
- 'Floor_map':dict(zip(cleaport_players.Player,nerf_frame.Floor)),
965
- 'Projection_map':dict(zip(cleaport_players.Player,nerf_frame.Median)),
966
- 'Ceiling_map':dict(zip(cleaport_players.Player,nerf_frame.Ceiling)),
967
- 'Salary_map':dict(zip(cleaport_players.Player,nerf_frame.Salary)),
968
- 'Pos_map':dict(zip(cleaport_players.Player,nerf_frame.Position)),
969
- 'Own_map':dict(zip(cleaport_players.Player,nerf_frame.Own)),
970
- 'Team_map':dict(zip(cleaport_players.Player,nerf_frame.Team)),
971
- 'STDev_map':dict(zip(cleaport_players.Player,nerf_frame.STDev)),
972
- 'team_check_map':dict(zip(cleaport_players.Player,nerf_frame.Team))
973
- }
974
-
975
- del Overall_Proj
976
- del nerf_frame
977
-
978
- RunsVar = 1
979
- st.write('Seed frame creation')
980
- FinalPortfolio, maps_dict = run_seed_frame(seed_depth1, Strength_var, strength_grow, Teams_used, Total_Runs)
981
-
982
- Sim_size = linenum_var1
983
- SimVar = 1
984
- Sim_Winners = []
985
- fp_array = FinalPortfolio.values
986
-
987
- if insert_port == 1:
988
- up_array = CleanPortfolio.values
989
-
990
- # Pre-vectorize functions
991
- vec_projection_map = np.vectorize(maps_dict['Projection_map'].__getitem__)
992
- vec_stdev_map = np.vectorize(maps_dict['STDev_map'].__getitem__)
993
-
994
- if insert_port == 1:
995
- vec_up_projection_map = np.vectorize(up_dict['Projection_map'].__getitem__)
996
- vec_up_stdev_map = np.vectorize(up_dict['STDev_map'].__getitem__)
997
- st.write('Simulating contest on frames')
998
- while SimVar <= Sim_size:
999
 
 
 
1000
  if insert_port == 1:
1001
- fp_random = fp_array[np.random.choice(fp_array.shape[0], Contest_Size-len(CleanPortfolio))]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1002
  elif insert_port == 0:
1003
- fp_random = fp_array[np.random.choice(fp_array.shape[0], Contest_Size)]
 
 
 
 
1004
 
1005
- sample_arrays1 = np.c_[
1006
- fp_random,
1007
- np.sum(np.random.normal(
1008
- loc=vec_projection_map(fp_random[:, :-5]),
1009
- scale=vec_stdev_map(fp_random[:, :-5])),
1010
- axis=1)
1011
- ]
1012
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1013
  if insert_port == 1:
1014
- sample_arrays2 = np.c_[
1015
- up_array,
 
 
 
 
 
 
 
 
 
 
1016
  np.sum(np.random.normal(
1017
- loc=vec_up_projection_map(up_array[:, :-5]),
1018
- scale=vec_up_stdev_map(up_array[:, :-5])),
1019
  axis=1)
1020
  ]
1021
- sample_arrays = np.vstack((sample_arrays1, sample_arrays2))
1022
- else:
1023
- sample_arrays = sample_arrays1
1024
-
1025
- final_array = sample_arrays[sample_arrays[:, 10].argsort()[::-1]]
1026
- best_lineup = final_array[final_array[:, -1].argsort(kind='stable')[::-1][:1]]
1027
- Sim_Winners.append(best_lineup)
1028
- SimVar += 1
1029
- st.write('Contest simulation complete')
1030
-
1031
- Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=FinalPortfolio.columns.tolist() + ['Fantasy'])
1032
- Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['Projection'] + Sim_Winner_Frame['Fantasy']) / 2
1033
- Sim_Winner_Frame['Salary'] = Sim_Winner_Frame['Salary'].astype(int)
1034
- Sim_Winner_Frame['Projection'] = Sim_Winner_Frame['Projection'].astype(np.float16)
1035
- Sim_Winner_Frame['Fantasy'] = Sim_Winner_Frame['Fantasy'].astype(np.float16)
1036
- Sim_Winner_Frame['GPP_Proj'] = Sim_Winner_Frame['GPP_Proj'].astype(np.float16)
1037
- st.session_state.Sim_Winner_Frame = Sim_Winner_Frame.sort_values(by='GPP_Proj', ascending=False)
1038
- st.session_state.Sim_Winner_Export = Sim_Winner_Frame.copy()
1039
-
1040
- del Sim_Winner_Frame
1041
-
1042
- player_freq = pd.DataFrame(np.column_stack(np.unique(st.session_state.Sim_Winner_Frame.iloc[:,0:6].values, return_counts=True)),
1043
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1044
- player_freq['Freq'] = player_freq['Freq'].astype(int)
1045
- player_freq['Position'] = player_freq['Player'].map(maps_dict['Pos_map'])
1046
- player_freq['Salary'] = player_freq['Player'].map(maps_dict['Salary_map'])
1047
- player_freq['Proj Own'] = (player_freq['Player'].map(maps_dict['Own_map']) / 100)
1048
- player_freq['Exposure'] = player_freq['Freq']/(Sim_size)
1049
- player_freq['Edge'] = player_freq['Exposure'] - player_freq['Proj Own']
1050
- player_freq['Team'] = player_freq['Player'].map(maps_dict['Team_map'])
1051
- for checkVar in range(len(team_list)):
1052
- player_freq['Team'] = player_freq['Team'].replace(item_list, team_list)
1053
-
1054
- player_freq = player_freq[['Player', 'Position', 'Team', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1055
-
1056
- cpt_freq = pd.DataFrame(np.column_stack(np.unique(st.session_state.Sim_Winner_Frame.iloc[:,0:1].values, return_counts=True)),
1057
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1058
- cpt_freq['Freq'] = cpt_freq['Freq'].astype(int)
1059
- cpt_freq['Position'] = cpt_freq['Player'].map(maps_dict['Pos_map'])
1060
- cpt_freq['Salary'] = cpt_freq['Player'].map(maps_dict['Salary_map'])
1061
- cpt_freq['Proj Own'] = (cpt_freq['Player'].map(maps_dict['Own_map']) / 4) / 100
1062
- cpt_freq['Exposure'] = cpt_freq['Freq']/(Sim_size)
1063
- cpt_freq['Edge'] = cpt_freq['Exposure'] - cpt_freq['Proj Own']
1064
- cpt_freq['Team'] = cpt_freq['Player'].map(maps_dict['Team_map'])
1065
- for checkVar in range(len(team_list)):
1066
- cpt_freq['Team'] = cpt_freq['Team'].replace(item_list, team_list)
1067
-
1068
- cpt_freq = cpt_freq[['Player', 'Position', 'Team', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1069
 
1070
- flex_freq = pd.DataFrame(np.column_stack(np.unique(st.session_state.Sim_Winner_Frame.iloc[:,[1, 2, 3, 4, 5]].values, return_counts=True)),
1071
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1072
- flex_freq['Freq'] = flex_freq['Freq'].astype(int)
1073
- flex_freq['Position'] = flex_freq['Player'].map(maps_dict['Pos_map'])
1074
- flex_freq['Salary'] = flex_freq['Player'].map(maps_dict['Salary_map'])
1075
- flex_freq['Proj Own'] = (flex_freq['Player'].map(maps_dict['Own_map']) / 100) - ((flex_freq['Player'].map(maps_dict['Own_map']) / 4) / 100)
1076
- flex_freq['Exposure'] = flex_freq['Freq']/(Sim_size)
1077
- flex_freq['Edge'] = flex_freq['Exposure'] - flex_freq['Proj Own']
1078
- flex_freq['Team'] = flex_freq['Player'].map(maps_dict['Team_map'])
1079
- for checkVar in range(len(team_list)):
1080
- flex_freq['Team'] = flex_freq['Team'].replace(item_list, team_list)
1081
-
1082
- flex_freq = flex_freq[['Player', 'Position', 'Team', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1083
 
1084
- del fp_random
1085
- del sample_arrays
1086
- del final_array
1087
- del fp_array
1088
- try:
1089
- del up_array
1090
- except:
1091
- pass
1092
- del best_lineup
1093
- del CleanPortfolio
1094
- del FinalPortfolio
1095
- del maps_dict
1096
- del team_list
1097
- del item_list
1098
- del Sim_size
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1099
 
1100
- with st.container():
1101
- simulate_container = st.empty()
1102
- if 'player_freq' in st.session_state:
1103
- player_split_var2 = st.radio("Are you wanting to isolate any lineups with specific players?", ('Full Players', 'Specific Players'), key='player_split_var2')
1104
- if player_split_var2 == 'Specific Players':
1105
- find_var2 = st.multiselect('Which players must be included in the lineups?', options = st.session_state.player_freq['Player'].unique())
1106
- elif player_split_var2 == 'Full Players':
1107
- find_var2 = st.session_state.player_freq.Player.values.tolist()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1108
 
1109
- if player_split_var2 == 'Specific Players':
1110
- st.session_state.Sim_Winner_Display = st.session_state.Sim_Winner_Frame[np.equal.outer(st.session_state.Sim_Winner_Frame.to_numpy(copy=False), find_var2).any(axis=1).all(axis=1)]
1111
- if player_split_var2 == 'Full Players':
1112
- st.session_state.Sim_Winner_Display = st.session_state.Sim_Winner_Frame
1113
- if 'Sim_Winner_Display' in st.session_state:
1114
- st.dataframe(st.session_state.Sim_Winner_Display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').background_gradient(cmap='RdYlGn_r', subset=['Own']).format(precision=2), use_container_width = True)
1115
- if 'Sim_Winner_Export' in st.session_state:
1116
  st.download_button(
1117
- label="Export Tables",
1118
- data=convert_df_to_csv(st.session_state.Sim_Winner_Export),
1119
- file_name='NFL_consim_export.csv',
1120
  mime='text/csv',
1121
  )
1122
-
1123
- with st.container():
1124
- tab1, tab2, tab3 = st.tabs(['Overall Exposures', 'CPT Exposures', 'FLEX Exposures'])
1125
- with tab1:
1126
- st.dataframe(player_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1127
- st.download_button(
1128
- label="Export Exposures",
1129
- data=convert_df_to_csv(player_freq),
1130
- file_name='player_freq_export.csv',
1131
- mime='text/csv',
1132
- )
1133
- with tab2:
1134
- st.dataframe(cpt_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1135
- st.download_button(
1136
- label="Export Exposures",
1137
- data=convert_df_to_csv(cpt_freq),
1138
- file_name='cpt_freq_export.csv',
1139
- mime='text/csv',
1140
- )
1141
- with tab3:
1142
- st.dataframe(flex_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1143
- st.download_button(
1144
- label="Export Exposures",
1145
- data=convert_df_to_csv(flex_freq),
1146
- file_name='flex_freq_export.csv',
1147
- mime='text/csv',
1148
- )
1149
-
1150
- st.download_button(
1151
- label="Export Tables",
1152
- data=convert_df_to_csv(st.session_state.Sim_Winner_Export),
1153
- file_name='NFL_consim_export.csv',
1154
- mime='text/csv',
1155
- )
 
9
  import pandas as pd
10
  import streamlit as st
11
  import gspread
12
+ import tracemalloc
13
+
14
+ tracemalloc.start()
15
 
16
  @st.cache_resource
17
  def init_conn():
 
753
  scaling_var = 15
754
 
755
  with col2:
756
+ with st.conatainer():
757
+ if st.button("Simulate Contest", key='sim1'):
758
+ try:
759
+ del dst_freq
760
+ del flex_freq
761
+ del te_freq
762
+ del wr_freq
763
+ del rb_freq
764
+ del qb_freq
765
+ del player_freq
766
+ del Sim_Winner_Export
767
+ del Sim_Winner_Frame
768
+ except:
769
+ pass
770
+ with st.container():
771
+ st.write('Contest Simulation Starting')
772
+ Total_Runs = 1000000
773
+ seed_depth1 = 5
774
+ Total_Runs = 2500000
775
+ if Contest_Size <= 1000:
776
+ strength_grow = .01
777
+ elif Contest_Size > 1000 and Contest_Size <= 2500:
778
+ strength_grow = .025
779
+ elif Contest_Size > 2500 and Contest_Size <= 5000:
780
+ strength_grow = .05
781
+ elif Contest_Size > 5000 and Contest_Size <= 20000:
782
+ strength_grow = .075
783
+ elif Contest_Size > 20000:
784
+ strength_grow = .1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
785
 
786
+ field_growth = 100 * strength_grow
787
+
788
+ Sort_function = 'Median'
789
+ if Sort_function == 'Median':
790
+ Sim_function = 'Projection'
791
+ elif Sort_function == 'Own':
792
+ Sim_function = 'Own'
793
+
794
+ if slate_var1 == 'User':
795
+ OwnFrame = proj_dataframe
796
+ if contest_var1 == 'Large':
797
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (10 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
798
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (5 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
799
+ OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
800
+ OwnFrame['Own'] = OwnFrame['Own%'] * (500 / OwnFrame['Own%'].sum())
801
+ if contest_var1 == 'Medium':
802
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (6 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
803
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (3 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
804
+ OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
805
+ OwnFrame['Own'] = OwnFrame['Own%'] * (500 / OwnFrame['Own%'].sum())
806
+ if contest_var1 == 'Small':
807
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (3 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
808
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (1.5 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
809
+ OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
810
+ OwnFrame['Own'] = OwnFrame['Own%'] * (500 / OwnFrame['Own%'].sum())
811
+ Overall_Proj = OwnFrame[['Player', 'Team', 'Position', 'Median', 'Own', 'Salary']]
812
 
813
+ del OwnFrame
 
 
814
 
815
+ elif slate_var1 != 'User':
816
+ initial_proj = raw_baselines
817
+ drop_frame = initial_proj.drop_duplicates(subset = 'Player',keep = 'first')
818
+ OwnFrame = drop_frame[['Player', 'Team', 'Position', 'Median', 'Own', 'Floor', 'Ceiling', 'Salary']]
819
+ if contest_var1 == 'Large':
820
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (10 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
821
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (5 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
822
+ OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
823
+ OwnFrame['Own'] = OwnFrame['Own%'] * (500 / OwnFrame['Own%'].sum())
824
+ if contest_var1 == 'Medium':
825
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (6 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
826
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (3 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
827
+ OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
828
+ OwnFrame['Own'] = OwnFrame['Own%'] * (500 / OwnFrame['Own%'].sum())
829
+ if contest_var1 == 'Small':
830
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (3 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
831
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (1.5 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
832
+ OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
833
+ OwnFrame['Own'] = OwnFrame['Own%'] * (500 / OwnFrame['Own%'].sum())
834
+ Overall_Proj = OwnFrame[['Player', 'Team', 'Position', 'Median', 'Own', 'Floor', 'Ceiling', 'Salary']]
835
 
836
+ del initial_proj
837
+ del drop_frame
838
+ del OwnFrame
 
 
 
 
 
839
 
840
+ if insert_port == 1:
841
+ UserPortfolio = portfolio_dataframe[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5']]
842
+ elif insert_port == 0:
843
+ UserPortfolio = pd.DataFrame(columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5'])
844
+
845
+ Overall_Proj.replace('', np.nan, inplace=True)
846
+ Overall_Proj = Overall_Proj.dropna(subset=['Median'])
847
+ Overall_Proj = Overall_Proj.assign(Value=lambda x: (x.Median / (x.Salary / 1000)))
848
+ Overall_Proj['Sort_var'] = (Overall_Proj['Median'].rank(ascending=False) + Overall_Proj['Value'].rank(ascending=False)) / 2
849
+ Overall_Proj = Overall_Proj.sort_values(by='Sort_var', ascending=False)
850
+ Overall_Proj['Own'] = np.where((Overall_Proj['Median'] > 0) & (Overall_Proj['Own'] == 0), 1, Overall_Proj['Own'])
851
+ Overall_Proj = Overall_Proj.loc[Overall_Proj['Own'] > 0]
852
+
853
+ Overall_Proj['Floor'] = np.where(Overall_Proj['Position'] == 'QB', Overall_Proj['Median'] * .5, Overall_Proj['Median'] * .25)
854
+ Overall_Proj['Ceiling'] = np.where(Overall_Proj['Position'] == 'WR', Overall_Proj['Median'] + Overall_Proj['Median'], Overall_Proj['Median'] + Overall_Proj['Floor'])
855
+ Overall_Proj['STDev'] = Overall_Proj['Median'] / 4
856
+
857
+ Teams_used = Overall_Proj['Team'].drop_duplicates().reset_index(drop=True)
858
+ Teams_used = Teams_used.reset_index()
859
+ Teams_used['team_item'] = Teams_used['index'] + 1
860
+ Teams_used = Teams_used.drop(columns=['index'])
861
+ Teams_used_dictraw = Teams_used.drop(columns=['team_item'])
862
+ Teams_used_dict = Teams_used_dictraw.to_dict()
863
+
864
+ del Teams_used_dictraw
865
+
866
+ team_list = Teams_used['Team'].to_list()
867
+ item_list = Teams_used['team_item'].to_list()
868
+
869
+ FieldStrength_raw = Strength_var + ((30 - len(Teams_used)) * .01)
870
+ FieldStrength = FieldStrength_raw - (FieldStrength_raw * (20000 / Contest_Size))
871
+
872
+ del FieldStrength_raw
873
+
874
+ if FieldStrength < 0:
875
+ FieldStrength = Strength_var
876
+ field_split = Strength_var
877
+
878
+ for checkVar in range(len(team_list)):
879
+ Overall_Proj['Team'] = Overall_Proj['Team'].replace(team_list, item_list)
880
+
881
+ flex_raw = Overall_Proj
882
+ flex_raw.dropna(subset=['Median']).reset_index(drop=True)
883
+ flex_raw = flex_raw.reset_index(drop=True)
884
+ flex_raw = flex_raw.sort_values(by='Own', ascending=False)
885
+
886
+ pos_players = flex_raw
887
+ pos_players.dropna(subset=['Median']).reset_index(drop=True)
888
+ pos_players = pos_players.reset_index(drop=True)
 
 
 
 
 
889
 
890
+ del flex_raw
891
+
892
  if insert_port == 1:
893
+ try:
894
+ # Initialize an empty DataFrame to store raw portfolio data
895
+ Raw_Portfolio = pd.DataFrame()
896
+
897
+ # Split each portfolio column and concatenate to Raw_Portfolio
898
+ columns_to_process = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5']
899
+ for col in columns_to_process:
900
+ temp_df = UserPortfolio[col].str.split("(", n=1, expand=True)
901
+ temp_df.columns = [col, 'Drop']
902
+ Raw_Portfolio = pd.concat([Raw_Portfolio, temp_df], axis=1)
903
+
904
+ # Keep only required variables and remove whitespace
905
+ keep_vars = columns_to_process
906
+ CleanPortfolio = Raw_Portfolio[keep_vars]
907
+ CleanPortfolio = CleanPortfolio.apply(lambda x: x.str.strip())
908
+
909
+ # Reset index and clean up the DataFrame
910
+ CleanPortfolio.reset_index(inplace=True)
911
+ CleanPortfolio['User/Field'] = CleanPortfolio['index'] + 1
912
+ CleanPortfolio.drop(columns=['index'], inplace=True)
913
+ CleanPortfolio.replace('', np.nan, inplace=True)
914
+ CleanPortfolio.dropna(subset=['CPT'], inplace=True)
915
+
916
+ # Create cleaport_players DataFrame
917
+ unique_vals, counts = np.unique(CleanPortfolio.iloc[:, 0:6].values, return_counts=True)
918
+ cleaport_players = pd.DataFrame(np.column_stack([unique_vals, counts]), columns=['Player', 'Freq']).astype({'Freq': int}).sort_values('Freq', ascending=False).reset_index(drop=True)
919
+
920
+ # Merge and update nerf_frame DataFrame
921
+ nerf_frame = pd.merge(cleaport_players, Overall_Proj, on='Player', how='left')
922
+ nerf_frame[['Median', 'Floor', 'Ceiling', 'STDev']] *= 1
923
+
924
+ del Raw_Portfolio
925
+ except:
926
+ # Reset index and perform column-wise operations
927
+ CleanPortfolio = UserPortfolio.reset_index(drop=True)
928
+ CleanPortfolio['User/Field'] = CleanPortfolio.index + 1
929
+ CleanPortfolio.replace('', np.nan, inplace=True)
930
+ CleanPortfolio.dropna(subset=['CPT'], inplace=True)
931
+
932
+ # Create cleaport_players DataFrame
933
+ unique_vals, counts = np.unique(CleanPortfolio.iloc[:, 0:6].values, return_counts=True)
934
+ cleaport_players = pd.DataFrame({'Player': unique_vals, 'Freq': counts}).sort_values('Freq', ascending=False).reset_index(drop=True).astype({'Freq': int})
935
+
936
+ # Merge and update nerf_frame DataFrame
937
+ nerf_frame = pd.merge(cleaport_players, Overall_Proj, on='Player', how='left')
938
+ nerf_frame[['Median', 'Floor', 'Ceiling', 'STDev']] *= 1
939
+
940
+ st.table(nerf_frame)
941
+
942
  elif insert_port == 0:
943
+ CleanPortfolio = UserPortfolio
944
+ cleaport_players = pd.DataFrame(np.column_stack(np.unique(CleanPortfolio.iloc[:,0:6].values, return_counts=True)),
945
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
946
+ cleaport_players['Freq'] = cleaport_players['Freq'].astype(int)
947
+ nerf_frame = Overall_Proj
948
 
949
+ ref_dict = {
950
+ 'pos':['FLEX'],
951
+ 'pos_dfs':['FLEX_Table'],
952
+ 'pos_dicts':['flex_dict']
953
+ }
 
 
954
 
955
+ maps_dict = {
956
+ 'Floor_map':dict(zip(Overall_Proj.Player,Overall_Proj.Floor)),
957
+ 'Projection_map':dict(zip(Overall_Proj.Player,Overall_Proj.Median)),
958
+ 'Ceiling_map':dict(zip(Overall_Proj.Player,Overall_Proj.Ceiling)),
959
+ 'Salary_map':dict(zip(Overall_Proj.Player,Overall_Proj.Salary)),
960
+ 'Pos_map':dict(zip(Overall_Proj.Player,Overall_Proj.Position)),
961
+ 'Own_map':dict(zip(Overall_Proj.Player,Overall_Proj.Own)),
962
+ 'Team_map':dict(zip(Overall_Proj.Player,Overall_Proj.Team)),
963
+ 'STDev_map':dict(zip(Overall_Proj.Player,Overall_Proj.STDev)),
964
+ 'team_check_map':dict(zip(Overall_Proj.Player,Overall_Proj.Team))
965
+ }
966
+
967
+ up_dict = {
968
+ 'Floor_map':dict(zip(cleaport_players.Player,nerf_frame.Floor)),
969
+ 'Projection_map':dict(zip(cleaport_players.Player,nerf_frame.Median)),
970
+ 'Ceiling_map':dict(zip(cleaport_players.Player,nerf_frame.Ceiling)),
971
+ 'Salary_map':dict(zip(cleaport_players.Player,nerf_frame.Salary)),
972
+ 'Pos_map':dict(zip(cleaport_players.Player,nerf_frame.Position)),
973
+ 'Own_map':dict(zip(cleaport_players.Player,nerf_frame.Own)),
974
+ 'Team_map':dict(zip(cleaport_players.Player,nerf_frame.Team)),
975
+ 'STDev_map':dict(zip(cleaport_players.Player,nerf_frame.STDev)),
976
+ 'team_check_map':dict(zip(cleaport_players.Player,nerf_frame.Team))
977
+ }
978
+
979
+ del Overall_Proj
980
+ del nerf_frame
981
+
982
+ RunsVar = 1
983
+ st.write('Seed frame creation')
984
+ FinalPortfolio, maps_dict = run_seed_frame(seed_depth1, Strength_var, strength_grow, Teams_used, Total_Runs)
985
+
986
+ Sim_size = linenum_var1
987
+ SimVar = 1
988
+ Sim_Winners = []
989
+ fp_array = FinalPortfolio.values
990
+
991
+ if insert_port == 1:
992
+ up_array = CleanPortfolio.values
993
+
994
+ # Pre-vectorize functions
995
+ vec_projection_map = np.vectorize(maps_dict['Projection_map'].__getitem__)
996
+ vec_stdev_map = np.vectorize(maps_dict['STDev_map'].__getitem__)
997
+
998
  if insert_port == 1:
999
+ vec_up_projection_map = np.vectorize(up_dict['Projection_map'].__getitem__)
1000
+ vec_up_stdev_map = np.vectorize(up_dict['STDev_map'].__getitem__)
1001
+ st.write('Simulating contest on frames')
1002
+ while SimVar <= Sim_size:
1003
+
1004
+ if insert_port == 1:
1005
+ fp_random = fp_array[np.random.choice(fp_array.shape[0], Contest_Size-len(CleanPortfolio))]
1006
+ elif insert_port == 0:
1007
+ fp_random = fp_array[np.random.choice(fp_array.shape[0], Contest_Size)]
1008
+
1009
+ sample_arrays1 = np.c_[
1010
+ fp_random,
1011
  np.sum(np.random.normal(
1012
+ loc=vec_projection_map(fp_random[:, :-5]),
1013
+ scale=vec_stdev_map(fp_random[:, :-5])),
1014
  axis=1)
1015
  ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1016
 
1017
+ if insert_port == 1:
1018
+ sample_arrays2 = np.c_[
1019
+ up_array,
1020
+ np.sum(np.random.normal(
1021
+ loc=vec_up_projection_map(up_array[:, :-5]),
1022
+ scale=vec_up_stdev_map(up_array[:, :-5])),
1023
+ axis=1)
1024
+ ]
1025
+ sample_arrays = np.vstack((sample_arrays1, sample_arrays2))
1026
+ else:
1027
+ sample_arrays = sample_arrays1
 
 
1028
 
1029
+ final_array = sample_arrays[sample_arrays[:, 10].argsort()[::-1]]
1030
+ best_lineup = final_array[final_array[:, -1].argsort(kind='stable')[::-1][:1]]
1031
+ Sim_Winners.append(best_lineup)
1032
+ SimVar += 1
1033
+ st.write('Contest simulation complete')
1034
+
1035
+ Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=FinalPortfolio.columns.tolist() + ['Fantasy'])
1036
+ Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['Projection'] + Sim_Winner_Frame['Fantasy']) / 2
1037
+ Sim_Winner_Frame['Salary'] = Sim_Winner_Frame['Salary'].astype(int)
1038
+ Sim_Winner_Frame['Projection'] = Sim_Winner_Frame['Projection'].astype(np.float16)
1039
+ Sim_Winner_Frame['Fantasy'] = Sim_Winner_Frame['Fantasy'].astype(np.float16)
1040
+ Sim_Winner_Frame['GPP_Proj'] = Sim_Winner_Frame['GPP_Proj'].astype(np.float16)
1041
+ st.session_state.Sim_Winner_Frame = Sim_Winner_Frame.sort_values(by='GPP_Proj', ascending=False)
1042
+ st.session_state.Sim_Winner_Export = Sim_Winner_Frame.copy()
1043
+
1044
+ del Sim_Winner_Frame
1045
+
1046
+ player_freq = pd.DataFrame(np.column_stack(np.unique(st.session_state.Sim_Winner_Frame.iloc[:,0:6].values, return_counts=True)),
1047
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1048
+ player_freq['Freq'] = player_freq['Freq'].astype(int)
1049
+ player_freq['Position'] = player_freq['Player'].map(maps_dict['Pos_map'])
1050
+ player_freq['Salary'] = player_freq['Player'].map(maps_dict['Salary_map'])
1051
+ player_freq['Proj Own'] = (player_freq['Player'].map(maps_dict['Own_map']) / 100)
1052
+ player_freq['Exposure'] = player_freq['Freq']/(Sim_size)
1053
+ player_freq['Edge'] = player_freq['Exposure'] - player_freq['Proj Own']
1054
+ player_freq['Team'] = player_freq['Player'].map(maps_dict['Team_map'])
1055
+ for checkVar in range(len(team_list)):
1056
+ player_freq['Team'] = player_freq['Team'].replace(item_list, team_list)
1057
+
1058
+ player_freq = player_freq[['Player', 'Position', 'Team', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1059
+
1060
+ cpt_freq = pd.DataFrame(np.column_stack(np.unique(st.session_state.Sim_Winner_Frame.iloc[:,0:1].values, return_counts=True)),
1061
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1062
+ cpt_freq['Freq'] = cpt_freq['Freq'].astype(int)
1063
+ cpt_freq['Position'] = cpt_freq['Player'].map(maps_dict['Pos_map'])
1064
+ cpt_freq['Salary'] = cpt_freq['Player'].map(maps_dict['Salary_map'])
1065
+ cpt_freq['Proj Own'] = (cpt_freq['Player'].map(maps_dict['Own_map']) / 4) / 100
1066
+ cpt_freq['Exposure'] = cpt_freq['Freq']/(Sim_size)
1067
+ cpt_freq['Edge'] = cpt_freq['Exposure'] - cpt_freq['Proj Own']
1068
+ cpt_freq['Team'] = cpt_freq['Player'].map(maps_dict['Team_map'])
1069
+ for checkVar in range(len(team_list)):
1070
+ cpt_freq['Team'] = cpt_freq['Team'].replace(item_list, team_list)
1071
+
1072
+ cpt_freq = cpt_freq[['Player', 'Position', 'Team', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1073
+
1074
+ flex_freq = pd.DataFrame(np.column_stack(np.unique(st.session_state.Sim_Winner_Frame.iloc[:,[1, 2, 3, 4, 5]].values, return_counts=True)),
1075
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1076
+ flex_freq['Freq'] = flex_freq['Freq'].astype(int)
1077
+ flex_freq['Position'] = flex_freq['Player'].map(maps_dict['Pos_map'])
1078
+ flex_freq['Salary'] = flex_freq['Player'].map(maps_dict['Salary_map'])
1079
+ flex_freq['Proj Own'] = (flex_freq['Player'].map(maps_dict['Own_map']) / 100) - ((flex_freq['Player'].map(maps_dict['Own_map']) / 4) / 100)
1080
+ flex_freq['Exposure'] = flex_freq['Freq']/(Sim_size)
1081
+ flex_freq['Edge'] = flex_freq['Exposure'] - flex_freq['Proj Own']
1082
+ flex_freq['Team'] = flex_freq['Player'].map(maps_dict['Team_map'])
1083
+ for checkVar in range(len(team_list)):
1084
+ flex_freq['Team'] = flex_freq['Team'].replace(item_list, team_list)
1085
+
1086
+ flex_freq = flex_freq[['Player', 'Position', 'Team', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1087
+
1088
+ del fp_random
1089
+ del sample_arrays
1090
+ del final_array
1091
+ del fp_array
1092
+ try:
1093
+ del up_array
1094
+ except:
1095
+ pass
1096
+ del best_lineup
1097
+ del CleanPortfolio
1098
+ del FinalPortfolio
1099
+ del maps_dict
1100
+ del team_list
1101
+ del item_list
1102
+ del Sim_size
1103
 
1104
+ with st.container():
1105
+ simulate_container = st.empty()
1106
+ if 'player_freq' in st.session_state:
1107
+ player_split_var2 = st.radio("Are you wanting to isolate any lineups with specific players?", ('Full Players', 'Specific Players'), key='player_split_var2')
1108
+ if player_split_var2 == 'Specific Players':
1109
+ find_var2 = st.multiselect('Which players must be included in the lineups?', options = st.session_state.player_freq['Player'].unique())
1110
+ elif player_split_var2 == 'Full Players':
1111
+ find_var2 = st.session_state.player_freq.Player.values.tolist()
1112
+
1113
+ if player_split_var2 == 'Specific Players':
1114
+ st.session_state.Sim_Winner_Display = st.session_state.Sim_Winner_Frame[np.equal.outer(st.session_state.Sim_Winner_Frame.to_numpy(copy=False), find_var2).any(axis=1).all(axis=1)]
1115
+ if player_split_var2 == 'Full Players':
1116
+ st.session_state.Sim_Winner_Display = st.session_state.Sim_Winner_Frame
1117
+ if 'Sim_Winner_Display' in st.session_state:
1118
+ st.dataframe(st.session_state.Sim_Winner_Display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').background_gradient(cmap='RdYlGn_r', subset=['Own']).format(precision=2), use_container_width = True)
1119
+ if 'Sim_Winner_Export' in st.session_state:
1120
+ st.download_button(
1121
+ label="Export Tables",
1122
+ data=convert_df_to_csv(st.session_state.Sim_Winner_Export),
1123
+ file_name='NFL_consim_export.csv',
1124
+ mime='text/csv',
1125
+ )
1126
 
1127
+ with st.container():
1128
+ tab1, tab2, tab3 = st.tabs(['Overall Exposures', 'CPT Exposures', 'FLEX Exposures'])
1129
+ with tab1:
1130
+ st.dataframe(player_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
 
 
 
1131
  st.download_button(
1132
+ label="Export Exposures",
1133
+ data=convert_df_to_csv(player_freq),
1134
+ file_name='player_freq_export.csv',
1135
  mime='text/csv',
1136
  )
1137
+ with tab2:
1138
+ st.dataframe(cpt_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1139
+ st.download_button(
1140
+ label="Export Exposures",
1141
+ data=convert_df_to_csv(cpt_freq),
1142
+ file_name='cpt_freq_export.csv',
1143
+ mime='text/csv',
1144
+ )
1145
+ with tab3:
1146
+ st.dataframe(flex_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1147
+ st.download_button(
1148
+ label="Export Exposures",
1149
+ data=convert_df_to_csv(flex_freq),
1150
+ file_name='flex_freq_export.csv',
1151
+ mime='text/csv',
1152
+ )