James McCool
commited on
Commit
·
f79125f
1
Parent(s):
c47e22d
Add pagination functionality to data tables in Streamlit app
Browse files- Implemented a new pagination system for displaying data frames in both pitcher and hitter tabs, enhancing user navigation through large datasets.
- Introduced buttons for navigating between pages, improving the overall user experience.
- Adjusted loading spinner duration for league baseline data to optimize perceived performance during data retrieval.
- src/streamlit_app.py +42 -11
src/streamlit_app.py
CHANGED
@@ -53,6 +53,43 @@ st.markdown("""
|
|
53 |
}
|
54 |
</style>""", unsafe_allow_html=True)
|
55 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
56 |
@st.cache_resource(ttl = 61)
|
57 |
def init_baselines():
|
58 |
|
@@ -178,16 +215,8 @@ with pitcher_tab:
|
|
178 |
if table_var_sp in (['League Aggregate Baselines', 'League Short Term Baselines', 'League Long Term Baselines']):
|
179 |
|
180 |
with st.spinner("Full league baselines can take some time to load"):
|
181 |
-
time.sleep(
|
182 |
-
|
183 |
-
st.dataframe(st.session_state['sp_disp_frame'].style.background_gradient(axis=0).background_gradient(cmap='RdYlGn_r').format(precision=2), height = 500, use_container_width = True, hide_index = True)
|
184 |
-
col1, col2, col3, col4 = st.columns(4)
|
185 |
-
with col1:
|
186 |
-
if st.button('Previous'):
|
187 |
-
st.session_state['sp_disp_frame'] = st.session_state['sp_disp_frame'].iloc[:page_var]
|
188 |
-
with col4:
|
189 |
-
if st.button('Next'):
|
190 |
-
st.session_state['sp_disp_frame'] = st.session_state['sp_disp_frame'].iloc[page_var:]
|
191 |
else:
|
192 |
with sp_disp_container:
|
193 |
st.dataframe(st.session_state['sp_disp_frame'].style.background_gradient(axis=0).background_gradient(cmap='RdYlGn_r').format(precision=2), height = 500, use_container_width = True, hide_index = True)
|
@@ -267,7 +296,9 @@ with hitter_tab:
|
|
267 |
if table_var_hitter in (['League Aggregate Baselines', 'League Short Term Baselines', 'League Long Term Baselines']):
|
268 |
with st.spinner("Full league baselines can take some time to load"):
|
269 |
time.sleep(7)
|
270 |
-
|
|
|
|
|
271 |
|
272 |
with team_tab:
|
273 |
with st.container(border = True):
|
|
|
53 |
}
|
54 |
</style>""", unsafe_allow_html=True)
|
55 |
|
56 |
+
def paginate_dataframe(df, page_size):
|
57 |
+
total_rows = len(df)
|
58 |
+
total_pages = (total_rows + page_size -1) // page_size
|
59 |
+
|
60 |
+
if 'current_page' not in st.session_state:
|
61 |
+
st.session_state['current_page'] = 0
|
62 |
+
|
63 |
+
start_idx = st.session_state['current_page'] * page_size
|
64 |
+
end_idx = start_idx + page_size
|
65 |
+
|
66 |
+
current_page_data = df.iloc[start_idx:end_idx]
|
67 |
+
|
68 |
+
return current_page_data, total_pages, total_rows
|
69 |
+
|
70 |
+
def display_paginated_table(df, page_size):
|
71 |
+
current_page_data, total_pages, total_rows = paginate_dataframe(df, page_size)
|
72 |
+
|
73 |
+
st.dataframe(current_page_data.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn_r').format(precision=2), height = 500, use_container_width = True, hide_index = True)
|
74 |
+
|
75 |
+
col1, col2, col3, col4 = st.columns(1, 2, 2, 1)
|
76 |
+
with col1:
|
77 |
+
if st.button('⏮️ First', disabled=st.session_state.current_page == 0):
|
78 |
+
st.session_state.current_page = 0
|
79 |
+
st.rerun()
|
80 |
+
with col2:
|
81 |
+
if st.button('⬅️ Previous', disabled=st.session_state.current_page == 0):
|
82 |
+
st.session_state.current_page -= 1
|
83 |
+
st.rerun()
|
84 |
+
with col3:
|
85 |
+
if st.button('Next ➡️', disabled=st.session_state.current_page >= total_pages - 1):
|
86 |
+
st.session_state.current_page += 1
|
87 |
+
st.rerun()
|
88 |
+
with col4:
|
89 |
+
if st.button('Last ⏭️', disabled=st.session_state.current_page >= total_pages - 1):
|
90 |
+
st.session_state.current_page = total_pages - 1
|
91 |
+
st.rerun()
|
92 |
+
|
93 |
@st.cache_resource(ttl = 61)
|
94 |
def init_baselines():
|
95 |
|
|
|
215 |
if table_var_sp in (['League Aggregate Baselines', 'League Short Term Baselines', 'League Long Term Baselines']):
|
216 |
|
217 |
with st.spinner("Full league baselines can take some time to load"):
|
218 |
+
time.sleep(5)
|
219 |
+
display_paginated_table(st.session_state['sp_disp_frame'], 50)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
220 |
else:
|
221 |
with sp_disp_container:
|
222 |
st.dataframe(st.session_state['sp_disp_frame'].style.background_gradient(axis=0).background_gradient(cmap='RdYlGn_r').format(precision=2), height = 500, use_container_width = True, hide_index = True)
|
|
|
296 |
if table_var_hitter in (['League Aggregate Baselines', 'League Short Term Baselines', 'League Long Term Baselines']):
|
297 |
with st.spinner("Full league baselines can take some time to load"):
|
298 |
time.sleep(7)
|
299 |
+
display_paginated_table(st.session_state['hitter_disp_frame'], 50)
|
300 |
+
else:
|
301 |
+
st.dataframe(st.session_state['hitter_disp_frame'].style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), height = 750, use_container_width = True, hide_index = True)
|
302 |
|
303 |
with team_tab:
|
304 |
with st.container(border = True):
|