Group and aggregate records with defaultdict
Python
from collections import defaultdict
from dataclasses import dataclass
@dataclass(frozen=True)
class Sale:
region: str
product: str
units: int
revenue: float
def summarise(sales: list[Sale]) -> dict[str, dict]:
"""Group sales by region and compute count, units and revenue."""
stats: dict[str, dict] = defaultdict(lambda: {"count": 0, "units": 0, "revenue": 0.0})
for sale in sales:
row = stats[sale.region]
row["count"] += 1
row["units"] += sale.units
row["revenue"] += sale.revenue
return dict(stats)
def top_products(sales: list[Sale], limit: int = 3) -> list[tuple[str, float]]:
"""Return the products with the highest total revenue."""
totals: dict[str, float] = defaultdict(float)
for sale in sales:
totals[sale.product] += sale.revenue
return sorted(totals.items(), key=lambda item: item[1], reverse=True)[:limit]
if __name__ == "__main__":
rows = [
Sale("north", "widget", 2, 20.0),
Sale("north", "gadget", 1, 15.0),
Sale("south", "widget", 5, 50.0),
]
print(summarise(rows))
print(top_products(rows))