Source code for detoxai.visualization.TableVisualizer

import pandas as pd

from ..utils.decorators import ensure_metrics_config_not_empty
from .MetricsVisualizer import MetricsVisualizer


[docs] class TableVisualizer(MetricsVisualizer): """ """ def __init__(self, results: dict, metrics_config: dict) -> None: self.raw_results: pd.DataFrame = self.canonize_results(results, metrics_config) self.metrics_config = metrics_config self.results: pd.DataFrame | None = None self.create_table() @ensure_metrics_config_not_empty def create_table(self) -> None: """ """ self.results = self.__organize_metrics(self.raw_results)
[docs] def get_table(self) -> pd.DataFrame: """Get formated table aggregated for all methods""" return self.results
[docs] def get_latex_table(self) -> str: """Get formatted table in LaTeX format with enhanced styling""" latex = self.results.to_latex( index=True, multirow=True, multicolumn=True, bold_rows=True, column_format="|l" + "c" * (len(self.results.columns)) + "|", float_format="%.2f", caption="Aggregated Metrics Results Table", label="tab:metrics_results", ) # Replace all "_" with "\_" latex = latex.replace("_", "\\_") return latex
[docs] def get_raw_results(self) -> pd.DataFrame: """Get raw results, i.e., the results as a melted DataFrame""" return self.raw_results
[docs] def save_to_csv(self, path: str) -> None: """Save the table to a CSV file Args: path: str: Returns: """ self.results.to_csv(path, index=True)
@classmethod def __organize_metrics(cls, df: pd.DataFrame) -> pd.DataFrame: # Pivot performance metrics based on method, class_name, and reducer performance_df = df[df["metric_class"] == "performance"] performance_df.loc[performance_df["class_name"].isna(), "class_name"] = "all" performance_df.loc[performance_df["group_name"].isna(), "group_name"] = "-" performance_pivot = performance_df.pivot_table( index="method_name", columns=[ "metric_name", "metric_class", "reducer", "is_per_class", "group_name", "class_name", ], values="value", # dropna=False, ) fairness_df = df[df["metric_class"] == "fairness"] fairness_df.loc[fairness_df["class_name"].isna(), "class_name"] = "-" fairness_df.loc[fairness_df["group_name"].isna(), "group_name"] = "all" fairness_pivot = fairness_df.pivot_table( index="method_name", columns=[ "metric_name", "metric_class", "reducer", "is_per_class", "group_name", "class_name", ], values="value", # dropna=False, ) # Combine performance and fairness metrics back into a single DataFrame combined_pivot = pd.concat([performance_pivot, fairness_pivot], axis=1) return combined_pivot