"""Per-frame descriptive statistics""" from __future__ import annotations import math from dataclasses import dataclass @dataclass(frozen=True) class Stats: min: float; min_index: int max: float; max_index: int diff: float; avg: float sigma: float; three_sigma: float def compute_stats(values: list[float]) -> Stats: clean = [(i, v) for i, v in enumerate(values) if not math.isnan(v)] if not clean: return Stats(0.0, -1, 0.0, -1, 0.0, 0.0, 0.0, 0.0) min_index, min_v = min(clean, key=lambda iv: iv[1]) max_index, max_v = max(clean, key=lambda iv: iv[1]) nums = [v for _, v in clean] avg = sum(nums) / len(nums) variance = sum((v - avg) ** 2 for v in nums) / len(nums) sigma = math.sqrt(variance) return Stats( min=min_v, min_index=min_index, max=max_v, max_index=max_index, diff=max_v - min_v, avg=avg, sigma=sigma, three_sigma=3 * sigma, )