James McCool commited on
Commit
9b82ed9
·
1 Parent(s): 88223c3

initial commit with app structure

Browse files
.streamlit/secrets.toml ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ mongo_uri = "mongodb+srv://multichem:Xr1q5wZdXPbxdUmJ@testcluster.lgwtp5i.mongodb.net/?retryWrites=true&w=majority&appName=TestCluster"
2
+ NBA_Data = 'https://docs.google.com/spreadsheets/d/1Yq0vGriWK-bS79e-bD6_u9pqrYE6Yrlbb_wEkmH-ot0/edit#gid=1808117109'
Dockerfile CHANGED
@@ -5,11 +5,25 @@ WORKDIR /app
5
  RUN apt-get update && apt-get install -y \
6
  build-essential \
7
  curl \
 
8
  git \
9
  && rm -rf /var/lib/apt/lists/*
10
 
11
  COPY requirements.txt ./
12
  COPY src/ ./src/
 
 
 
 
 
 
 
 
 
 
 
 
 
13
 
14
  RUN pip3 install -r requirements.txt
15
 
 
5
  RUN apt-get update && apt-get install -y \
6
  build-essential \
7
  curl \
8
+ software-properties-common \
9
  git \
10
  && rm -rf /var/lib/apt/lists/*
11
 
12
  COPY requirements.txt ./
13
  COPY src/ ./src/
14
+ COPY .streamlit/ ./.streamlit/
15
+
16
+
17
+
18
+ ENV MONGO_URI="mongodb+srv://multichem:Xr1q5wZdXPbxdUmJ@testcluster.lgwtp5i.mongodb.net/?retryWrites=true&w=majority&appName=TestCluster"
19
+ ENV NBA_Data='https://docs.google.com/spreadsheets/d/1Yq0vGriWK-bS79e-bD6_u9pqrYE6Yrlbb_wEkmH-ot0/edit#gid=1808117109'
20
+ RUN useradd -m -u 1000 user
21
+ USER user
22
+ ENV HOME=/home/user\
23
+ PATH=/home/user/.local/bin:$PATH
24
+ WORKDIR $HOME/app
25
+ RUN pip install --no-cache-dir --upgrade pip
26
+ COPY --chown=user . $HOME/app
27
 
28
  RUN pip3 install -r requirements.txt
29
 
requirements.txt CHANGED
@@ -1,3 +1,8 @@
1
- altair
2
- pandas
3
- streamlit
 
 
 
 
 
 
1
+ streamlit
2
+ openpyxl
3
+ matplotlib
4
+ pulp
5
+ docker
6
+ plotly
7
+ scipy
8
+ pymongo
src/database.py ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import pymongo
3
+ import os
4
+ import gspread
5
+
6
+ # @st.cache_resource
7
+ # def init_conn():
8
+ # # Try to get from environment variable first, fall back to secrets
9
+ # uri = os.getenv('MONGO_URI')
10
+ # if not uri:
11
+ # uri = st.secrets['mongo_uri']
12
+ # client = pymongo.MongoClient(uri, retryWrites=True, serverSelectionTimeoutMS=500000)
13
+ # db = client["NBA_Database"]
14
+
15
+ # return db
16
+
17
+ # db = init_conn()
18
+
19
+ @st.cache_resource
20
+ def init_conn():
21
+ scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
22
+
23
+ credentials = {
24
+ "type": "service_account",
25
+ "project_id": "model-sheets-connect",
26
+ "private_key_id": "0e0bc2fdef04e771172fe5807392b9d6639d945e",
27
+ "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDiu1v/e6KBKOcK\ncx0KQ23nZK3ZVvADYy8u/RUn/EDI82QKxTd/DizRLIV81JiNQxDJXSzgkbwKYEDm\n48E8zGvupU8+Nk76xNPakrQKy2Y8+VJlq5psBtGchJTuUSHcXU5Mg2JhQsB376PJ\nsCw552K6Pw8fpeMDJDZuxpKSkaJR6k9G5Dhf5q8HDXnC5Rh/PRFuKJ2GGRpX7n+2\nhT/sCax0J8jfdTy/MDGiDfJqfQrOPrMKELtsGHR9Iv6F4vKiDqXpKfqH+02E9ptz\nBk+MNcbZ3m90M8ShfRu28ebebsASfarNMzc3dk7tb3utHOGXKCf4tF8yYKo7x8BZ\noO9X4gSfAgMBAAECggEAU8ByyMpSKlTCF32TJhXnVJi/kS+IhC/Qn5JUDMuk4LXr\naAEWsWO6kV/ZRVXArjmuSzuUVrXumISapM9Ps5Ytbl95CJmGDiLDwRL815nvv6k3\nUyAS8EGKjz74RpoIoH6E7EWCAzxlnUgTn+5oP9Flije97epYk3H+e2f1f5e1Nn1d\nYNe8U+1HqJgILcxA1TAUsARBfoD7+K3z/8DVPHI8IpzAh6kTHqhqC23Rram4XoQ6\nzj/ZdVBjvnKuazETfsD+Vl3jGLQA8cKQVV70xdz3xwLcNeHsbPbpGBpZUoF73c65\nkAXOrjYl0JD5yAk+hmYhXr6H9c6z5AieuZGDrhmlFQKBgQDzV6LRXmjn4854DP/J\nI82oX2GcI4eioDZPRukhiQLzYerMQBmyqZIRC+/LTCAhYQSjNgMa+ZKyvLqv48M0\n/x398op/+n3xTs+8L49SPI48/iV+mnH7k0WI/ycd4OOKh8rrmhl/0EWb9iitwJYe\nMjTV/QxNEpPBEXfR1/mvrN/lVQKBgQDuhomOxUhWVRVH6x03slmyRBn0Oiw4MW+r\nrt1hlNgtVmTc5Mu+4G0USMZwYuOB7F8xG4Foc7rIlwS7Ic83jMJxemtqAelwOLdV\nXRLrLWJfX8+O1z/UE15l2q3SUEnQ4esPHbQnZowHLm0mdL14qSVMl1mu1XfsoZ3z\nJZTQb48CIwKBgEWbzQRtKD8lKDupJEYqSrseRbK/ax43DDITS77/DWwHl33D3FYC\nMblUm8ygwxQpR4VUfwDpYXBlklWcJovzamXpSnsfcYVkkQH47NuOXPXPkXQsw+w+\nDYcJzeu7F/vZqk9I7oBkWHUrrik9zPNoUzrfPvSRGtkAoTDSwibhoc5dAoGBAMHE\nK0T/ANeZQLNuzQps6S7G4eqjwz5W8qeeYxsdZkvWThOgDd/ewt3ijMnJm5X05hOn\ni4XF1euTuvUl7wbqYx76Wv3/1ZojiNNgy7ie4rYlyB/6vlBS97F4ZxJdxMlabbCW\n6b3EMWa4EVVXKoA1sCY7IVDE+yoQ1JYsZmq45YzPAoGBANWWHuVueFGZRDZlkNlK\nh5OmySmA0NdNug3G1upaTthyaTZ+CxGliwBqMHAwpkIRPwxUJpUwBTSEGztGTAxs\nWsUOVWlD2/1JaKSmHE8JbNg6sxLilcG6WEDzxjC5dLL1OrGOXj9WhC9KX3sq6qb6\nF/j9eUXfXjAlb042MphoF3ZC\n-----END PRIVATE KEY-----\n",
28
+ "client_email": "gspread-connection@model-sheets-connect.iam.gserviceaccount.com",
29
+ "client_id": "100369174533302798535",
30
+ "auth_uri": "https://accounts.google.com/o/oauth2/auth",
31
+ "token_uri": "https://oauth2.googleapis.com/token",
32
+ "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
33
+ "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/gspread-connection%40model-sheets-connect.iam.gserviceaccount.com"
34
+ }
35
+
36
+ gc_con = gspread.service_account_from_dict(credentials, scope)
37
+
38
+ return gc_con
39
+
40
+ gcservice_account = init_conn()
src/streamlit_app.py CHANGED
@@ -1,40 +1,213 @@
1
- import altair as alt
 
 
 
 
 
 
2
  import numpy as np
3
  import pandas as pd
4
  import streamlit as st
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
 
6
- """
7
- # Welcome to Streamlit!
8
-
9
- Edit `/streamlit_app.py` to customize this app to your heart's desire :heart:.
10
- If you have any questions, checkout our [documentation](https://docs.streamlit.io) and [community
11
- forums](https://discuss.streamlit.io).
12
-
13
- In the meantime, below is an example of what you can do with just a few lines of code:
14
- """
15
-
16
- num_points = st.slider("Number of points in spiral", 1, 10000, 1100)
17
- num_turns = st.slider("Number of turns in spiral", 1, 300, 31)
18
-
19
- indices = np.linspace(0, 1, num_points)
20
- theta = 2 * np.pi * num_turns * indices
21
- radius = indices
22
-
23
- x = radius * np.cos(theta)
24
- y = radius * np.sin(theta)
25
-
26
- df = pd.DataFrame({
27
- "x": x,
28
- "y": y,
29
- "idx": indices,
30
- "rand": np.random.randn(num_points),
31
- })
32
-
33
- st.altair_chart(alt.Chart(df, height=700, width=700)
34
- .mark_point(filled=True)
35
- .encode(
36
- x=alt.X("x", axis=None),
37
- y=alt.Y("y", axis=None),
38
- color=alt.Color("idx", legend=None, scale=alt.Scale()),
39
- size=alt.Size("rand", legend=None, scale=alt.Scale(range=[1, 150])),
40
- ))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ st.set_page_config(layout="wide")
3
+
4
+ for name in dir():
5
+ if not name.startswith('_'):
6
+ del globals()[name]
7
+
8
  import numpy as np
9
  import pandas as pd
10
  import streamlit as st
11
+ from database import gcservice_account
12
+ from secrets import NBA_Data
13
+
14
+ @st.cache_resource(ttl = 600)
15
+ def init_baselines():
16
+ sh = gcservice_account.open_by_url(NBA_Data)
17
+
18
+ worksheet = sh.worksheet('Trending')
19
+ raw_display = pd.DataFrame(worksheet.get_values())
20
+ raw_display.columns = raw_display.iloc[0]
21
+ raw_display = raw_display[1:]
22
+ raw_display = raw_display.reset_index(drop=True)
23
+ trend_table = raw_display[raw_display['PLAYER_NAME'] != ""]
24
+ trend_table.replace('', np.nan, inplace=True)
25
+ trend_table = trend_table[['PLAYER_NAME', 'Team', 'Position', 'FD_Position', 'Season MIN', 'Season Fantasy', 'Season FPPM', 'Season Ceiling', 'Season FD_Fantasy', 'Season FD_Ceiling', 'L10 MIN', 'L10 Fantasy', 'L10 FPPM', 'L10 Ceiling', 'L10 FD_Fantasy',
26
+ 'L10 FD_Ceiling', 'L5 MIN', 'L5 Fantasy', 'L5 FPPM', 'L5 Ceiling', 'L5 FD_Fantasy', 'L5 FD_Ceiling', 'L3 MIN', 'L3 Fantasy',
27
+ 'L3 FPPM', 'L3 Ceiling', 'L3 FD_Fantasy', 'L3 FD_Ceiling', 'Trend Min', 'Trend Median', 'Trend FPPM', 'DK_Proj', 'Adj Median', 'Adj Ceiling',
28
+ 'Trend FD_Median', 'FD_Proj', 'Adj FD_Median', 'Adj FD_Ceiling', 'DK_Salary', 'DK_Avg_Val', 'DK_Ceiling_Value',
29
+ 'FD_Salary', 'FD_Avg_Val', 'FD_Ceiling_Value']]
30
+ trend_table['DK_Salary'] = trend_table['DK_Salary'].str.replace(',', '').astype(float)
31
+ trend_table['FD_Salary'] = trend_table['FD_Salary'].str.replace(',', '').astype(float)
32
+ trend_table = trend_table.dropna(subset=['Position'])
33
+ data_cols = trend_table.columns.drop(['PLAYER_NAME', 'Team', 'Position', 'FD_Position'])
34
+ trend_table[data_cols] = trend_table[data_cols].apply(pd.to_numeric, errors='coerce')
35
+
36
+ dk_minutes_table = trend_table[['PLAYER_NAME', 'Team', 'Season MIN', 'L10 MIN', 'L5 MIN', 'L3 MIN', 'Trend Min']]
37
+
38
+ fd_minutes_table = trend_table[['PLAYER_NAME', 'Team', 'Season MIN', 'L10 MIN', 'L5 MIN', 'L3 MIN', 'Trend Min']]
39
+
40
+ dk_medians_table = trend_table[['PLAYER_NAME', 'Team', 'Season Fantasy', 'L10 Fantasy', 'L5 Fantasy', 'L3 Fantasy', 'Trend Median']]
41
+
42
+ fd_medians_table = trend_table[['PLAYER_NAME', 'Team', 'Season FD_Fantasy', 'L10 FD_Fantasy', 'L5 FD_Fantasy', 'L3 FD_Fantasy', 'Trend FD_Median']]
43
+
44
+ dk_fppm_table = trend_table[['PLAYER_NAME', 'Team', 'Season FPPM', 'L10 FPPM', 'L5 FPPM', 'L3 FPPM', 'Trend FPPM']]
45
+
46
+ fd_fppm_table = trend_table[['PLAYER_NAME', 'Team', 'Season FPPM', 'L10 FPPM', 'L5 FPPM', 'L3 FPPM', 'Trend FPPM']]
47
+
48
+ dk_proj_medians_table = trend_table[['PLAYER_NAME', 'Team', 'Position', 'DK_Salary', 'DK_Proj', 'Adj Median', 'DK_Avg_Val', 'Adj Ceiling', 'DK_Ceiling_Value']]
49
+
50
+ fd_proj_medians_table = trend_table[['PLAYER_NAME', 'Team', 'FD_Position', 'FD_Salary', 'FD_Proj', 'Adj FD_Median', 'FD_Avg_Val', 'Adj FD_Ceiling', 'FD_Ceiling_Value']]
51
+
52
+ return trend_table, dk_minutes_table, fd_minutes_table, dk_medians_table, fd_medians_table, dk_fppm_table, fd_fppm_table, dk_proj_medians_table, fd_proj_medians_table
53
+
54
+ def convert_df_to_csv(df):
55
+ return df.to_csv().encode('utf-8')
56
+
57
+ trend_table, dk_minutes_table, fd_minutes_table, dk_medians_table, fd_medians_table, dk_fppm_table, fd_fppm_table, dk_proj_medians_table, fd_proj_medians_table = init_baselines()
58
+
59
+ col1, col2 = st.columns([1, 9])
60
+ with col1:
61
+ if st.button("Reset Data", key='reset1'):
62
+ st.cache_data.clear()
63
+ trend_table, dk_minutes_table, fd_minutes_table, dk_medians_table, fd_medians_table, dk_proj_medians_table, fd_proj_medians_table = init_baselines()
64
+ split_var1 = st.radio("What table would you like to view?", ('Minutes Trends', 'Fantasy Trends', 'FPPM Trends', 'Slate specific', 'Overall'), key='split_var1')
65
+ site_var1 = st.radio("What site would you like to view?", ('Draftkings', 'Fanduel'), key='site_var1')
66
+ if site_var1 == 'Draftkings':
67
+ trend_table = trend_table[['PLAYER_NAME', 'Team', 'Position', 'Season MIN', 'L10 MIN', 'L5 MIN', 'L3 MIN', 'Trend Min', 'Season Fantasy', 'L10 Fantasy', 'L5 Fantasy', 'L3 Fantasy',
68
+ 'Trend Median', 'Season FPPM', 'L10 FPPM', 'L5 FPPM', 'L3 FPPM', 'Trend FPPM', 'DK_Proj', 'Adj Median', 'Adj Ceiling',
69
+ 'DK_Salary', 'DK_Avg_Val', 'DK_Ceiling_Value']]
70
+ minutes_table = dk_minutes_table
71
+ medians_table = dk_medians_table
72
+ fppm_table = dk_fppm_table
73
+ proj_medians_table = dk_proj_medians_table
74
+ elif site_var1 == 'Fanduel':
75
+ trend_table = trend_table[['PLAYER_NAME', 'Team', 'FD_Position', 'Season MIN', 'L10 MIN', 'L5 MIN', 'L3 MIN', 'Trend Min', 'Season FD_Fantasy', 'L10 FD_Fantasy', 'L5 FD_Fantasy', 'L3 FD_Fantasy',
76
+ 'Trend FD_Median', 'Season FPPM', 'L10 FPPM', 'L5 FPPM', 'L3 FPPM', 'Trend FPPM', 'FD_Proj', 'Adj FD_Median', 'Adj FD_Ceiling',
77
+ 'FD_Salary', 'FD_Avg_Val', 'FD_Ceiling_Value']]
78
+ minutes_table = fd_minutes_table
79
+ medians_table = fd_medians_table
80
+ fppm_table = fd_fppm_table
81
+ proj_medians_table = fd_proj_medians_table
82
+ trend_table = trend_table.set_axis(['PLAYER_NAME', 'Team', 'Position', 'Season MIN', 'L10 MIN', 'L5 MIN', 'L3 MIN', 'Trend Min', 'Season Fantasy', 'L10 Fantasy', 'L5 Fantasy', 'L3 Fantasy',
83
+ 'Trend Median', 'Season FPPM', 'L10 FPPM', 'L5 FPPM', 'L3 FPPM', 'Trend FPPM', 'DK_Proj', 'Adj Median', 'Adj Ceiling',
84
+ 'Salary', 'Avg_Val', 'Ceiling_Value'], axis=1)
85
+ minutes_table = minutes_table.set_axis(['PLAYER_NAME', 'Team', 'Season MIN', 'L10 MIN', 'L5 MIN', 'L3 MIN', 'Trend Min'], axis=1)
86
+ medians_table = medians_table.set_axis(['PLAYER_NAME', 'Team', 'Season Fantasy', 'L10 Fantasy', 'L5 Fantasy', 'L3 Fantasy', 'Trend Median'], axis=1)
87
+ fppm_table = fppm_table.set_axis(['PLAYER_NAME', 'Team', 'Season FPPM', 'L10 FPPM', 'L5 FPPM', 'L3 FPPM', 'Trend FPPM'], axis=1)
88
+ proj_medians_table = proj_medians_table.set_axis(['PLAYER_NAME', 'Team', 'Position', 'Salary', 'Proj',
89
+ 'Adj Median', 'Avg_Val', 'Adj Ceiling', 'Ceiling_Value'], axis=1)
90
+ if split_var1 == 'Overall':
91
+ view_var1 = trend_table.Team.values.tolist()
92
+ split_var2 = st.radio("Would you like to view all teams or specific ones?", ('All', 'Specific Teams'), key='split_var2')
93
+
94
+ if split_var2 == 'Specific Teams':
95
+ team_var1 = st.multiselect('Which teams would you like to include in the tables?', options = view_var1, key='team_var1')
96
+ elif split_var2 == 'All':
97
+ team_var1 = view_var1
98
+
99
+ split_var3 = st.radio("Would you like to view all positions or specific ones?", ('All', 'Specific Positions'), key='split_var3')
100
+ if split_var3 == 'Specific Positions':
101
+ pos_var1 = st.multiselect('Which positions would you like to include in the tables?', options = ['PG', 'SG', 'SF', 'PF', 'C'], key='pos_var1')
102
+ elif split_var3 == 'All':
103
+ pos_var1 = ['PG', 'SG', 'SF', 'PF', 'C']
104
+
105
+ proj_var1 = st.slider("Is there a certain projection range you want to view?", 0, 100, (10, 100), key='proj_var1')
106
+
107
+ elif split_var1 == 'Minutes Trends':
108
+ view_var1 = trend_table.Team.values.tolist()
109
+ split_var2 = st.radio("Would you like to view all teams or specific ones?", ('All', 'Specific Teams'), key='split_var2')
110
+
111
+ if split_var2 == 'Specific Teams':
112
+ team_var1 = st.multiselect('Which teams would you like to include in the tables?', options = view_var1, key='team_var1')
113
+ elif split_var2 == 'All':
114
+ team_var1 = view_var1
115
+
116
+ elif split_var1 == 'Fantasy Trends':
117
+ view_var1 = trend_table.Team.values.tolist()
118
+ split_var2 = st.radio("Would you like to view all teams or specific ones?", ('All', 'Specific Teams'), key='split_var2')
119
+
120
+ if split_var2 == 'Specific Teams':
121
+ team_var1 = st.multiselect('Which teams would you like to include in the tables?', options = view_var1, key='team_var1')
122
+ elif split_var2 == 'All':
123
+ team_var1 = view_var1
124
+
125
+ elif split_var1 == 'FPPM Trends':
126
+ view_var1 = trend_table.Team.values.tolist()
127
+ split_var2 = st.radio("Would you like to view all teams or specific ones?", ('All', 'Specific Teams'), key='split_var2')
128
+
129
+ if split_var2 == 'Specific Teams':
130
+ team_var1 = st.multiselect('Which teams would you like to include in the tables?', options = view_var1, key='team_var1')
131
+ elif split_var2 == 'All':
132
+ team_var1 = view_var1
133
+
134
+ elif split_var1 == 'Slate specific':
135
+ view_var1 = trend_table.Team.values.tolist()
136
+ split_var2 = st.radio("Would you like to view all teams or specific ones?", ('All', 'Specific Teams'), key='split_var2')
137
+
138
+ if split_var2 == 'Specific Teams':
139
+ team_var1 = st.multiselect('Which teams would you like to include in the tables?', options = view_var1, key='team_var1')
140
+ elif split_var2 == 'All':
141
+ team_var1 = view_var1
142
+
143
+ split_var3 = st.radio("Would you like to view all positions or specific ones?", ('All', 'Specific Positions'), key='split_var3')
144
+ if split_var3 == 'Specific Positions':
145
+ pos_var1 = st.multiselect('Which positions would you like to include in the tables?', options = ['PG', 'SG', 'SF', 'PF', 'C'], key='pos_var1')
146
+ elif split_var3 == 'All':
147
+ pos_var1 = ['PG', 'SG', 'SF', 'PF', 'C']
148
+
149
+ proj_var1 = st.slider("Is there a certain projection range you want to view?", 0, 100, (10, 100), key='proj_var1')
150
 
151
+ with col2:
152
+ if split_var1 == 'Overall':
153
+ table_display = trend_table[trend_table['Proj'] >= proj_var1[0]]
154
+ table_display = table_display[table_display['Proj'] <= proj_var1[1]]
155
+ table_display = table_display[table_display['Team'].isin(team_var1)]
156
+ table_display = table_display[table_display['Position'].str.contains('|'.join(pos_var1))]
157
+ table_display = table_display.sort_values(by='Adj Ceiling', ascending=False)
158
+ table_display = table_display.set_index('PLAYER_NAME')
159
+ st.dataframe(table_display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), use_container_width = True)
160
+ st.download_button(
161
+ label="Export Trending Numbers",
162
+ data=convert_df_to_csv(table_display),
163
+ file_name='Trending_export.csv',
164
+ mime='text/csv',
165
+ )
166
+
167
+ elif split_var1 == 'Minutes Trends':
168
+ table_display = minutes_table[minutes_table['Team'].isin(team_var1)]
169
+ table_display = table_display.set_index('PLAYER_NAME')
170
+ st.dataframe(table_display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), use_container_width = True)
171
+ st.download_button(
172
+ label="Export Trending Numbers",
173
+ data=convert_df_to_csv(table_display),
174
+ file_name='Trending_export.csv',
175
+ mime='text/csv',
176
+ )
177
+
178
+ elif split_var1 == 'Fantasy Trends':
179
+ table_display = medians_table[medians_table['Team'].isin(team_var1)]
180
+ table_display = table_display.set_index('PLAYER_NAME')
181
+ st.dataframe(table_display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), use_container_width = True)
182
+ st.download_button(
183
+ label="Export Trending Numbers",
184
+ data=convert_df_to_csv(table_display),
185
+ file_name='Trending_export.csv',
186
+ mime='text/csv',
187
+ )
188
+
189
+ elif split_var1 == 'FPPM Trends':
190
+ table_display = fppm_table[fppm_table['Team'].isin(team_var1)]
191
+ table_display = table_display.set_index('PLAYER_NAME')
192
+ st.dataframe(table_display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), use_container_width = True)
193
+ st.download_button(
194
+ label="Export Trending Numbers",
195
+ data=convert_df_to_csv(table_display),
196
+ file_name='Trending_export.csv',
197
+ mime='text/csv',
198
+ )
199
+
200
+ elif split_var1 == 'Slate specific':
201
+ table_display = proj_medians_table[proj_medians_table['Proj'] >= proj_var1[0]]
202
+ table_display = table_display[table_display['Proj'] <= proj_var1[1]]
203
+ table_display = table_display[table_display['Team'].isin(team_var1)]
204
+ table_display = table_display[table_display['Position'].str.contains('|'.join(pos_var1))]
205
+ table_display = table_display.sort_values(by='Adj Ceiling', ascending=False)
206
+ table_display = table_display.set_index('PLAYER_NAME')
207
+ st.dataframe(table_display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), use_container_width = True)
208
+ st.download_button(
209
+ label="Export Trending Numbers",
210
+ data=convert_df_to_csv(table_display),
211
+ file_name='NBA_Trending_export.csv',
212
+ mime='text/csv',
213
+ )