Custom Reducers

Creating custom reduction operations for financial data.

Basic Reducer

from metricengine.reductions import register_reducer

@register_reducer
def weighted_average(values, weights):
    """Calculate weighted average."""
    total_weight = sum(weights)
    weighted_sum = sum(v * w for v, w in zip(values, weights))
    return weighted_sum / total_weight

Null-Aware Reducer

@register_reducer
def safe_sum(values):
    """Sum values, skipping nulls."""
    return sum(v for v in values if v is not None)

Type-Specific Reducers

from metricengine import Money

@register_reducer
def sum_money(values: list[Money]) -> Money:
    """Sum monetary values with currency validation."""
    if not values:
        return Money(0, "USD")

    currency = values[0].currency
    total = sum(v.amount for v in values if v.currency == currency)
    return Money(total, currency)