style theme
Browse files- app.py +96 -50
- src/display/utils.py +3 -17
app.py
CHANGED
@@ -171,27 +171,44 @@ def update_column_choices(df):
|
|
171 |
|
172 |
# Update the column_selector initialization
|
173 |
def get_initial_columns():
|
174 |
-
"""Get initial columns to show in the dropdown"""
|
175 |
try:
|
|
|
176 |
# Get available columns in the main dataframe
|
177 |
available_cols = list(LEADERBOARD_DF.columns)
|
178 |
logger.info(f"Available columns in LEADERBOARD_DF: {available_cols}")
|
179 |
|
180 |
-
#
|
181 |
-
if
|
182 |
-
return get_default_visible_columns()
|
183 |
|
184 |
-
#
|
185 |
-
|
|
|
186 |
|
187 |
-
#
|
188 |
-
|
189 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
190 |
|
191 |
-
return valid_defaults
|
192 |
except Exception as e:
|
193 |
logger.error(f"Error getting initial columns: {e}")
|
194 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
195 |
|
196 |
def init_leaderboard(dataframe, visible_columns=None):
|
197 |
"""
|
@@ -256,7 +273,12 @@ def init_leaderboard(dataframe, visible_columns=None):
|
|
256 |
datatypes.append(col_type)
|
257 |
|
258 |
# Create a mapping from internal column names to display names
|
259 |
-
|
|
|
|
|
|
|
|
|
|
|
260 |
|
261 |
# Create the list of headers using display names
|
262 |
display_headers = [all_columns_map.get(col, col) for col in visible_columns]
|
@@ -339,13 +361,32 @@ def refresh_data_with_filters(version=CURRENT_VERSION, search_query="", model_ty
|
|
339 |
"""
|
340 |
Refresh the leaderboard data and update all components with filtering.
|
341 |
Ensures we handle cases where dataframes might have limited columns.
|
|
|
|
|
|
|
|
|
|
|
|
|
342 |
"""
|
343 |
try:
|
344 |
logger.info(f"Performing refresh of leaderboard data with filters...")
|
345 |
# Get new data
|
346 |
main_df = get_leaderboard_df(version=version)
|
347 |
category_dfs = [get_category_leaderboard_df(category, version=version) for category in CATEGORIES]
|
348 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
349 |
|
350 |
# Log the actual columns we have
|
351 |
logger.info(f"Main dataframe columns: {list(main_df.columns)}")
|
@@ -357,27 +398,31 @@ def refresh_data_with_filters(version=CURRENT_VERSION, search_query="", model_ty
|
|
357 |
for df in category_dfs
|
358 |
]
|
359 |
|
360 |
-
# Get available columns from the
|
361 |
available_columns = list(filtered_main_df.columns)
|
362 |
|
363 |
-
# Filter selected columns to only those available in the data
|
364 |
-
if
|
365 |
-
|
366 |
-
|
367 |
-
|
|
|
368 |
else:
|
369 |
-
|
|
|
370 |
|
371 |
-
# Initialize dataframes for display with valid selected columns
|
372 |
-
main_dataframe = init_leaderboard(filtered_main_df,
|
373 |
|
374 |
# For category dataframes, get columns that actually exist in each one
|
375 |
category_dataframes = []
|
376 |
for df in filtered_category_dfs:
|
377 |
df_columns = list(df.columns)
|
378 |
-
|
379 |
-
|
380 |
-
|
|
|
|
|
381 |
category_dataframes.append(init_leaderboard(df, df_valid_columns))
|
382 |
|
383 |
return main_dataframe, *category_dataframes
|
@@ -672,45 +717,44 @@ with demo:
|
|
672 |
Update all leaderboards to show the selected columns.
|
673 |
Ensures all selected columns are preserved in the update.
|
674 |
|
|
|
|
|
675 |
"""
|
676 |
|
677 |
try:
|
678 |
-
logger.info(f"Updating columns
|
679 |
|
680 |
-
#
|
681 |
-
|
682 |
-
|
683 |
-
|
|
|
|
|
|
|
684 |
|
685 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
686 |
|
|
|
|
|
|
|
687 |
|
688 |
# Get the current data with ALL columns preserved
|
689 |
main_df = get_leaderboard_df(version=version_selector.value)
|
690 |
-
|
691 |
-
# Get category dataframes with ALL columns preserved
|
692 |
category_dfs = [get_category_leaderboard_df(category, version=version_selector.value)
|
693 |
for category in CATEGORIES]
|
694 |
|
695 |
-
#
|
696 |
-
|
697 |
-
logger.info(f"Selected columns: {selected_columns}")
|
698 |
-
|
699 |
-
# IMPORTANT: Make sure model_name is always included
|
700 |
-
if 'model_name' in main_df.columns and 'model_name' not in selected_columns:
|
701 |
-
selected_columns = ['model_name'] + selected_columns
|
702 |
-
|
703 |
-
# Initialize the main leaderboard with the selected columns
|
704 |
-
# We're passing the raw selected_columns directly to preserve the selection
|
705 |
-
main_leaderboard = init_leaderboard(main_df, selected_columns)
|
706 |
-
|
707 |
-
# Initialize category dataframes with the same selected columns
|
708 |
-
# This ensures consistency across all tabs
|
709 |
category_leaderboards = []
|
710 |
for df in category_dfs:
|
711 |
-
|
712 |
-
# init_leaderboard will automatically handle filtering to columns that exist
|
713 |
-
category_leaderboards.append(init_leaderboard(df, selected_columns))
|
714 |
|
715 |
return main_leaderboard, *category_leaderboards
|
716 |
|
@@ -718,6 +762,8 @@ with demo:
|
|
718 |
logger.error(f"Error updating columns: {e}")
|
719 |
import traceback
|
720 |
logger.error(traceback.format_exc())
|
|
|
|
|
721 |
return leaderboard, *[tab.children[0] for tab in category_tabs.children[1:len(CATEGORIES)+1]]
|
722 |
|
723 |
# Connect column selector to update function
|
|
|
171 |
|
172 |
# Update the column_selector initialization
|
173 |
def get_initial_columns():
|
174 |
+
"""Get initial columns to show in the dropdown (as display names)."""
|
175 |
try:
|
176 |
+
internal_defaults = []
|
177 |
# Get available columns in the main dataframe
|
178 |
available_cols = list(LEADERBOARD_DF.columns)
|
179 |
logger.info(f"Available columns in LEADERBOARD_DF: {available_cols}")
|
180 |
|
181 |
+
# Get default visible internal names that actually exist
|
182 |
+
internal_defaults = [col for col in get_default_visible_columns() if col in available_cols]
|
|
|
183 |
|
184 |
+
# If none of the defaults exist, use all available columns
|
185 |
+
if not internal_defaults:
|
186 |
+
internal_defaults = available_cols
|
187 |
|
188 |
+
# Map internal names to display names
|
189 |
+
gb_cols_instance = GUARDBENCH_COLUMN()
|
190 |
+
all_columns_map = {
|
191 |
+
field.name: getattr(gb_cols_instance, field.name).display_name
|
192 |
+
for field in fields(gb_cols_instance)
|
193 |
+
if hasattr(getattr(gb_cols_instance, field.name), 'display_name')
|
194 |
+
}
|
195 |
+
display_defaults = [all_columns_map.get(col, col) for col in internal_defaults]
|
196 |
+
return display_defaults
|
197 |
|
|
|
198 |
except Exception as e:
|
199 |
logger.error(f"Error getting initial columns: {e}")
|
200 |
+
# Fallback to default internal names mapped to display names if possible
|
201 |
+
try:
|
202 |
+
gb_cols_instance = GUARDBENCH_COLUMN()
|
203 |
+
all_columns_map = {
|
204 |
+
field.name: getattr(gb_cols_instance, field.name).display_name
|
205 |
+
for field in fields(gb_cols_instance)
|
206 |
+
if hasattr(getattr(gb_cols_instance, field.name), 'display_name')
|
207 |
+
}
|
208 |
+
default_internal = get_default_visible_columns()
|
209 |
+
return [all_columns_map.get(col, col) for col in default_internal]
|
210 |
+
except:
|
211 |
+
return get_default_visible_columns() # Final fallback
|
212 |
|
213 |
def init_leaderboard(dataframe, visible_columns=None):
|
214 |
"""
|
|
|
273 |
datatypes.append(col_type)
|
274 |
|
275 |
# Create a mapping from internal column names to display names
|
276 |
+
gb_cols_instance = GUARDBENCH_COLUMN() # Create an instance
|
277 |
+
all_columns_map = {
|
278 |
+
field.name: getattr(gb_cols_instance, field.name).display_name
|
279 |
+
for field in fields(gb_cols_instance)
|
280 |
+
if hasattr(getattr(gb_cols_instance, field.name), 'display_name') # Ensure it has display_name
|
281 |
+
}
|
282 |
|
283 |
# Create the list of headers using display names
|
284 |
display_headers = [all_columns_map.get(col, col) for col in visible_columns]
|
|
|
361 |
"""
|
362 |
Refresh the leaderboard data and update all components with filtering.
|
363 |
Ensures we handle cases where dataframes might have limited columns.
|
364 |
+
|
365 |
+
Args:
|
366 |
+
version: Benchmark version.
|
367 |
+
search_query: Text search query.
|
368 |
+
model_types: List of model types to filter by.
|
369 |
+
selected_columns: List of display names for columns to show.
|
370 |
"""
|
371 |
try:
|
372 |
logger.info(f"Performing refresh of leaderboard data with filters...")
|
373 |
# Get new data
|
374 |
main_df = get_leaderboard_df(version=version)
|
375 |
category_dfs = [get_category_leaderboard_df(category, version=version) for category in CATEGORIES]
|
376 |
+
|
377 |
+
# Create reverse mapping from display name to internal name
|
378 |
+
gb_cols_instance = GUARDBENCH_COLUMN()
|
379 |
+
display_to_internal_map = {
|
380 |
+
getattr(gb_cols_instance, field.name).display_name: field.name
|
381 |
+
for field in fields(gb_cols_instance)
|
382 |
+
if hasattr(getattr(gb_cols_instance, field.name), 'display_name')
|
383 |
+
}
|
384 |
+
|
385 |
+
# Convert selected display names to internal names
|
386 |
+
if selected_columns:
|
387 |
+
internal_selected_columns = [display_to_internal_map.get(disp_name, disp_name) for disp_name in selected_columns]
|
388 |
+
else:
|
389 |
+
internal_selected_columns = None # Let init_leaderboard handle default
|
390 |
|
391 |
# Log the actual columns we have
|
392 |
logger.info(f"Main dataframe columns: {list(main_df.columns)}")
|
|
|
398 |
for df in category_dfs
|
399 |
]
|
400 |
|
401 |
+
# Get available columns from the filtered data
|
402 |
available_columns = list(filtered_main_df.columns)
|
403 |
|
404 |
+
# Filter internal selected columns to only those available in the data
|
405 |
+
if internal_selected_columns:
|
406 |
+
valid_internal_selected_columns = [col for col in internal_selected_columns if col in available_columns]
|
407 |
+
# Ensure model_name is always present if available
|
408 |
+
if 'model_name' in available_columns and 'model_name' not in valid_internal_selected_columns:
|
409 |
+
valid_internal_selected_columns = ['model_name'] + valid_internal_selected_columns
|
410 |
else:
|
411 |
+
# If no columns were selected initially, use all available internal columns
|
412 |
+
valid_internal_selected_columns = available_columns
|
413 |
|
414 |
+
# Initialize dataframes for display with valid internal selected columns
|
415 |
+
main_dataframe = init_leaderboard(filtered_main_df, valid_internal_selected_columns)
|
416 |
|
417 |
# For category dataframes, get columns that actually exist in each one
|
418 |
category_dataframes = []
|
419 |
for df in filtered_category_dfs:
|
420 |
df_columns = list(df.columns)
|
421 |
+
# Use the same valid internal columns, filtered for existence in this specific df
|
422 |
+
df_valid_columns = [col for col in valid_internal_selected_columns if col in df_columns]
|
423 |
+
# Ensure model_name if available
|
424 |
+
if 'model_name' in df_columns and 'model_name' not in df_valid_columns:
|
425 |
+
df_valid_columns = ['model_name'] + df_valid_columns
|
426 |
category_dataframes.append(init_leaderboard(df, df_valid_columns))
|
427 |
|
428 |
return main_dataframe, *category_dataframes
|
|
|
717 |
Update all leaderboards to show the selected columns.
|
718 |
Ensures all selected columns are preserved in the update.
|
719 |
|
720 |
+
Args:
|
721 |
+
selected_columns: List of display names from the dropdown.
|
722 |
"""
|
723 |
|
724 |
try:
|
725 |
+
logger.info(f"Updating columns based on display names: {selected_columns}")
|
726 |
|
727 |
+
# Create reverse mapping from display name to internal name
|
728 |
+
gb_cols_instance = GUARDBENCH_COLUMN()
|
729 |
+
display_to_internal_map = {
|
730 |
+
getattr(gb_cols_instance, field.name).display_name: field.name
|
731 |
+
for field in fields(gb_cols_instance)
|
732 |
+
if hasattr(getattr(gb_cols_instance, field.name), 'display_name')
|
733 |
+
}
|
734 |
|
735 |
+
# Convert selected display names to internal names
|
736 |
+
if not selected_columns or len(selected_columns) == 0:
|
737 |
+
# If empty, get default internal names
|
738 |
+
internal_selected_columns = get_default_visible_columns()
|
739 |
+
logger.info(f"No columns selected, using default internal names: {internal_selected_columns}")
|
740 |
+
else:
|
741 |
+
internal_selected_columns = [display_to_internal_map.get(disp_name, disp_name) for disp_name in selected_columns]
|
742 |
+
logger.info(f"Converted display names to internal names: {internal_selected_columns}")
|
743 |
|
744 |
+
# Ensure 'model_name' is always included internally
|
745 |
+
if 'model_name' not in internal_selected_columns:
|
746 |
+
internal_selected_columns = ['model_name'] + internal_selected_columns
|
747 |
|
748 |
# Get the current data with ALL columns preserved
|
749 |
main_df = get_leaderboard_df(version=version_selector.value)
|
|
|
|
|
750 |
category_dfs = [get_category_leaderboard_df(category, version=version_selector.value)
|
751 |
for category in CATEGORIES]
|
752 |
|
753 |
+
# Initialize leaderboards with the internal selected columns
|
754 |
+
main_leaderboard = init_leaderboard(main_df, internal_selected_columns)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
755 |
category_leaderboards = []
|
756 |
for df in category_dfs:
|
757 |
+
category_leaderboards.append(init_leaderboard(df, internal_selected_columns))
|
|
|
|
|
758 |
|
759 |
return main_leaderboard, *category_leaderboards
|
760 |
|
|
|
762 |
logger.error(f"Error updating columns: {e}")
|
763 |
import traceback
|
764 |
logger.error(traceback.format_exc())
|
765 |
+
# Fallback logic might need adjustment if state uses display names
|
766 |
+
# For now, return existing components
|
767 |
return leaderboard, *[tab.children[0] for tab in category_tabs.children[1:len(CATEGORIES)+1]]
|
768 |
|
769 |
# Connect column selector to update function
|
src/display/utils.py
CHANGED
@@ -373,23 +373,9 @@ METRICS = [
|
|
373 |
]
|
374 |
|
375 |
def get_all_column_choices():
|
376 |
-
"""
|
377 |
-
|
378 |
-
|
379 |
-
Returns:
|
380 |
-
List of tuples with (column_name, display_name) for all columns.
|
381 |
-
"""
|
382 |
-
column_choices = []
|
383 |
-
|
384 |
-
default_visible_columns = get_default_visible_columns()
|
385 |
-
|
386 |
-
for f in fields(GUARDBENCH_COLUMN):
|
387 |
-
column_info = getattr(GUARDBENCH_COLUMN, f.name)
|
388 |
-
# Create a tuple with both the internal name and display name
|
389 |
-
if column_info.name not in default_visible_columns:
|
390 |
-
column_choices.append((column_info.name, column_info.display_name))
|
391 |
-
|
392 |
-
return column_choices
|
393 |
|
394 |
def get_default_visible_columns():
|
395 |
"""
|
|
|
373 |
]
|
374 |
|
375 |
def get_all_column_choices():
|
376 |
+
"""Get all possible column choices as display names."""
|
377 |
+
gb_cols_instance = GuardBenchColumn()
|
378 |
+
return [getattr(gb_cols_instance, field.name).display_name for field in fields(gb_cols_instance) if hasattr(getattr(gb_cols_instance, field.name), 'display_name')]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
379 |
|
380 |
def get_default_visible_columns():
|
381 |
"""
|