EmbodiedCity-Leaderboard / src /leaderboard.py
serendipityAc2Win's picture
Replace tag filters with entry type filter
757e891 verified
Raw
History Blame Contribute Delete
3.84 kB
from __future__ import annotations
from typing import Dict, List, Literal, Optional
import numpy as np
import pandas as pd
class Leaderboard:
def __init__(self, data_loader):
self.data_loader = data_loader
self.metric_better: Dict[str, Literal["min", "max"]] = {
metric: "min" if metric in data_loader.lower_better else "max"
for metric in data_loader.ALL_METRICS
}
self.dimension_metrics = list(data_loader.DIMENSION_METRICS)
def update_leaderboard(
self,
metric: str,
top_k: int,
model_filter: str,
entry_type_filter: str,
sort_mode: str,
selected_metrics: Optional[List[str]],
) -> pd.DataFrame:
if self.data_loader.df_all is None or self.data_loader.df_all.empty:
return pd.DataFrame()
df = self.data_loader.df_all.copy()
if metric not in df.columns:
return pd.DataFrame()
if model_filter and model_filter.strip():
df = df[df["Model"].str.contains(model_filter, case=False, na=False)]
if entry_type_filter and entry_type_filter != "All":
df = df[df["entry_type"] == entry_type_filter]
better = self.metric_better.get(metric, "max")
if sort_mode == "Auto":
ascending = better == "min"
elif sort_mode == "Ascending (low → high)":
ascending = True
else:
ascending = False
df_sorted = df.dropna(subset=[metric]).sort_values(metric, ascending=ascending).copy()
df_sorted["Rank"] = range(1, len(df_sorted) + 1)
df_top = df_sorted.head(top_k).copy()
fixed_cols = ["Model", "entry_type", metric, "Rank"]
selected_metrics = selected_metrics or []
filtered_selected_metrics = [metric_name for metric_name in selected_metrics if metric_name not in fixed_cols]
existing_cols = [col for col in fixed_cols + filtered_selected_metrics if col in df_top.columns]
table_df = df_top[existing_cols].copy()
for col in table_df.columns:
if col in {"Model", "entry_type"}:
continue
if col == "Rank":
table_df[col] = table_df[col].apply(lambda value: f"{int(value)}" if pd.notna(value) else "N/A")
else:
table_df[col] = table_df[col].apply(lambda value: f"{value:.2f}" if pd.notna(value) else "N/A")
return self._add_styling_to_dataframe(table_df)
def _add_styling_to_dataframe(self, df: pd.DataFrame) -> pd.DataFrame:
styled_df = df.copy()
numeric_cols = [col for col in df.columns if col not in ["Model", "entry_type", "Rank"]]
for col in numeric_cols:
try:
numeric_values = df[col].apply(lambda value: float(value) if value != "N/A" and pd.notna(value) else np.nan)
except Exception:
continue
valid_values = numeric_values.dropna()
if len(valid_values) < 1:
continue
better = self.metric_better.get(col, "max")
sorted_values = valid_values.sort_values(ascending=(better == "min"))
try:
best_idx = sorted_values.index[0]
best_val = df.loc[best_idx, col]
if pd.notna(best_val) and best_val != "N/A":
styled_df.loc[best_idx, col] = f"**{best_val}**"
if len(sorted_values) >= 2:
second_idx = sorted_values.index[1]
second_val = df.loc[second_idx, col]
if pd.notna(second_val) and second_val != "N/A":
styled_df.loc[second_idx, col] = f"<u>{second_val}</u>"
except (IndexError, KeyError, ValueError):
continue
return styled_df