Skip to content

Commit 1521df2

Browse files
committed
Enhance health page functionality with market symbol integration and pagination
- Added imports for mainnet perpetual and spot market configurations to facilitate market symbol retrieval. - Implemented logic to dynamically find and format the 'market index' column in both perpetual and spot positions, appending the corresponding market symbol for better clarity. - Introduced pagination for displaying the most levered perpetual positions and largest spot borrows, allowing users to navigate through results more efficiently. - Added user input controls for the number of positions displayed and a toggle to bypass cache for spot borrows in debug mode. - Included error handling for positions with errors in the most levered spot borrows section, providing warnings and detailed views for better user awareness.
1 parent 7e446b0 commit 1521df2

File tree

1 file changed

+156
-4
lines changed

1 file changed

+156
-4
lines changed

src/page/health.py

Lines changed: 156 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import pandas as pd
22
import plotly.express as px
33
import streamlit as st
4+
from driftpy.constants.perp_markets import mainnet_perp_market_configs
5+
from driftpy.constants.spot_markets import mainnet_spot_market_configs
46

57
from lib.api import fetch_api_data
68

@@ -126,6 +128,16 @@ def health_page():
126128

127129
# Convert to DataFrame and add pagination
128130
df = pd.DataFrame(largest_perp_positions)
131+
132+
# Find market index column regardless of capitalization
133+
market_index_col = next((col for col in df.columns if col.lower() == 'market index' or col.lower() == 'market_index'), None)
134+
135+
# Add market symbol to market_index column if it exists
136+
if market_index_col:
137+
df[market_index_col] = df[market_index_col].map(
138+
lambda x: f"{x} ({mainnet_perp_market_configs[int(x)].symbol})" if pd.notna(x) else x
139+
)
140+
129141
total_rows = len(df)
130142
page_size = 10
131143
total_pages = (total_rows + page_size - 1) // page_size # Ceiling division
@@ -149,24 +161,164 @@ def health_page():
149161
most_levered_positions = fetch_api_data(
150162
"health",
151163
"most_levered_perp_positions_above_1m",
164+
params={
165+
"number_of_positions": num_positions,
166+
"market_index": None
167+
},
152168
retry=True,
153169
)
154170
st.markdown("### **Most levered perp positions > $1m:**")
155-
st.dataframe(pd.DataFrame(most_levered_positions), hide_index=True)
171+
172+
# Format market index in most_levered_positions too
173+
most_levered_df = pd.DataFrame(most_levered_positions)
174+
175+
# Find market index column regardless of capitalization
176+
ml_market_index_col = next((col for col in most_levered_df.columns if col.lower() == 'market index' or col.lower() == 'market_index'), None)
177+
178+
# Add market symbol to market_index column if it exists
179+
if ml_market_index_col:
180+
most_levered_df[ml_market_index_col] = most_levered_df[ml_market_index_col].map(
181+
lambda x: f"{x} ({mainnet_perp_market_configs[int(x)].symbol})" if pd.notna(x) else x
182+
)
183+
184+
# Add pagination
185+
total_rows = len(most_levered_df)
186+
page_size = 10
187+
total_pages = (total_rows + page_size - 1) // page_size # Ceiling division
188+
189+
if total_pages > 1:
190+
page_number = st.number_input(
191+
"Page",
192+
min_value=1,
193+
max_value=total_pages,
194+
value=1,
195+
key="levered_perp_positions_page"
196+
)
197+
start_idx = (page_number - 1) * page_size
198+
end_idx = min(start_idx + page_size, total_rows)
199+
200+
st.write(f"Showing positions {start_idx + 1}-{end_idx} of {total_rows}")
201+
st.dataframe(most_levered_df.iloc[start_idx:end_idx], hide_index=True)
202+
else:
203+
st.dataframe(most_levered_df, hide_index=True)
156204

