38 lines
976 B
Python
38 lines
976 B
Python
"""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,
|
|
)
|