feat: monthly_stats() — médiane journalière et hebdomadaire
This commit is contained in:
@@ -25,6 +25,30 @@ def week_balance_minutes(actual_minutes: int, reference_minutes: int) -> int:
|
||||
return actual_minutes - reference_minutes
|
||||
|
||||
|
||||
import statistics as _stats
|
||||
|
||||
|
||||
def monthly_stats(entries: list) -> dict:
|
||||
"""
|
||||
Calcule médiane journalière et médiane hebdomadaire (semaines ISO)
|
||||
pour un groupe d'entrées. Les absences (total_minutes=0) sont incluses.
|
||||
"""
|
||||
if not entries:
|
||||
return {"median_daily_min": 0, "median_weekly_min": 0}
|
||||
|
||||
daily = [e.total_minutes() for e in entries]
|
||||
median_daily = int(_stats.median(daily))
|
||||
|
||||
weekly: dict[tuple, int] = {}
|
||||
for e in entries:
|
||||
key = e.date.isocalendar()[:2] # (year, isoweek)
|
||||
weekly[key] = weekly.get(key, 0) + e.total_minutes()
|
||||
|
||||
median_weekly = int(_stats.median(weekly.values()))
|
||||
|
||||
return {"median_daily_min": median_daily, "median_weekly_min": median_weekly}
|
||||
|
||||
|
||||
def count_day_types(entries: list) -> dict[str, int]:
|
||||
"""Retourne un dict {day_type: count} pour une liste d'entrées, sans les zéros."""
|
||||
counts: dict[str, int] = {}
|
||||
|
||||
Reference in New Issue
Block a user