Source code for detoxai.visualization.MetricsVisualizer

from abc import ABC

import pandas as pd

from .Visualizer import Visualizer

CANNONICAL_COLUMNS = [
    "metric_name",
    "metric_class",
    "is_per_class",
    "class_name",
    "is_per_group",
    "group_name",
    "metrics_type",
    "reducer",
    "value",
]


[docs] class MetricsVisualizer(Visualizer, ABC): """ """ metrics_config: dict | None = None
[docs] @classmethod def canonize_results(cls, results: dict, metrics_config: dict) -> pd.DataFrame: """ Args: results: dict: metrics_config: dict: Returns: """ joint_df = pd.DataFrame() for method_name, res in results.items(): # Check if already cannonical if isinstance(res, pd.DataFrame) and all( [i in res.columns for i in CANNONICAL_COLUMNS] ): new_df = res.copy() # Else convert to canonical else: new_df = results_to_tidy_df(res, metrics_config) new_df["method_name"] = method_name joint_df = pd.concat([joint_df, new_df], ignore_index=True) joint_df["value"] = joint_df["value"].astype(float) return joint_df.reset_index(drop=True)
[docs] def results_to_tidy_df(results, metrics_config): """ Args: results: metrics_config: Returns: """ tidy_results = {} for key, value in results.items(): splitted_key = key.split("_") metrics_type = splitted_key[0] raw_metric_name = key metric_name = splitted_key[1] metric_class = ( "performance" if metric_name in metrics_config["performance"]["metrics"] else "fairness" ) metric_config = metrics_config[metric_class]["metrics"].get(metric_name) if metric_config is None: raise ValueError(f"Metric config for {metric_name} not found") value = format(value * 100, ".2f") reducer_name = splitted_key[-1] is_per_class = splitted_key[-1] == "class" is_per_group = splitted_key[-1] == "group" merged_name = "_".join(splitted_key[2:-1]) class_name = merged_name if is_per_class else None group_name = merged_name if is_per_group else None tidy_results[raw_metric_name] = [ metric_name, metric_class, is_per_class, class_name, is_per_group, group_name, metrics_type, reducer_name, value, ] df = pd.DataFrame(tidy_results).T df.columns = [ "metric_name", "metric_class", "is_per_class", "class_name", "is_per_group", "group_name", "metrics_type", "reducer", "value", ] return df