v1.6.0 — exceedance + worst-case expected_shortfall
main/PyPI jump 1.3.0 → 1.6.0 in one release. v1.4.0 and v1.5.0 were development-only milestones; v1.6.0 is the complete superset. CONFORMANCE_FLOOR stays 1.0.0 — every addition is additive over the frozen v1 surface.
Highlights (the 1.4.0 → 1.6.0 arc)
expected_shortfall — the worst-case tail mean (v1.6.0, ADR-022)
expected_shortfall(frame, tails) → (N, …, K): the per-row mean of the worst ⌈t·S⌉ draws (tail mean / CVaR) for each upper-tail fraction t. A coherent, subadditive worst-case risk measure and the companion to exceedance. max is never offered (highest-variance, non-reproducible). Tails are required per-call, in (0, 1] — the consumer's policy. Best-case ships no code (a low quantile + exceedance(frame, [0])).
exceedance — survival probability P(Y > c) (v1.5.0, ADR-021)
exceedance(frame, thresholds) → (N, …, K) + exceedance_reducer(c). Distribution-agnostic counting reducer; the flagship is P(Y > 0) = onset. Strict >; thresholds required per-call; geography-blind compose via aggregate_distributions.
Provenance + published envelope checker (v1.4.0, ADR-020)
FrameMetadata.run_id / data_version; assert_frame_envelope as a published conformance check; NaN-tolerant round-trip.
Fail-loud hardening (pre-release falsification audit)
Both new estimators reject non-finite draws (NaN or ±inf) via an np.isfinite guard — an inf draw (always an upstream bug) can no longer silently contaminate a worst-case or bless an exceedance probability.
Notes
- Single
views-frameswheel ships bothviews_frames(numpy-only data contract) +views_frames_summarize(sample-axis summarization). - Published via PyPI Trusted Publishing (
publish_package.yml). - Full changelog: CHANGELOG.md.