Source code for pamir.summary

"""Fleet-level summary of a results frame, with coverage as a first-class field.

The headline number of a benchmark run is only defined when the model scored
every dataset it was given.  ``fleet_summary`` therefore reports ``auc_mean``
only for a complete run, and puts the partial average in a separately named
field so it cannot be mistaken for one.
"""

from typing import Dict, List, Optional

import pandas as pd

# The AUC column is named by the protocol that produced the frame.
AUC_COLUMNS = ("auc_final", "auc_mean")


def _auc_column(results: pd.DataFrame) -> str:
    for col in AUC_COLUMNS:
        if col in results.columns:
            return col
    raise ValueError(
        f"no auc column found: expected one of {AUC_COLUMNS}, "
        f"got {list(results.columns)}. Pass a frame returned by "
        "pamir.evaluate or pamir.evaluate_iid."
    )


[docs] def fleet_summary(results: pd.DataFrame) -> Dict[str, Optional[float]]: """Summarize a fleet run, withholding the mean when coverage is incomplete. Parameters ---------- results : DataFrame As returned by :func:`pamir.evaluate` or :func:`pamir.evaluate_iid`. Returns ------- dict with keys: ``n_datasets``, ``n_scored``, ``coverage``, ``complete`` How much of the fleet the model actually scored. ``auc_mean``, ``gini_mean`` The headline numbers — ``None`` unless every dataset was scored. ``auc_mean_scored_only`` The average over the datasets that did score. Diagnostic only: it is an average over a subset the model chose by failing, so it is not comparable across models. ``n_failures``, ``failed_datasets`` What went wrong and where. """ auc_col = _auc_column(results) scored = results[auc_col].notna() n_datasets = len(results) n_scored = int(scored.sum()) complete = n_datasets > 0 and n_scored == n_datasets partial_mean = float(results.loc[scored, auc_col].mean()) if n_scored else None failed: List[str] = ( results.loc[~scored, "dataset"].tolist() if "dataset" in results.columns else [] ) return { "n_datasets": n_datasets, "n_scored": n_scored, "coverage": n_scored / n_datasets if n_datasets else 0.0, "complete": complete, "auc_mean": partial_mean if complete else None, "gini_mean": 2 * partial_mean - 1 if complete and partial_mean else None, "auc_mean_scored_only": partial_mean, "n_failures": (int(results["n_failures"].sum()) if "n_failures" in results.columns else None), "failed_datasets": failed, }
def format_fleet_summary(summary: Dict) -> str: """One or two lines of human-readable summary, for ``verbose=True``.""" if summary["complete"]: return (f"\n Fleet mean AUC: {summary['auc_mean']:.4f} " f"Gini: {summary['gini_mean']:.3f} " f"({summary['n_datasets']} datasets, all scored)") failed = ", ".join(summary["failed_datasets"]) or "—" partial = summary["auc_mean_scored_only"] partial_text = f"{partial:.4f}" if partial is not None else "n/a" return ( f"\n NO FLEET MEAN: {summary['n_scored']} of {summary['n_datasets']} " f"datasets scored (failed: {failed})." f"\n Mean over the scored subset only: {partial_text} — not comparable " "with a model that scored the whole fleet." )