Source code for bob.ip.binseg.utils.table

#!/usr/bin/env python
# coding=utf-8


import tabulate

from .measure import auc


[docs]def performance_table(data, fmt): """Tables result comparison in a given format Parameters ---------- data : dict A dictionary in which keys are strings defining plot labels and values are dictionaries with two entries: * ``df``: :py:class:`pandas.DataFrame` A dataframe that is produced by our evaluator engine, indexed by integer "thresholds", containing the following columns: ``threshold``, ``tp``, ``fp``, ``tn``, ``fn``, ``mean_precision``, ``mode_precision``, ``lower_precision``, ``upper_precision``, ``mean_recall``, ``mode_recall``, ``lower_recall``, ``upper_recall``, ``mean_specificity``, ``mode_specificity``, ``lower_specificity``, ``upper_specificity``, ``mean_accuracy``, ``mode_accuracy``, ``lower_accuracy``, ``upper_accuracy``, ``mean_jaccard``, ``mode_jaccard``, ``lower_jaccard``, ``upper_jaccard``, ``mean_f1_score``, ``mode_f1_score``, ``lower_f1_score``, ``upper_f1_score``, ``frequentist_precision``, ``frequentist_recall``, ``frequentist_specificity``, ``frequentist_accuracy``, ``frequentist_jaccard``, ``frequentist_f1_score``. * ``threshold``: :py:class:`list` A threshold to graph with a dot for each set. Specific threshold values do not affect "second-annotator" dataframes. fmt : str One of the formats supported by tabulate. Returns ------- table : str A table in a specific format """ headers = [ "Dataset", "T", "E(F1)", "CI(F1)", "AUC", "CI(AUC)", ] table = [] for k, v in data.items(): entry = [ k, v["threshold"], ] # statistics based on the "assigned" threshold (a priori, less biased) bins = len(v["df"]) index = int(round(bins * v["threshold"])) index = min(index, len(v["df"]) - 1) # avoids out of range indexing entry.append(v["df"].mean_f1_score[index]) entry.append( f"{v['df'].lower_f1_score[index]:.3f}-{v['df'].upper_f1_score[index]:.3f}" ) # AUC PR curve entry.append( auc( v["df"]["mean_recall"].to_numpy(), v["df"]["mean_precision"].to_numpy(), ) ) lower_auc = auc( v["df"]["lower_recall"].to_numpy(), v["df"]["lower_precision"].to_numpy(), ) upper_auc = auc( v["df"]["upper_recall"].to_numpy(), v["df"]["upper_precision"].to_numpy(), ) entry.append(f"{lower_auc:.3f}-{upper_auc:.3f}") table.append(entry) return tabulate.tabulate( table, headers, tablefmt=fmt, floatfmt=".3f", stralign="right" )