Featurizer 0.5.2
Advanced-aggregator hardening: full-registry execution coverage (closing the
string-shape-only blind spot), plus the runtime fixes it surfaced.
Added
- Full-registry aggregator execution coverage.
tests/integration/test_all_aggregators_execution.pynow executes every
registered aggregator on real PostgreSQL over edge-case fixtures (single-row,
constant, zero/negative, avg-zero, single-category groups; date and
timestamp temporal columns). Previously only the default-active set had
execution coverage — the advanced tier was string-shape tested only, which is
how the v0.5.1 cluster of runtime bugs slipped through. "Every registered
aggregator executes without error" is now a tested invariant.
Fixed
harmonic_meandivision-by-zero.count(x)/sum(1/x)raised on a zero
value (1/0) and on a zero denominator. Now positive-domain and guarded:
case when min(x) > 0 then count(x)/NULLIF(sum(1.0/NULLIF(x,0)),0) else null end
(NULL on the undefined non-positive domain, mirroringgeometric_mean).mean_deviationrestored as a correct two-passSubqueryAggregator
(avg(abs(x - mean))via a correlated subquery for the mean) and re-added to
the default set — it had been removed in v0.5.1 because the single-pass form
nested aggregates. Verified: MAD of[1,4,9,16]= 5.0.- Planner empty-CTE bug. A single-type aggregation set over a mixed-type
entity graph (e.g.[entropy]over a numeric-only child) emitted
select <key>, from …— a dangling comma. The planner now skips emitting the
aggs CTE (and its join) when an aggregation yields no features for a child.
Removed
z_scoreandmin_max_scaledropped from the registry. They are per-row
normalizations, not reductions — their SQL references a bare, un-grouped
column, invalid in aGROUP BYaggregate. Use thecross_entity_zscore/
cross_entity_percentiletransformers instead. (v0.5.1 had excluded them from
the default set but kept them registered; they are now fully removed.)