def write_table(metrics1: MetricsDict, metrics2: MetricsDict, difference: MetricsDict, rel_difference: MetricsDict, output_path: str) -> None: # Put all of the data into tuples and sort by the relative difference data = [] for key in rel_difference.keys(): if 'f1' in rel_difference[key]: value1 = metrics1[key]['f1'] value2 = metrics2[key]['f1'] data.append((key, value1, value2, difference[key]['f1'], rel_difference[key]['f1'])) data.sort(key=lambda t: -t[4]) # Prepare the lines for writing lines = [] for category, value1, value2, diff, rel_diff in data: lines.append(' & '.join([ category, f'{value1:.1f}', f'{value2:.1f}', f'{diff:.1f}', f'{rel_diff:.1f}' ]) + ' \\\\') dirname = os.path.dirname(output_path) if dirname: os.makedirs(dirname, exist_ok=True) with open(output_path, 'w') as out: out.write('\n'.join(lines))
def _combine_metrics(self, recall_metrics: MetricsDict, precision_metrics: MetricsDict) -> MetricsDict: combined = MetricsDict() combined.update(recall_metrics) combined.update(precision_metrics) for key in combined.keys(): if 'precision' and 'recall' in combined[key]: precision = combined[key]['precision'] recall = combined[key]['recall'] f1 = 0.0 if precision + recall != 0.0: f1 = 2 * (precision * recall) / (precision + recall) combined[key]['f1'] = f1 return combined