1
1
import pandas as pd
2
2
import plotly .express as px
3
3
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
4
6
5
7
from lib .api import fetch_api_data
6
8
@@ -126,6 +128,16 @@ def health_page():
126
128
127
129
# Convert to DataFrame and add pagination
128
130
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
+
129
141
total_rows = len (df )
130
142
page_size = 10
131
143
total_pages = (total_rows + page_size - 1 ) // page_size # Ceiling division
@@ -149,24 +161,164 @@ def health_page():
149
161
most_levered_positions = fetch_api_data (
150
162
"health" ,
151
163
"most_levered_perp_positions_above_1m" ,
164
+ params = {
165
+ "number_of_positions" : num_positions ,
166
+ "market_index" : None
167
+ },
152
168
retry = True ,
153
169
)
154
170
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 )
156
204
157
205
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
+
158
227
largest_spot_borrows = fetch_api_data (
159
228
"health" ,
160
229
"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
+ },
161
235
retry = True ,
162
236
)
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 )
165
270
166
271
most_levered_borrows = fetch_api_data (
167
272
"health" ,
168
273
"most_levered_spot_borrows_above_1m" ,
274
+ params = {
275
+ "number_of_positions" : spot_num_positions ,
276
+ "market_index" : None
277
+ },
169
278
retry = True ,
170
279
)
171
280
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