Spaces:
Sleeping
Sleeping
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 |
"""
|