Source code for piel.analysis.metrics.statistics

import numpy as np
from piel.types import ScalarMetric, ScalarMetricCollection


[docs] def aggregate_scalar_metrics_collection( metrics_collection: ScalarMetricCollection, ) -> ScalarMetric: """ Aggregates a ScalarMetricCollection into a single ScalarMetrics instance. The aggregation is performed as follows: - mean: Weighted mean based on count. - min: Minimum of all min values. - max: Maximum of all max values. - standard_deviation: Combined standard deviation considering individual means and counts. - count: Sum of all counts. - unit: Must be consistent across all ScalarMetrics. Args: metrics_collection (ScalarMetricCollection): A ScalarMetricsCollection instances to aggregate. Returns: ScalarMetric: A single ScalarMetrics instance representing the aggregated metrics. Raises: ValueError: If the input list is empty or units are inconsistent. """ if not metrics_collection: raise ValueError("The metrics_list is empty.") # Extract necessary values means = [] min_values = [] max_values = [] for metric in metrics_collection.metrics: if metric.mean is None: raise ValueError(f"ScalarMetric '{metric}' must have 'mean' defined.") if metric.min is None or metric.max is None: raise ValueError( f"ScalarMetric '{metric}' must have 'min' and 'max' defined." ) means.append(metric.mean) min_values.append(metric.min) max_values.append(metric.max) total_count = len(means) if total_count == 0: raise ValueError("Total count is zero, cannot compute aggregated metrics.") # Compute aggregated mean aggregated_mean = sum(means) / total_count # Compute aggregated standard deviation if total_count > 1: variance = sum((m - aggregated_mean) ** 2 for m in means) / (total_count - 1) aggregated_std_dev = np.sqrt(variance) else: aggregated_std_dev = 0.0 # Standard deviation is zero if only one metric # Compute aggregated min and max aggregated_min = min(min_values) aggregated_max = max(max_values) # Aggregate value: set to aggregated mean (or any other logic as needed) aggregated_value = aggregated_mean # Create the aggregated ScalarMetric instance aggregated_metrics = ScalarMetric( value=aggregated_value, mean=aggregated_mean, min=aggregated_min, max=aggregated_max, standard_deviation=aggregated_std_dev, count=total_count, unit=metrics_collection.metrics[0].unit, ) # TODO using the last metrics list for now return aggregated_metrics