157205
with spot_col:
206+
st.markdown("### **Largest spot borrows:**")
207+
# Add number input to control how many positions to show
208+
spot_num_positions = st.number_input(
209+
"Number of values to return for spot borrows",
210+
min_value=10,
211+
max_value=100,
212+
value=10,
213+
step=10,
214+
key="num_spot_positions"
215+
)
216+
217+
# Add bypass cache toggle when in debug mode
218+
spot_bypass_cache = False
219+
if debug_mode:
220+
spot_bypass_cache = st.toggle(
221+
"Bypass cache for spot borrows",
222+
value=False,
223+
help="When enabled, the API will bypass the cache and fetch fresh data directly",
224+
key="bypass_spot_cache"
225+
)
226+
158227
largest_spot_borrows = fetch_api_data(
159228
"health",
160229
"largest_spot_borrows",
230+
params={
231+
"number_of_positions": spot_num_positions,
232+
"market_index": None,
233+
"bypass_cache": "true" if spot_bypass_cache else "false"
234+
},
161235
retry=True,
162236
)
163-
st.markdown("### **Largest spot borrows:**")
164-
st.dataframe(pd.DataFrame(largest_spot_borrows), hide_index=True)
237+
238+
# Convert to dataframe and add market symbols
239+
spot_df = pd.DataFrame(largest_spot_borrows)
240+
241+
# Find market index column regardless of capitalization
242+
spot_market_index_col = next((col for col in spot_df.columns if col.lower() == 'market index' or col.lower() == 'market_index'), None)
243+
244+
# Add market symbol to market_index column if it exists
245+
if spot_market_index_col:
246+
spot_df[spot_market_index_col] = spot_df[spot_market_index_col].map(
247+
lambda x: f"{x} ({mainnet_spot_market_configs[int(x)].symbol})" if pd.notna(x) else x
248+
)
249+
250+
# Add pagination
251+
total_rows = len(spot_df)
252+
page_size = 10
253+
total_pages = (total_rows + page_size - 1) // page_size # Ceiling division
254+
255+
if total_pages > 1:
256+
page_number = st.number_input(
257+
"Page",
258+
min_value=1,
259+
max_value=total_pages,
260+
value=1,
261+
key="spot_borrows_page"
262+
)
263+
start_idx = (page_number - 1) * page_size
264+
end_idx = min(start_idx + page_size, total_rows)
265+
266+
st.write(f"Showing borrows {start_idx + 1}-{end_idx} of {total_rows}")
267+
st.dataframe(spot_df.iloc[start_idx:end_idx], hide_index=True)
268+
else:
269+
st.dataframe(spot_df, hide_index=True)
165270

166271
most_levered_borrows = fetch_api_data(
167272
"health",
168273
"most_levered_spot_borrows_above_1m",
274+
params={
275+
"number_of_positions": spot_num_positions,
276+
"market_index": None
277+
},
169278
retry=True,
170279
)
171280
st.markdown("### **Most levered spot borrows > $750k:**")
172-
st.dataframe(pd.DataFrame(most_levered_borrows), hide_index=True)
281+
282+
# Convert to dataframe and add market symbols
283+
levered_spot_df = pd.DataFrame(most_levered_borrows)
284+
285+
# Find market index column regardless of capitalization
286+
levered_spot_market_index_col = next((col for col in levered_spot_df.columns if col.lower() == 'market index' or col.lower() == 'market_index'), None)
287+
288+
# Add market symbol to market_index column if it exists
289+
if levered_spot_market_index_col:
290+
levered_spot_df[levered_spot_market_index_col] = levered_spot_df[levered_spot_market_index_col].map(
291+
lambda x: f"{x} ({mainnet_spot_market_configs[int(x)].symbol})" if pd.notna(x) else x
292+
)
293+
294+
# Check if there are any error messages in the data
295+
has_errors = 'Error' in levered_spot_df.columns and levered_spot_df['Error'].any()
296+
if has_errors:
297+
error_records = levered_spot_df[levered_spot_df['Error'].notna() & (levered_spot_df['Error'] != '')]
298+
if not error_records.empty:
299+
st.warning(f"Found {len(error_records)} positions with errors. Please check with the team.")
300+
with st.expander("View Error Details"):
301+
for idx, row in error_records.iterrows():
302+
market_index = row[levered_spot_market_index_col] if levered_spot_market_index_col in row else row.get('Market Index', 'Unknown')
303+
st.markdown(f"**Market {market_index}:** {row['Error']}")
304+
305+
# Add pagination
306+
total_rows = len(levered_spot_df)
307+
page_size = 10
308+
total_pages = (total_rows + page_size - 1) // page_size # Ceiling division
309+
310+
if total_pages > 1:
311+
page_number = st.number_input(
312+
"Page",
313+
min_value=1,
314+
max_value=total_pages,
315+
value=1,
316+
key="levered_spot_borrows_page"
317+
)
318+
start_idx = (page_number - 1) * page_size
319+
end_idx = min(start_idx + page_size, total_rows)
320+
321+
st.write(f"Showing borrows {start_idx + 1}-{end_idx} of {total_rows}")
322+
st.dataframe(levered_spot_df.iloc[start_idx:end_idx], hide_index=True)
323+
else:
324+
st.dataframe(levered_spot_df, hide_index=True)

0 commit comments

Comments
 (0)