BRIDGE-Medical-Leaderboard / utils /leaderboard_postprocessor.py
kevinxie06's picture
Upload all utils files
fd7d17f verified
raw
history blame
2.57 kB
import warnings
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union, Literal
import pandas as pd
from pandas.io.formats.style import Styler
import semantic_version
from gradio.data_classes import GradioModel
class DataframeData(GradioModel):
headers: List[str]
data: Union[List[List[Any]], List[Tuple[Any, ...]]]
metadata: Optional[Dict[str, Optional[List[Any]]]] = None
def postprocess(self, value: pd.DataFrame) -> DataframeData:
"""Custom postprocess function that sorts by Average Performance"""
# Ensure that the "Average Performance" column exists
if "Average Performance" in value.columns:
# Sort the DataFrame by the "average performance" column in descending order
value = value.sort_values(by="Average Performance", ascending=False)
return DataframeData(
headers=list(value.columns), # type: ignore
data=value.to_dict(orient="split")["data"], # type: ignore
)
if value is None:
return self.postprocess(pd.DataFrame({"column 1": []}))
if isinstance(value, (str, pd.DataFrame)):
if isinstance(value, str):
value = pd.read_csv(value) # type: ignore
if len(value) == 0:
return DataframeData(
headers=list(value.columns), # type: ignore
data=[[]], # type: ignore
)
return DataframeData(
headers=list(value.columns), # type: ignore
data=value.to_dict(orient="split")["data"], # type: ignore
)
elif isinstance(value, Styler):
if semantic_version.Version(pd.__version__) < semantic_version.Version(
"1.5.0"
):
raise ValueError(
"Styler objects are only supported in pandas version 1.5.0 or higher. Please try: `pip install --upgrade pandas` to use this feature."
)
if self.interactive:
warnings.warn(
"Cannot display Styler object in interactive mode. Will display as a regular pandas dataframe instead."
)
df: pd.DataFrame = value.data # type: ignore
if len(df) == 0:
return DataframeData(
headers=list(df.columns),
data=[[]],
metadata=self.__extract_metadata(value), # type: ignore
)
return DataframeData(
headers=list(df.columns),
data=df.to_dict(orient="split")["data"], # type: ignore
metadata=self.__extract_metadata(value), # type: ignore
)