From 4ee36e2a7c178667d9b59562ef4c5eb98e9982f3 Mon Sep 17 00:00:00 2001 From: Uriah Finkel Date: Sun, 23 Aug 2026 07:24:09 +0300 Subject: [PATCH 01/10] Add canonical time-dependent gains rendering --- src/rtichoke/_renderers.py | 363 ++++++++++++++++++++----------------- 1 file changed, 192 insertions(+), 171 deletions(-) diff --git a/src/rtichoke/_renderers.py b/src/rtichoke/_renderers.py index 983da1cf..301ad37b 100644 --- a/src/rtichoke/_renderers.py +++ b/src/rtichoke/_renderers.py @@ -1,171 +1,192 @@ -"""Renderer selection for canonical rtichoke visualization specifications.""" - -from __future__ import annotations - -import json -from dataclasses import dataclass -from importlib.resources import files -from pathlib import Path -from typing import Any, Literal - -Renderer = Literal["plotly", "matplotlib", "browser", "rtichoke_viz"] - -_SUPPORTED_RENDERERS = ("plotly", "matplotlib", "browser", "rtichoke_viz") - - -def _validate_renderer(renderer: str) -> Renderer: - """Validate and normalize a public renderer name.""" - if renderer not in _SUPPORTED_RENDERERS: - supported = ", ".join(repr(name) for name in _SUPPORTED_RENDERERS) - raise ValueError( - f"Unsupported renderer {renderer!r}. Supported renderers are: {supported}." - ) - return renderer # type: ignore[return-value] - - -@dataclass(frozen=True) -class RtichokeBrowserChart: - """A canonical v2 chart that can be written for offline browser rendering.""" - - spec: dict[str, Any] - size: int = 600 - - def write_html(self, path: str | Path) -> Path: - """Write an offline HTML page plus its packaged renderer assets. - - Parameters - ---------- - path : str or pathlib.Path - Destination for the HTML page. - - Returns - ------- - pathlib.Path - The written HTML path. - """ - output = Path(path) - output.parent.mkdir(parents=True, exist_ok=True) - vendor = files("rtichoke").joinpath("_vendor", "rtichoke_viz") - for asset in ("rtichoke-viz.js", "rtichoke-viz.css"): - (output.parent / asset).write_bytes(vendor.joinpath(asset).read_bytes()) - - render_export = { - "roc": "renderRocV2", - "calibration": "renderCalibrationV2", - "precision_recall": "renderPrecisionRecallV2", - "gains": "renderGainsV2", - }.get(str(self.spec.get("type"))) - if render_export is None: - raise ValueError( - f"rtichoke_viz does not support chart type {self.spec.get('type')!r}." - ) - - spec_json = json.dumps(self.spec, separators=(",", ":")).replace(" - - - - - - rtichoke {self.spec.get("type")} chart - - -
- - - - -""" - output.write_text(html, encoding="utf-8") - return output - - -def _render_gains_matplotlib( - spec: dict[str, Any], *, size: int, color_values: list[str] -) -> Any: - """Render canonical gains quantities with an optional Matplotlib backend.""" - try: - from matplotlib.figure import Figure - except ImportError as error: - raise ImportError( - "The 'matplotlib' renderer requires the optional matplotlib dependency. " - "Install it with `pip install 'rtichoke[matplotlib]'`." - ) from error - - figure = Figure(figsize=(size / 100, size / 100), dpi=100) - axis = figure.subplots() - references = spec.get("references", []) - assert isinstance(references, list) - for reference in references: - if not isinstance(reference, dict): - continue - if reference.get("type") == "identity": - x_values, y_values = [0, 1], [0, 1] - elif reference.get("type") == "path": - points = reference.get("points", []) - x_values = [point["x"] for point in points] - y_values = [point["y"] for point in points] - else: - continue - axis.plot( - x_values, - y_values, - color="#BEBEBE", - linestyle="--", - linewidth=2, - ) - - series = spec.get("series", []) - data = spec.get("data", []) - assert isinstance(series, list) and isinstance(data, list) - display_groups = list(dict.fromkeys(item["display"]["group"] for item in series)) - colors = { - group: ( - "black" - if len(display_groups) == 1 - else color_values[index % len(color_values)] - ) - for index, group in enumerate(display_groups) - } - for item in series: - rows = [row for row in data if row["seriesId"] == item["id"]] - display = item["display"] - axis.plot( - [row["ppcr"] for row in rows], - [row["sensitivity"] for row in rows], - label=display["label"], - color=colors[display["group"]], - linewidth=2, - ) - - x_axis = spec["xAxis"] - y_axis = spec["yAxis"] - axis.set_xlabel(x_axis["label"]) - axis.set_ylabel(y_axis["label"]) - axis.set_xlim(*x_axis["domain"]) - axis.set_ylim(*y_axis["domain"]) - if len(series) > 1: - axis.legend() - figure.tight_layout() - return figure - - -def _render_gains_v2( - spec: dict[str, Any], - *, - renderer: str, - size: int, - color_values: list[str], -) -> Any: - """Render a canonical gains v2 spec with a non-default backend.""" - selected = _validate_renderer(renderer) - if selected == "matplotlib": - return _render_gains_matplotlib(spec, size=size, color_values=color_values) - if selected in {"browser", "rtichoke_viz"}: - return RtichokeBrowserChart(spec=spec, size=size) - raise ValueError("The Plotly renderer must use the existing production path.") +"""Renderer selection for canonical rtichoke visualization specifications.""" + +from __future__ import annotations + +import json +from dataclasses import dataclass +from importlib.resources import files +from pathlib import Path +from typing import Any, Literal + +Renderer = Literal["plotly", "matplotlib", "browser", "rtichoke_viz"] + +_SUPPORTED_RENDERERS = ("plotly", "matplotlib", "browser", "rtichoke_viz") + + +def _validate_renderer(renderer: str) -> Renderer: + """Validate and normalize a public renderer name.""" + if renderer not in _SUPPORTED_RENDERERS: + supported = ", ".join(repr(name) for name in _SUPPORTED_RENDERERS) + raise ValueError( + f"Unsupported renderer {renderer!r}. Supported renderers are: {supported}." + ) + return renderer # type: ignore[return-value] + + +@dataclass(frozen=True) +class RtichokeBrowserChart: + """A canonical v2 chart that can be written for offline browser rendering.""" + + spec: dict[str, Any] + size: int = 600 + + def write_html(self, path: str | Path) -> Path: + """Write an offline HTML page plus its packaged renderer assets. + + Parameters + ---------- + path : str or pathlib.Path + Destination for the HTML page. + + Returns + ------- + pathlib.Path + The written HTML path. + """ + output = Path(path) + output.parent.mkdir(parents=True, exist_ok=True) + vendor = files("rtichoke").joinpath("_vendor", "rtichoke_viz") + for asset in ("rtichoke-viz.js", "rtichoke-viz.css"): + (output.parent / asset).write_bytes(vendor.joinpath(asset).read_bytes()) + + render_export = { + "roc": "renderRocV2", + "calibration": "renderCalibrationV2", + "precision_recall": "renderPrecisionRecallV2", + "gains": "renderGainsV2", + }.get(str(self.spec.get("type"))) + if render_export is None: + raise ValueError( + f"rtichoke_viz does not support chart type {self.spec.get('type')!r}." + ) + + spec_json = json.dumps(self.spec, separators=(",", ":")).replace(" + + + + + + rtichoke {self.spec.get("type")} chart + + +
+ + + + +""" + output.write_text(html, encoding="utf-8") + return output + + +def _render_gains_matplotlib( + spec: dict[str, Any], *, size: int, color_values: list[str] +) -> Any: + """Render canonical gains quantities with an optional Matplotlib backend.""" + try: + from matplotlib.figure import Figure + except ImportError as error: + raise ImportError( + "The 'matplotlib' renderer requires the optional matplotlib dependency. " + "Install it with `pip install 'rtichoke[matplotlib]'`." + ) from error + + series = spec.get("series", []) + data = spec.get("data", []) + assert isinstance(series, list) and isinstance(data, list) + horizons = list( + dict.fromkeys( + item["horizon"] for item in series if item.get("horizon") is not None + ) + ) + panels: list[float | None] = horizons or [None] + figure = Figure(figsize=(size / 100 * len(panels), size / 100), dpi=100) + axes_value = figure.subplots(1, len(panels), squeeze=False) + axes = list(axes_value[0]) + references = spec.get("references", []) + assert isinstance(references, list) + display_groups = list(dict.fromkeys(item["display"]["group"] for item in series)) + colors = { + group: ( + "black" + if len(display_groups) == 1 + else color_values[index % len(color_values)] + ) + for index, group in enumerate(display_groups) + } + x_axis = spec["xAxis"] + y_axis = spec["yAxis"] + for axis, horizon in zip(axes, panels): + for reference in references: + if not isinstance(reference, dict): + continue + if ( + reference.get("scope") == "population_horizon" + and reference.get("horizon") != horizon + ): + continue + if reference.get("type") == "identity": + x_values, y_values = [0, 1], [0, 1] + elif reference.get("type") == "path": + points = reference.get("points", []) + x_values = [point["x"] for point in points] + y_values = [point["y"] for point in points] + else: + continue + axis.plot( + x_values, + y_values, + color="#BEBEBE", + linestyle="--", + linewidth=2, + ) + + panel_series = [ + item + for item in series + if item.get("horizon") is None or item.get("horizon") == horizon + ] + for item in panel_series: + rows = [row for row in data if row["seriesId"] == item["id"]] + display = item["display"] + axis.plot( + [row["ppcr"] for row in rows], + [row["sensitivity"] for row in rows], + label=display["label"], + color=colors[display["group"]], + linewidth=2, + ) + + axis.set_xlabel(x_axis["label"]) + axis.set_ylabel(y_axis["label"]) + axis.set_xlim(*x_axis["domain"]) + axis.set_ylim(*y_axis["domain"]) + if horizon is not None: + axis.set_title(f"Fixed Time Horizon: {horizon:g}") + if len(panel_series) > 1: + axis.legend() + figure.tight_layout() + return figure + + +def _render_gains_v2( + spec: dict[str, Any], + *, + renderer: str, + size: int, + color_values: list[str], +) -> Any: + """Render a canonical gains v2 spec with a non-default backend.""" + selected = _validate_renderer(renderer) + if selected == "matplotlib": + return _render_gains_matplotlib(spec, size=size, color_values=color_values) + if selected in {"browser", "rtichoke_viz"}: + return RtichokeBrowserChart(spec=spec, size=size) + raise ValueError("The Plotly renderer must use the existing production path.") + From a94457272c422ee3effd62bb6065840a90a9d0e9 Mon Sep 17 00:00:00 2001 From: Uriah Finkel Date: Sun, 23 Aug 2026 07:24:12 +0300 Subject: [PATCH 02/10] Add canonical time-dependent gains rendering --- src/rtichoke/_viz_spec_v2.py | 648 ++++++++++++++++++++++------------- 1 file changed, 414 insertions(+), 234 deletions(-) diff --git a/src/rtichoke/_viz_spec_v2.py b/src/rtichoke/_viz_spec_v2.py index b8e85103..c6cdc6cc 100644 --- a/src/rtichoke/_viz_spec_v2.py +++ b/src/rtichoke/_viz_spec_v2.py @@ -1,234 +1,414 @@ -"""Internal builders for canonical ``rtichoke_viz`` v2 specifications. - -These helpers are deliberately not wired into production rendering yet. They -translate already-computed performance data plus semantic evaluation metadata -into the canonical visualization contract. -""" - -from __future__ import annotations - -from collections.abc import Mapping - -import polars as pl - -from rtichoke.processing.evaluation_semantics import _EvaluationMetadata - -_REQUIRED_ROC_COLUMNS = { - "reference_group", - "chosen_cutoff", - "sensitivity", - "specificity", -} -_REQUIRED_GAINS_COLUMNS = { - "reference_group", - "chosen_cutoff", - "sensitivity", - "ppcr", - "real_positives", - "n", -} - - -def _roc_v2_spec_from_performance_data( - performance_data: pl.DataFrame, - evaluation_metadata: Mapping[str, _EvaluationMetadata], -) -> dict[str, object]: - """Build a canonical ROC-v2 spec without recalculating statistics.""" - return _curve_v2_spec_from_performance_data( - performance_data, - evaluation_metadata, - chart_type="roc", - ) - - -def _gains_v2_spec_from_performance_data( - performance_data: pl.DataFrame, - evaluation_metadata: Mapping[str, _EvaluationMetadata], -) -> dict[str, object]: - """Build a canonical gains-v2 spec from production performance quantities.""" - spec = _curve_v2_spec_from_performance_data( - performance_data, - evaluation_metadata, - chart_type="gains", - ) - prevalence = _gains_population_prevalence(performance_data, evaluation_metadata) - - populations = list( - dict.fromkeys(metadata.population for metadata in evaluation_metadata.values()) - ) - spec["references"] = [ - {"type": "identity", "scope": "global", "label": "Random"}, - *[ - { - "type": "path", - "scope": "population", - "population": population, - "label": "Perfect Model", - "points": [ - {"x": 0, "y": 0}, - {"x": prevalence[population], "y": 1}, - {"x": 1, "y": 1}, - ], - } - for population in populations - ], - ] - return spec - - -def _gains_population_prevalence( - performance_data: pl.DataFrame, - evaluation_metadata: Mapping[str, _EvaluationMetadata], -) -> dict[str, float]: - """Map production event prevalence from compatibility groups to populations.""" - group_prevalence = { - str(row["reference_group"]): float(row["prevalence"]) - for row in ( - performance_data.select( - "reference_group", - (pl.col("real_positives") / pl.col("n")).alias("prevalence"), - ) - .unique() - .to_dicts() - ) - } - population_values: dict[str, set[float]] = {} - for group, metadata in evaluation_metadata.items(): - if group not in group_prevalence: - continue - population_values.setdefault(metadata.population, set()).add( - group_prevalence[group] - ) - - prevalence: dict[str, float] = {} - for population in dict.fromkeys( - metadata.population for metadata in evaluation_metadata.values() - ): - values = population_values.get(population, set()) - if len(values) != 1: - raise ValueError( - "Gains performance data must have one prevalence per population: " - f"{population}" - ) - prevalence[population] = next(iter(values)) - return prevalence - - -def _curve_v2_spec_from_performance_data( - performance_data: pl.DataFrame, - evaluation_metadata: Mapping[str, _EvaluationMetadata], - *, - chart_type: str, -) -> dict[str, object]: - """Build common canonical curve semantics without recalculating statistics. - - ``reference_group`` is used only to join existing performance rows to the - semantic metadata established by the high-level production inputs. Stable - evaluation/series IDs are ordinal over that semantic metadata, so they do - not encode compatibility grouping names or presentation values. - """ - if chart_type == "roc": - required = _REQUIRED_ROC_COLUMNS - selected = ["reference_group", "chosen_cutoff", "sensitivity", "specificity"] - elif chart_type == "gains": - required = _REQUIRED_GAINS_COLUMNS - selected = ["reference_group", "chosen_cutoff", "sensitivity", "ppcr"] - else: - raise ValueError(f"Unsupported v2 curve type: {chart_type}") - - missing = required.difference(performance_data.columns) - if missing: - missing_columns = ", ".join(sorted(missing)) - raise ValueError( - f"{chart_type.upper()} performance data is missing columns: {missing_columns}" - ) - - rows = performance_data.select(*selected).to_dicts() - row_groups = {str(row["reference_group"]) for row in rows} - metadata_groups = set(evaluation_metadata) - missing_metadata = row_groups.difference(metadata_groups) - if missing_metadata: - groups = ", ".join(sorted(missing_metadata)) - raise ValueError( - f"{chart_type.upper()} performance rows are missing evaluation metadata: " - f"{groups}" - ) - - ordered_groups = [group for group in evaluation_metadata if group in row_groups] - evaluation_ids = { - group: f"evaluation-{index}" - for index, group in enumerate(ordered_groups, start=1) - } - series_ids = { - group: f"series-{index}" for index, group in enumerate(ordered_groups, start=1) - } - - evaluations: list[dict[str, object]] = [] - series: list[dict[str, object]] = [] - for group in ordered_groups: - metadata = evaluation_metadata[group] - evaluation: dict[str, object] = { - "id": evaluation_ids[group], - "population": metadata.population, - } - if metadata.model is not None: - evaluation["model"] = metadata.model - evaluations.append(evaluation) - - if metadata.model is not None: - display_value = metadata.model - display_role = "model" - else: - display_value = metadata.population - display_role = "population" - series.append( - { - "id": series_ids[group], - "evaluationId": evaluation_ids[group], - "display": { - "label": display_value, - "group": display_value, - "role": display_role, - }, - } - ) - - data = [] - for row in rows: - datum = { - "seriesId": series_ids[str(row["reference_group"])], - "cutoff": row["chosen_cutoff"], - "sensitivity": row["sensitivity"], - } - if chart_type == "roc": - datum["specificity"] = row["specificity"] - else: - datum["ppcr"] = row["ppcr"] - data.append(datum) - - if chart_type == "roc": - return { - "schemaVersion": "2.0", - "type": "roc", - "evaluations": evaluations, - "series": series, - "data": data, - "x": "false_positive_rate", - "y": "sensitivity", - "xAxis": {"label": "1 - Specificity", "domain": [0, 1]}, - "yAxis": {"label": "Sensitivity", "domain": [0, 1]}, - "references": [{"type": "identity", "scope": "global"}], - } - - return { - "schemaVersion": "2.0", - "type": "gains", - "evaluations": evaluations, - "series": series, - "data": data, - "x": "ppcr", - "y": "sensitivity", - "xAxis": {"label": "Predicted Positives (Rate)", "domain": [0, 1]}, - "yAxis": {"label": "Sensitivity", "domain": [0, 1]}, - "references": [], - } +"""Internal builders for canonical ``rtichoke_viz`` v2 specifications. + +These helpers are deliberately not wired into production rendering yet. They +translate already-computed performance data plus semantic evaluation metadata +into the canonical visualization contract. +""" + +from __future__ import annotations + +from collections.abc import Mapping + +import polars as pl + +from rtichoke.processing.evaluation_semantics import _EvaluationMetadata + +_REQUIRED_ROC_COLUMNS = { + "reference_group", + "chosen_cutoff", + "sensitivity", + "specificity", +} +_REQUIRED_GAINS_COLUMNS = { + "reference_group", + "chosen_cutoff", + "sensitivity", + "ppcr", + "real_positives", + "n", +} + + +def _roc_v2_spec_from_performance_data( + performance_data: pl.DataFrame, + evaluation_metadata: Mapping[str, _EvaluationMetadata], +) -> dict[str, object]: + """Build a canonical ROC-v2 spec without recalculating statistics.""" + return _curve_v2_spec_from_performance_data( + performance_data, + evaluation_metadata, + chart_type="roc", + ) + + +def _gains_v2_spec_from_performance_data( + performance_data: pl.DataFrame, + evaluation_metadata: Mapping[str, _EvaluationMetadata], +) -> dict[str, object]: + """Build a canonical gains-v2 spec from production performance quantities.""" + spec = _curve_v2_spec_from_performance_data( + performance_data, + evaluation_metadata, + chart_type="gains", + ) + prevalence = _gains_population_prevalence(performance_data, evaluation_metadata) + + populations = list( + dict.fromkeys(metadata.population for metadata in evaluation_metadata.values()) + ) + spec["references"] = [ + {"type": "identity", "scope": "global", "label": "Random"}, + *[ + { + "type": "path", + "scope": "population", + "population": population, + "label": "Perfect Model", + "points": [ + {"x": 0, "y": 0}, + {"x": prevalence[population], "y": 1}, + {"x": 1, "y": 1}, + ], + } + for population in populations + ], + ] + return spec + + +def _gains_times_v2_spec_from_performance_data( + performance_data: pl.DataFrame, + evaluation_metadata: Mapping[str, _EvaluationMetadata], +) -> dict[str, object]: + """Build canonical time-dependent gains from calculated production data.""" + required = _REQUIRED_GAINS_COLUMNS | { + "fixed_time_horizon", + "censoring_heuristic", + "competing_heuristic", + } + missing = required.difference(performance_data.columns) + if missing: + raise ValueError( + "Time-dependent gains performance data is missing columns: " + + ", ".join(sorted(missing)) + ) + + rows = performance_data.select( + "reference_group", + "fixed_time_horizon", + "censoring_heuristic", + "competing_heuristic", + "chosen_cutoff", + "sensitivity", + "ppcr", + ).to_dicts() + row_groups = {str(row["reference_group"]) for row in rows} + missing_metadata = row_groups.difference(evaluation_metadata) + if missing_metadata: + raise ValueError( + "Time-dependent gains rows are missing evaluation metadata: " + + ", ".join(sorted(missing_metadata)) + ) + + ordered_groups = [group for group in evaluation_metadata if group in row_groups] + evaluation_ids = { + group: f"evaluation-{index}" + for index, group in enumerate(ordered_groups, start=1) + } + evaluations = [] + for group in ordered_groups: + metadata = evaluation_metadata[group] + evaluation: dict[str, object] = { + "id": evaluation_ids[group], + "population": metadata.population, + } + if metadata.model is not None: + evaluation["model"] = metadata.model + evaluations.append(evaluation) + + series_keys = list( + dict.fromkeys( + ( + str(row["reference_group"]), + float(row["fixed_time_horizon"]), + str(row["censoring_heuristic"]), + str(row["competing_heuristic"]), + ) + for row in rows + ) + ) + series_ids = { + key: f"series-{index}" for index, key in enumerate(series_keys, start=1) + } + series = [] + for key in series_keys: + group, horizon, _, _ = key + metadata = evaluation_metadata[group] + display_value = metadata.model or metadata.population + series.append( + { + "id": series_ids[key], + "evaluationId": evaluation_ids[group], + "horizon": horizon, + "display": { + "label": display_value, + "group": display_value, + "role": "model" if metadata.model is not None else "population", + }, + } + ) + + data = [] + for row in rows: + key = ( + str(row["reference_group"]), + float(row["fixed_time_horizon"]), + str(row["censoring_heuristic"]), + str(row["competing_heuristic"]), + ) + data.append( + { + "seriesId": series_ids[key], + "cutoff": row["chosen_cutoff"], + "ppcr": row["ppcr"], + "sensitivity": row["sensitivity"], + } + ) + + risks = _gains_population_horizon_risk(performance_data, evaluation_metadata) + references = [{"type": "identity", "scope": "global", "label": "Random"}] + for (population, horizon), risk in risks.items(): + references.append( + { + "type": "path", + "scope": "population_horizon", + "population": population, + "horizon": horizon, + "label": "Perfect Model", + "points": [ + {"x": 0, "y": 0}, + {"x": risk, "y": 1}, + {"x": 1, "y": 1}, + ], + } + ) + + return { + "schemaVersion": "2.0", + "type": "gains", + "evaluations": evaluations, + "series": series, + "data": data, + "x": "ppcr", + "y": "sensitivity", + "xAxis": {"label": "Predicted Positives (Rate)", "domain": [0, 1]}, + "yAxis": {"label": "Sensitivity", "domain": [0, 1]}, + "references": references, + } + + +def _gains_population_horizon_risk( + performance_data: pl.DataFrame, + evaluation_metadata: Mapping[str, _EvaluationMetadata], +) -> dict[tuple[str, float], float]: + """Map calculated cutoff-0 AJ event risk to semantic population/horizon.""" + group_risks = ( + performance_data.filter(pl.col("chosen_cutoff") == 0) + .select( + "reference_group", + "fixed_time_horizon", + (pl.col("real_positives") / pl.col("n")).alias("event_risk"), + ) + .unique() + .to_dicts() + ) + values: dict[tuple[str, float], set[float]] = {} + for row in group_risks: + group = str(row["reference_group"]) + metadata = evaluation_metadata.get(group) + if metadata is None: + continue + key = (metadata.population, float(row["fixed_time_horizon"])) + values.setdefault(key, set()).add(float(row["event_risk"])) + + populations = list( + dict.fromkeys(metadata.population for metadata in evaluation_metadata.values()) + ) + horizons = sorted( + float(value) + for value in performance_data["fixed_time_horizon"].unique().to_list() + ) + risks: dict[tuple[str, float], float] = {} + for key in ( + (population, horizon) + for horizon in horizons + for population in populations + if (population, horizon) in values + ): + candidates = values[key] + if len(candidates) != 1: + raise ValueError( + "Time-dependent gains must have one calculated event risk per " + f"population and horizon: {key[0]} at {key[1]}" + ) + risks[key] = next(iter(candidates)) + return risks + + +def _gains_population_prevalence( + performance_data: pl.DataFrame, + evaluation_metadata: Mapping[str, _EvaluationMetadata], +) -> dict[str, float]: + """Map production event prevalence from compatibility groups to populations.""" + group_prevalence = { + str(row["reference_group"]): float(row["prevalence"]) + for row in ( + performance_data.select( + "reference_group", + (pl.col("real_positives") / pl.col("n")).alias("prevalence"), + ) + .unique() + .to_dicts() + ) + } + population_values: dict[str, set[float]] = {} + for group, metadata in evaluation_metadata.items(): + if group not in group_prevalence: + continue + population_values.setdefault(metadata.population, set()).add( + group_prevalence[group] + ) + + prevalence: dict[str, float] = {} + for population in dict.fromkeys( + metadata.population for metadata in evaluation_metadata.values() + ): + values = population_values.get(population, set()) + if len(values) != 1: + raise ValueError( + "Gains performance data must have one prevalence per population: " + f"{population}" + ) + prevalence[population] = next(iter(values)) + return prevalence + + +def _curve_v2_spec_from_performance_data( + performance_data: pl.DataFrame, + evaluation_metadata: Mapping[str, _EvaluationMetadata], + *, + chart_type: str, +) -> dict[str, object]: + """Build common canonical curve semantics without recalculating statistics. + + ``reference_group`` is used only to join existing performance rows to the + semantic metadata established by the high-level production inputs. Stable + evaluation/series IDs are ordinal over that semantic metadata, so they do + not encode compatibility grouping names or presentation values. + """ + if chart_type == "roc": + required = _REQUIRED_ROC_COLUMNS + selected = ["reference_group", "chosen_cutoff", "sensitivity", "specificity"] + elif chart_type == "gains": + required = _REQUIRED_GAINS_COLUMNS + selected = ["reference_group", "chosen_cutoff", "sensitivity", "ppcr"] + else: + raise ValueError(f"Unsupported v2 curve type: {chart_type}") + + missing = required.difference(performance_data.columns) + if missing: + missing_columns = ", ".join(sorted(missing)) + raise ValueError( + f"{chart_type.upper()} performance data is missing columns: {missing_columns}" + ) + + rows = performance_data.select(*selected).to_dicts() + row_groups = {str(row["reference_group"]) for row in rows} + metadata_groups = set(evaluation_metadata) + missing_metadata = row_groups.difference(metadata_groups) + if missing_metadata: + groups = ", ".join(sorted(missing_metadata)) + raise ValueError( + f"{chart_type.upper()} performance rows are missing evaluation metadata: " + f"{groups}" + ) + + ordered_groups = [group for group in evaluation_metadata if group in row_groups] + evaluation_ids = { + group: f"evaluation-{index}" + for index, group in enumerate(ordered_groups, start=1) + } + series_ids = { + group: f"series-{index}" for index, group in enumerate(ordered_groups, start=1) + } + + evaluations: list[dict[str, object]] = [] + series: list[dict[str, object]] = [] + for group in ordered_groups: + metadata = evaluation_metadata[group] + evaluation: dict[str, object] = { + "id": evaluation_ids[group], + "population": metadata.population, + } + if metadata.model is not None: + evaluation["model"] = metadata.model + evaluations.append(evaluation) + + if metadata.model is not None: + display_value = metadata.model + display_role = "model" + else: + display_value = metadata.population + display_role = "population" + series.append( + { + "id": series_ids[group], + "evaluationId": evaluation_ids[group], + "display": { + "label": display_value, + "group": display_value, + "role": display_role, + }, + } + ) + + data = [] + for row in rows: + datum = { + "seriesId": series_ids[str(row["reference_group"])], + "cutoff": row["chosen_cutoff"], + "sensitivity": row["sensitivity"], + } + if chart_type == "roc": + datum["specificity"] = row["specificity"] + else: + datum["ppcr"] = row["ppcr"] + data.append(datum) + + if chart_type == "roc": + return { + "schemaVersion": "2.0", + "type": "roc", + "evaluations": evaluations, + "series": series, + "data": data, + "x": "false_positive_rate", + "y": "sensitivity", + "xAxis": {"label": "1 - Specificity", "domain": [0, 1]}, + "yAxis": {"label": "Sensitivity", "domain": [0, 1]}, + "references": [{"type": "identity", "scope": "global"}], + } + + return { + "schemaVersion": "2.0", + "type": "gains", + "evaluations": evaluations, + "series": series, + "data": data, + "x": "ppcr", + "y": "sensitivity", + "xAxis": {"label": "Predicted Positives (Rate)", "domain": [0, 1]}, + "yAxis": {"label": "Sensitivity", "domain": [0, 1]}, + "references": [], + } + From e001ffa40dde92667665ffd07e02203a4d2a9117 Mon Sep 17 00:00:00 2001 From: Uriah Finkel Date: Sun, 23 Aug 2026 07:24:16 +0300 Subject: [PATCH 03/10] Add canonical time-dependent gains rendering --- src/rtichoke/discrimination/gains.py | 590 ++++++++++++++------------- 1 file changed, 312 insertions(+), 278 deletions(-) diff --git a/src/rtichoke/discrimination/gains.py b/src/rtichoke/discrimination/gains.py index 40a0fd16..4fb194e0 100644 --- a/src/rtichoke/discrimination/gains.py +++ b/src/rtichoke/discrimination/gains.py @@ -1,278 +1,312 @@ -""" -A module for Gains Curves using Plotly helpers -""" - -from typing import Any, Dict, List, Sequence, Union -from plotly.graph_objs._figure import Figure -from rtichoke.processing.binary_color_values import _apply_color_values_binary -from rtichoke.processing.plotly_helper_functions import ( - _create_rtichoke_plotly_curve_binary, - _plot_rtichoke_curve_binary, - _create_reference_lines_data, - _check_if_multiple_populations_are_being_validated_times, -) -from rtichoke.processing.time_reference_lines import ( - _create_rtichoke_plotly_curve_times_reference_safe, -) -import numpy as np -import polars as pl -from rtichoke._renderers import _render_gains_v2, _validate_renderer -from rtichoke._viz_spec_v2 import _gains_v2_spec_from_performance_data -from rtichoke.performance_data.performance_data import prepare_performance_data -from rtichoke.processing.evaluation_semantics import _build_evaluation_metadata - - -def _get_gains_aj_estimates_times(performance_data: pl.DataFrame) -> pl.DataFrame: - """Return one horizon-specific event estimate per reference group. - - For a gains reference curve the required event probability is the overall - event probability at the horizon. At probability threshold 0 everyone is - classified positive, so ``real_positives / n`` gives that quantity without - mixing in the cutoff-specific estimate at threshold 1. - """ - return ( - performance_data.filter(pl.col("chosen_cutoff") == 0) - .select("reference_group", "fixed_time_horizon", "real_positives", "n") - .unique() - .with_columns((pl.col("real_positives") / pl.col("n")).alias("aj_estimate")) - .select("reference_group", "fixed_time_horizon", "aj_estimate") - .sort(["reference_group", "fixed_time_horizon"]) - ) - - -def _replace_gains_reference_data_times( - curve_list: dict, performance_data: pl.DataFrame -) -> dict: - """Replace time-dependent gains references with one AJ estimate per horizon.""" - aj_estimates = _get_gains_aj_estimates_times(performance_data) - references = [] - - for horizon in curve_list["fixed_time_horizons"]: - aj_horizon = aj_estimates.filter(pl.col("fixed_time_horizon") == horizon) - multiple_populations = _check_if_multiple_populations_are_being_validated_times( - aj_horizon - ) - references.append( - _create_reference_lines_data( - curve="gains", - aj_estimates_from_performance_data=aj_horizon, - multiple_populations=multiple_populations, - ).with_columns(pl.lit(horizon).alias("fixed_time_horizon")) - ) - - curve_list["reference_data"] = ( - pl.concat(references, how="vertical") if references else pl.DataFrame() - ) - return curve_list - - -def create_gains_curve( - probs: Dict[str, np.ndarray], - reals: Union[np.ndarray, Dict[str, np.ndarray]], - by: float = 0.01, - stratified_by: Sequence[str] = ["probability_threshold"], - size: int = 600, - color_values: List[str] = [ - "#1b9e77", - "#d95f02", - "#7570b3", - "#e7298a", - "#07004D", - "#E6AB02", - "#FE5F55", - "#54494B", - "#006E90", - "#BC96E6", - "#52050A", - "#1F271B", - "#BE7C4D", - "#63768D", - "#08A045", - "#320A28", - "#82FF9E", - "#2176FF", - "#D1603D", - "#585123", - ], - renderer: str = "plotly", -) -> Any: - """Creates a Gains curve. - - A Gains curve is a marketing and business analytics tool that evaluates - the performance of a predictive model. It shows the percentage of - positive outcomes (the "gain") that can be captured by targeting a - certain percentage of the population, sorted by predicted probability. - - Parameters - ---------- - probs : Dict[str, np.ndarray] - A dictionary mapping model or dataset names to 1-D numpy arrays of - predicted probabilities. - reals : Union[np.ndarray, Dict[str, np.ndarray]] - The true binary labels (0 or 1). - by : float, optional - The step size for the probability thresholds. Defaults to 0.01. - stratified_by : Sequence[str], optional - Variables for stratification. Defaults to ``["probability_threshold"]``. - size : int, optional - The width and height of the plot in pixels. Defaults to 600. - color_values : List[str], optional - A list of hex color strings for the plot lines. - renderer : {"plotly", "matplotlib", "browser", "rtichoke_viz"}, optional - Rendering backend. The default, ``"plotly"``, preserves the existing - return value and behavior. ``"matplotlib"`` requires the optional - Matplotlib dependency. ``"browser"`` and its ``"rtichoke_viz"`` alias - return an offline browser chart backed by the packaged TypeScript bundle. - - Returns - ------- - Figure or RtichokeBrowserChart - A Plotly or Matplotlib figure, or an offline browser chart, depending - on ``renderer``. - """ - selected_renderer = _validate_renderer(renderer) - if selected_renderer != "plotly": - performance_data = prepare_performance_data( - probs=probs, - reals=reals, - stratified_by=stratified_by, - by=by, - ) - evaluation_metadata = _build_evaluation_metadata(probs, reals, np.array([])) - spec = _gains_v2_spec_from_performance_data( - performance_data, evaluation_metadata - ) - return _render_gains_v2( - spec, - renderer=selected_renderer, - size=size, - color_values=color_values, - ) - - fig = _create_rtichoke_plotly_curve_binary( - probs, - reals, - by=by, - stratified_by=stratified_by, - size=size, - color_values=color_values, - curve="gains", - ) - return _apply_color_values_binary(fig, color_values) - - -def plot_gains_curve( - performance_data: pl.DataFrame, - stratified_by: Sequence[str] = ["probability_threshold"], - size: int = 600, -) -> Figure: - """Plots a Gains curve from pre-computed performance data. - - This function is useful for plotting a Gains curve directly from a - DataFrame that already contains the necessary performance metrics. - - Parameters - ---------- - performance_data : pl.DataFrame - A Polars DataFrame with performance metrics. It must include columns - for the percentage of the population targeted and the corresponding - gain, along with any stratification variables. - stratified_by : Sequence[str], optional - The columns in `performance_data` used for stratification. Defaults to - ``["probability_threshold"]``. - size : int, optional - The width and height of the plot in pixels. Defaults to 600. - - Returns - ------- - Figure - A Plotly ``Figure`` object representing the Gains curve. - """ - fig = _plot_rtichoke_curve_binary( - performance_data, - size=size, - curve="gains", - ) - return fig - - -def create_gains_curve_times( - probs: Dict[str, np.ndarray], - reals: Union[np.ndarray, Dict[str, np.ndarray]], - times: Union[np.ndarray, Dict[str, np.ndarray]], - fixed_time_horizons: list[float], - heuristics_sets: list[Dict] = [ - { - "censoring_heuristic": "adjusted", - "competing_heuristic": "adjusted_as_negative", - } - ], - by: float = 0.01, - stratified_by: Sequence[str] = ["probability_threshold"], - size: int = 600, - color_values: List[str] = [ - "#1b9e77", - "#d95f02", - "#7570b3", - "#e7298a", - "#07004D", - "#E6AB02", - "#FE5F55", - "#54494B", - "#006E90", - "#BC96E6", - "#52050A", - "#1F271B", - "#BE7C4D", - "#63768D", - "#08A045", - "#320A28", - "#82FF9E", - "#2176FF", - "#D1603D", - "#585123", - ], -) -> Figure: - """Creates a time-dependent Gains curve. - - Generates a Gains curve for time-to-event models, which is evaluated at - specified time horizons and handles censored data and competing risks. - - Parameters - ---------- - probs : Dict[str, np.ndarray] - A dictionary of predicted probabilities. - reals : Union[np.ndarray, Dict[str, np.ndarray]] - The true event statuses. - times : Union[np.ndarray, Dict[str, np.ndarray]] - The event or censoring times. - fixed_time_horizons : list[float] - A list of time points for performance evaluation. - heuristics_sets : list[Dict], optional - Specifies how to handle censored data and competing events. - by : float, optional - The step size for probability thresholds. Defaults to 0.01. - stratified_by : Sequence[str], optional - Variables for stratification. Defaults to ``["probability_threshold"]``. - size : int, optional - The width and height of the plot in pixels. Defaults to 600. - color_values : List[str], optional - A list of hex color strings for the plot lines. - - Returns - ------- - Figure - A Plotly ``Figure`` object for the time-dependent Gains curve. - """ - return _create_rtichoke_plotly_curve_times_reference_safe( - probs, - reals, - times, - fixed_time_horizons=fixed_time_horizons, - heuristics_sets=heuristics_sets, - by=by, - stratified_by=stratified_by, - size=size, - color_values=color_values, - curve="gains", - ) +""" +A module for Gains Curves using Plotly helpers +""" + +from typing import Any, Dict, List, Sequence, Union +from plotly.graph_objs._figure import Figure +from rtichoke.processing.binary_color_values import _apply_color_values_binary +from rtichoke.processing.plotly_helper_functions import ( + _create_rtichoke_plotly_curve_binary, + _plot_rtichoke_curve_binary, + _create_reference_lines_data, + _check_if_multiple_populations_are_being_validated_times, +) +from rtichoke.processing.time_reference_lines import ( + _create_rtichoke_plotly_curve_times_reference_safe, +) +import numpy as np +import polars as pl +from rtichoke._renderers import _render_gains_v2, _validate_renderer +from rtichoke._viz_spec_v2 import ( + _gains_times_v2_spec_from_performance_data, + _gains_v2_spec_from_performance_data, +) +from rtichoke.performance_data.performance_data import prepare_performance_data +from rtichoke.processing.evaluation_semantics import _build_evaluation_metadata + + +def _get_gains_aj_estimates_times(performance_data: pl.DataFrame) -> pl.DataFrame: + """Return one horizon-specific event estimate per reference group. + + For a gains reference curve the required event probability is the overall + event probability at the horizon. At probability threshold 0 everyone is + classified positive, so ``real_positives / n`` gives that quantity without + mixing in the cutoff-specific estimate at threshold 1. + """ + return ( + performance_data.filter(pl.col("chosen_cutoff") == 0) + .select("reference_group", "fixed_time_horizon", "real_positives", "n") + .unique() + .with_columns((pl.col("real_positives") / pl.col("n")).alias("aj_estimate")) + .select("reference_group", "fixed_time_horizon", "aj_estimate") + .sort(["reference_group", "fixed_time_horizon"]) + ) + + +def _replace_gains_reference_data_times( + curve_list: dict, performance_data: pl.DataFrame +) -> dict: + """Replace time-dependent gains references with one AJ estimate per horizon.""" + aj_estimates = _get_gains_aj_estimates_times(performance_data) + references = [] + + for horizon in curve_list["fixed_time_horizons"]: + aj_horizon = aj_estimates.filter(pl.col("fixed_time_horizon") == horizon) + multiple_populations = _check_if_multiple_populations_are_being_validated_times( + aj_horizon + ) + references.append( + _create_reference_lines_data( + curve="gains", + aj_estimates_from_performance_data=aj_horizon, + multiple_populations=multiple_populations, + ).with_columns(pl.lit(horizon).alias("fixed_time_horizon")) + ) + + curve_list["reference_data"] = ( + pl.concat(references, how="vertical") if references else pl.DataFrame() + ) + return curve_list + + +def create_gains_curve( + probs: Dict[str, np.ndarray], + reals: Union[np.ndarray, Dict[str, np.ndarray]], + by: float = 0.01, + stratified_by: Sequence[str] = ["probability_threshold"], + size: int = 600, + color_values: List[str] = [ + "#1b9e77", + "#d95f02", + "#7570b3", + "#e7298a", + "#07004D", + "#E6AB02", + "#FE5F55", + "#54494B", + "#006E90", + "#BC96E6", + "#52050A", + "#1F271B", + "#BE7C4D", + "#63768D", + "#08A045", + "#320A28", + "#82FF9E", + "#2176FF", + "#D1603D", + "#585123", + ], + renderer: str = "plotly", +) -> Any: + """Creates a Gains curve. + + A Gains curve is a marketing and business analytics tool that evaluates + the performance of a predictive model. It shows the percentage of + positive outcomes (the "gain") that can be captured by targeting a + certain percentage of the population, sorted by predicted probability. + + Parameters + ---------- + probs : Dict[str, np.ndarray] + A dictionary mapping model or dataset names to 1-D numpy arrays of + predicted probabilities. + reals : Union[np.ndarray, Dict[str, np.ndarray]] + The true binary labels (0 or 1). + by : float, optional + The step size for the probability thresholds. Defaults to 0.01. + stratified_by : Sequence[str], optional + Variables for stratification. Defaults to ``["probability_threshold"]``. + size : int, optional + The width and height of the plot in pixels. Defaults to 600. + color_values : List[str], optional + A list of hex color strings for the plot lines. + renderer : {"plotly", "matplotlib", "browser", "rtichoke_viz"}, optional + Rendering backend. The default, ``"plotly"``, preserves the existing + return value and behavior. ``"matplotlib"`` requires the optional + Matplotlib dependency. ``"browser"`` and its ``"rtichoke_viz"`` alias + return an offline browser chart backed by the packaged TypeScript bundle. + + Returns + ------- + Figure or RtichokeBrowserChart + A Plotly or Matplotlib figure, or an offline browser chart, depending + on ``renderer``. + """ + selected_renderer = _validate_renderer(renderer) + if selected_renderer != "plotly": + performance_data = prepare_performance_data( + probs=probs, + reals=reals, + stratified_by=stratified_by, + by=by, + ) + evaluation_metadata = _build_evaluation_metadata(probs, reals, np.array([])) + spec = _gains_v2_spec_from_performance_data( + performance_data, evaluation_metadata + ) + return _render_gains_v2( + spec, + renderer=selected_renderer, + size=size, + color_values=color_values, + ) + + fig = _create_rtichoke_plotly_curve_binary( + probs, + reals, + by=by, + stratified_by=stratified_by, + size=size, + color_values=color_values, + curve="gains", + ) + return _apply_color_values_binary(fig, color_values) + + +def plot_gains_curve( + performance_data: pl.DataFrame, + stratified_by: Sequence[str] = ["probability_threshold"], + size: int = 600, +) -> Figure: + """Plots a Gains curve from pre-computed performance data. + + This function is useful for plotting a Gains curve directly from a + DataFrame that already contains the necessary performance metrics. + + Parameters + ---------- + performance_data : pl.DataFrame + A Polars DataFrame with performance metrics. It must include columns + for the percentage of the population targeted and the corresponding + gain, along with any stratification variables. + stratified_by : Sequence[str], optional + The columns in `performance_data` used for stratification. Defaults to + ``["probability_threshold"]``. + size : int, optional + The width and height of the plot in pixels. Defaults to 600. + + Returns + ------- + Figure + A Plotly ``Figure`` object representing the Gains curve. + """ + fig = _plot_rtichoke_curve_binary( + performance_data, + size=size, + curve="gains", + ) + return fig + + +def create_gains_curve_times( + probs: Dict[str, np.ndarray], + reals: Union[np.ndarray, Dict[str, np.ndarray]], + times: Union[np.ndarray, Dict[str, np.ndarray]], + fixed_time_horizons: list[float], + heuristics_sets: list[Dict] = [ + { + "censoring_heuristic": "adjusted", + "competing_heuristic": "adjusted_as_negative", + } + ], + by: float = 0.01, + stratified_by: Sequence[str] = ["probability_threshold"], + size: int = 600, + color_values: List[str] = [ + "#1b9e77", + "#d95f02", + "#7570b3", + "#e7298a", + "#07004D", + "#E6AB02", + "#FE5F55", + "#54494B", + "#006E90", + "#BC96E6", + "#52050A", + "#1F271B", + "#BE7C4D", + "#63768D", + "#08A045", + "#320A28", + "#82FF9E", + "#2176FF", + "#D1603D", + "#585123", + ], + renderer: str = "plotly", +) -> Any: + """Creates a time-dependent Gains curve. + + Generates a Gains curve for time-to-event models, which is evaluated at + specified time horizons and handles censored data and competing risks. + + Parameters + ---------- + probs : Dict[str, np.ndarray] + A dictionary of predicted probabilities. + reals : Union[np.ndarray, Dict[str, np.ndarray]] + The true event statuses. + times : Union[np.ndarray, Dict[str, np.ndarray]] + The event or censoring times. + fixed_time_horizons : list[float] + A list of time points for performance evaluation. + heuristics_sets : list[Dict], optional + Specifies how to handle censored data and competing events. + by : float, optional + The step size for probability thresholds. Defaults to 0.01. + stratified_by : Sequence[str], optional + Variables for stratification. Defaults to ``["probability_threshold"]``. + size : int, optional + The width and height of the plot in pixels. Defaults to 600. + color_values : List[str], optional + A list of hex color strings for the plot lines. + renderer : {"plotly", "matplotlib", "browser", "rtichoke_viz"}, optional + Rendering backend. Plotly remains the default production behavior. + + Returns + ------- + Figure or RtichokeBrowserChart + A Plotly or Matplotlib figure, or an offline browser chart, depending + on ``renderer``. + """ + selected_renderer = _validate_renderer(renderer) + if selected_renderer != "plotly": + from rtichoke.performance_data.performance_data_times import ( + prepare_performance_data_times, + ) + + performance_data = prepare_performance_data_times( + probs, + reals, + times, + fixed_time_horizons=fixed_time_horizons, + heuristics_sets=heuristics_sets, + by=by, + stratified_by=stratified_by, + ) + evaluation_metadata = _build_evaluation_metadata(probs, reals, times) + spec = _gains_times_v2_spec_from_performance_data( + performance_data, evaluation_metadata + ) + return _render_gains_v2( + spec, + renderer=selected_renderer, + size=size, + color_values=color_values, + ) + + return _create_rtichoke_plotly_curve_times_reference_safe( + probs, + reals, + times, + fixed_time_horizons=fixed_time_horizons, + heuristics_sets=heuristics_sets, + by=by, + stratified_by=stratified_by, + size=size, + color_values=color_values, + curve="gains", + ) + From 7724b26833134310f12edac26a8056ab87a17b69 Mon Sep 17 00:00:00 2001 From: Uriah Finkel Date: Sun, 23 Aug 2026 07:25:21 +0300 Subject: [PATCH 04/10] Test canonical time-dependent gains semantics --- tests/test_time_gains_v2.py | 167 ++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 tests/test_time_gains_v2.py diff --git a/tests/test_time_gains_v2.py b/tests/test_time_gains_v2.py new file mode 100644 index 00000000..21c37c17 --- /dev/null +++ b/tests/test_time_gains_v2.py @@ -0,0 +1,167 @@ +from pathlib import Path + +import matplotlib.figure +import numpy as np +import plotly.graph_objects as go + +from rtichoke import create_gains_curve_times +from rtichoke._renderers import RtichokeBrowserChart +from rtichoke._viz_spec_v2 import _gains_times_v2_spec_from_performance_data +from rtichoke.performance_data.performance_data_times import ( + prepare_performance_data_times, +) +from rtichoke.processing.evaluation_semantics import ( + _SHARED_POPULATION, + _build_evaluation_metadata, +) + +HORIZONS = [5.0, 10.0] +HEURISTICS = [ + { + "censoring_heuristic": "adjusted", + "competing_heuristic": "adjusted_as_negative", + } +] + + +def _shared_inputs(): + return ( + { + "Model A": np.array([0.05, 0.15, 0.35, 0.55, 0.75, 0.95]), + "Model B": np.array([0.10, 0.25, 0.45, 0.65, 0.80, 0.90]), + }, + np.array([1, 0, 1, 0, 1, 0]), + np.array([3.0, 12.0, 8.0, 13.0, 14.0, 15.0]), + ) + + +def _spec(probs, reals, times): + performance = prepare_performance_data_times( + probs, + reals, + times, + fixed_time_horizons=HORIZONS, + heuristics_sets=HEURISTICS, + by=0.25, + ) + return _gains_times_v2_spec_from_performance_data( + performance, _build_evaluation_metadata(probs, reals, times) + ) + + +def test_time_gains_uses_one_evaluation_and_series_per_model_horizon(): + probs, reals, times = _shared_inputs() + spec = _spec(probs, reals, times) + + assert len(spec["evaluations"]) == 2 + assert {evaluation["population"] for evaluation in spec["evaluations"]} == { + _SHARED_POPULATION + } + assert len(spec["series"]) == 4 + assert { + (series["display"]["group"], series["horizon"]) for series in spec["series"] + } == { + ("Model A", 5.0), + ("Model A", 10.0), + ("Model B", 5.0), + ("Model B", 10.0), + } + + perfect = spec["references"][1:] + assert len(perfect) == 2 + assert { + (reference["population"], reference["horizon"]) for reference in perfect + } == { + (_SHARED_POPULATION, 5.0), + (_SHARED_POPULATION, 10.0), + } + + +def test_equal_risk_population_horizons_remain_distinct_reference_owners(): + probs = { + "Population A": np.array([0.05, 0.2, 0.7, 0.95]), + "Population B": np.array([0.1, 0.4, 0.6, 0.9]), + } + reals = { + "Population A": np.array([1, 0, 0, 0]), + "Population B": np.array([1, 0, 0, 0]), + } + times = { + "Population A": np.array([3.0, 12.0, 13.0, 14.0]), + "Population B": np.array([3.0, 12.0, 13.0, 14.0]), + } + perfect = _spec(probs, reals, times)["references"][1:] + + assert len(perfect) == 4 + by_owner = { + (reference["population"], reference["horizon"]): reference["points"] + for reference in perfect + } + assert len(by_owner) == 4 + assert by_owner[("Population A", 5.0)] == by_owner[("Population B", 5.0)] + + +def test_censoring_and_competing_risk_reference_comes_from_performance_layer(): + probs = {"Model A": np.array([0.05, 0.2, 0.4, 0.6, 0.8, 0.95])} + reals = np.array([1, 0, 2, 1, 0, 2]) + times = np.array([2.0, 3.0, 4.0, 8.0, 12.0, 14.0]) + performance = prepare_performance_data_times( + probs, + reals, + times, + fixed_time_horizons=HORIZONS, + heuristics_sets=HEURISTICS, + by=0.25, + ) + spec = _gains_times_v2_spec_from_performance_data( + performance, _build_evaluation_metadata(probs, reals, times) + ) + calculated = { + float(row["fixed_time_horizon"]): float(row["real_positives"] / row["n"]) + for row in performance.filter(performance["chosen_cutoff"] == 0) + .select("fixed_time_horizon", "real_positives", "n") + .unique() + .to_dicts() + } + + assert { + reference["horizon"]: reference["points"][1]["x"] + for reference in spec["references"][1:] + } == calculated + + +def test_time_gains_renderers_preserve_plotly_default_and_horizons(tmp_path: Path): + probs, reals, times = _shared_inputs() + default = create_gains_curve_times( + probs, reals, times, HORIZONS, heuristics_sets=HEURISTICS, by=0.25 + ) + assert isinstance(default, go.Figure) + + browser = create_gains_curve_times( + probs, + reals, + times, + HORIZONS, + heuristics_sets=HEURISTICS, + by=0.25, + renderer="browser", + ) + assert isinstance(browser, RtichokeBrowserChart) + assert {series["horizon"] for series in browser.spec["series"]} == set(HORIZONS) + assert browser.write_html(tmp_path / "time-gains.html").is_file() + + matplotlib_result = create_gains_curve_times( + probs, + reals, + times, + HORIZONS, + heuristics_sets=HEURISTICS, + by=0.25, + renderer="matplotlib", + ) + assert isinstance(matplotlib_result, matplotlib.figure.Figure) + assert [axis.get_title() for axis in matplotlib_result.axes] == [ + "Fixed Time Horizon: 5", + "Fixed Time Horizon: 10", + ] + From 4e4ab765379e71f0fda0f89d6b6eb8d963230e24 Mon Sep 17 00:00:00 2001 From: Uriah Finkel Date: Sun, 23 Aug 2026 07:27:05 +0300 Subject: [PATCH 05/10] Normalize committed source content --- src/rtichoke/_renderers.py | 383 ++++++++++++++++++------------------- 1 file changed, 191 insertions(+), 192 deletions(-) diff --git a/src/rtichoke/_renderers.py b/src/rtichoke/_renderers.py index 301ad37b..2de79394 100644 --- a/src/rtichoke/_renderers.py +++ b/src/rtichoke/_renderers.py @@ -1,192 +1,191 @@ -"""Renderer selection for canonical rtichoke visualization specifications.""" - -from __future__ import annotations - -import json -from dataclasses import dataclass -from importlib.resources import files -from pathlib import Path -from typing import Any, Literal - -Renderer = Literal["plotly", "matplotlib", "browser", "rtichoke_viz"] - -_SUPPORTED_RENDERERS = ("plotly", "matplotlib", "browser", "rtichoke_viz") - - -def _validate_renderer(renderer: str) -> Renderer: - """Validate and normalize a public renderer name.""" - if renderer not in _SUPPORTED_RENDERERS: - supported = ", ".join(repr(name) for name in _SUPPORTED_RENDERERS) - raise ValueError( - f"Unsupported renderer {renderer!r}. Supported renderers are: {supported}." - ) - return renderer # type: ignore[return-value] - - -@dataclass(frozen=True) -class RtichokeBrowserChart: - """A canonical v2 chart that can be written for offline browser rendering.""" - - spec: dict[str, Any] - size: int = 600 - - def write_html(self, path: str | Path) -> Path: - """Write an offline HTML page plus its packaged renderer assets. - - Parameters - ---------- - path : str or pathlib.Path - Destination for the HTML page. - - Returns - ------- - pathlib.Path - The written HTML path. - """ - output = Path(path) - output.parent.mkdir(parents=True, exist_ok=True) - vendor = files("rtichoke").joinpath("_vendor", "rtichoke_viz") - for asset in ("rtichoke-viz.js", "rtichoke-viz.css"): - (output.parent / asset).write_bytes(vendor.joinpath(asset).read_bytes()) - - render_export = { - "roc": "renderRocV2", - "calibration": "renderCalibrationV2", - "precision_recall": "renderPrecisionRecallV2", - "gains": "renderGainsV2", - }.get(str(self.spec.get("type"))) - if render_export is None: - raise ValueError( - f"rtichoke_viz does not support chart type {self.spec.get('type')!r}." - ) - - spec_json = json.dumps(self.spec, separators=(",", ":")).replace(" - - - - - - rtichoke {self.spec.get("type")} chart - - -
- - - - -""" - output.write_text(html, encoding="utf-8") - return output - - -def _render_gains_matplotlib( - spec: dict[str, Any], *, size: int, color_values: list[str] -) -> Any: - """Render canonical gains quantities with an optional Matplotlib backend.""" - try: - from matplotlib.figure import Figure - except ImportError as error: - raise ImportError( - "The 'matplotlib' renderer requires the optional matplotlib dependency. " - "Install it with `pip install 'rtichoke[matplotlib]'`." - ) from error - - series = spec.get("series", []) - data = spec.get("data", []) - assert isinstance(series, list) and isinstance(data, list) - horizons = list( - dict.fromkeys( - item["horizon"] for item in series if item.get("horizon") is not None - ) - ) - panels: list[float | None] = horizons or [None] - figure = Figure(figsize=(size / 100 * len(panels), size / 100), dpi=100) - axes_value = figure.subplots(1, len(panels), squeeze=False) - axes = list(axes_value[0]) - references = spec.get("references", []) - assert isinstance(references, list) - display_groups = list(dict.fromkeys(item["display"]["group"] for item in series)) - colors = { - group: ( - "black" - if len(display_groups) == 1 - else color_values[index % len(color_values)] - ) - for index, group in enumerate(display_groups) - } - x_axis = spec["xAxis"] - y_axis = spec["yAxis"] - for axis, horizon in zip(axes, panels): - for reference in references: - if not isinstance(reference, dict): - continue - if ( - reference.get("scope") == "population_horizon" - and reference.get("horizon") != horizon - ): - continue - if reference.get("type") == "identity": - x_values, y_values = [0, 1], [0, 1] - elif reference.get("type") == "path": - points = reference.get("points", []) - x_values = [point["x"] for point in points] - y_values = [point["y"] for point in points] - else: - continue - axis.plot( - x_values, - y_values, - color="#BEBEBE", - linestyle="--", - linewidth=2, - ) - - panel_series = [ - item - for item in series - if item.get("horizon") is None or item.get("horizon") == horizon - ] - for item in panel_series: - rows = [row for row in data if row["seriesId"] == item["id"]] - display = item["display"] - axis.plot( - [row["ppcr"] for row in rows], - [row["sensitivity"] for row in rows], - label=display["label"], - color=colors[display["group"]], - linewidth=2, - ) - - axis.set_xlabel(x_axis["label"]) - axis.set_ylabel(y_axis["label"]) - axis.set_xlim(*x_axis["domain"]) - axis.set_ylim(*y_axis["domain"]) - if horizon is not None: - axis.set_title(f"Fixed Time Horizon: {horizon:g}") - if len(panel_series) > 1: - axis.legend() - figure.tight_layout() - return figure - - -def _render_gains_v2( - spec: dict[str, Any], - *, - renderer: str, - size: int, - color_values: list[str], -) -> Any: - """Render a canonical gains v2 spec with a non-default backend.""" - selected = _validate_renderer(renderer) - if selected == "matplotlib": - return _render_gains_matplotlib(spec, size=size, color_values=color_values) - if selected in {"browser", "rtichoke_viz"}: - return RtichokeBrowserChart(spec=spec, size=size) - raise ValueError("The Plotly renderer must use the existing production path.") - +"""Renderer selection for canonical rtichoke visualization specifications.""" + +from __future__ import annotations + +import json +from dataclasses import dataclass +from importlib.resources import files +from pathlib import Path +from typing import Any, Literal + +Renderer = Literal["plotly", "matplotlib", "browser", "rtichoke_viz"] + +_SUPPORTED_RENDERERS = ("plotly", "matplotlib", "browser", "rtichoke_viz") + + +def _validate_renderer(renderer: str) -> Renderer: + """Validate and normalize a public renderer name.""" + if renderer not in _SUPPORTED_RENDERERS: + supported = ", ".join(repr(name) for name in _SUPPORTED_RENDERERS) + raise ValueError( + f"Unsupported renderer {renderer!r}. Supported renderers are: {supported}." + ) + return renderer # type: ignore[return-value] + + +@dataclass(frozen=True) +class RtichokeBrowserChart: + """A canonical v2 chart that can be written for offline browser rendering.""" + + spec: dict[str, Any] + size: int = 600 + + def write_html(self, path: str | Path) -> Path: + """Write an offline HTML page plus its packaged renderer assets. + + Parameters + ---------- + path : str or pathlib.Path + Destination for the HTML page. + + Returns + ------- + pathlib.Path + The written HTML path. + """ + output = Path(path) + output.parent.mkdir(parents=True, exist_ok=True) + vendor = files("rtichoke").joinpath("_vendor", "rtichoke_viz") + for asset in ("rtichoke-viz.js", "rtichoke-viz.css"): + (output.parent / asset).write_bytes(vendor.joinpath(asset).read_bytes()) + + render_export = { + "roc": "renderRocV2", + "calibration": "renderCalibrationV2", + "precision_recall": "renderPrecisionRecallV2", + "gains": "renderGainsV2", + }.get(str(self.spec.get("type"))) + if render_export is None: + raise ValueError( + f"rtichoke_viz does not support chart type {self.spec.get('type')!r}." + ) + + spec_json = json.dumps(self.spec, separators=(",", ":")).replace(" + + + + + + rtichoke {self.spec.get("type")} chart + + +
+ + + + +""" + output.write_text(html, encoding="utf-8") + return output + + +def _render_gains_matplotlib( + spec: dict[str, Any], *, size: int, color_values: list[str] +) -> Any: + """Render canonical gains quantities with an optional Matplotlib backend.""" + try: + from matplotlib.figure import Figure + except ImportError as error: + raise ImportError( + "The 'matplotlib' renderer requires the optional matplotlib dependency. " + "Install it with `pip install 'rtichoke[matplotlib]'`." + ) from error + + series = spec.get("series", []) + data = spec.get("data", []) + assert isinstance(series, list) and isinstance(data, list) + horizons = list( + dict.fromkeys( + item["horizon"] for item in series if item.get("horizon") is not None + ) + ) + panels: list[float | None] = horizons or [None] + figure = Figure(figsize=(size / 100 * len(panels), size / 100), dpi=100) + axes_value = figure.subplots(1, len(panels), squeeze=False) + axes = list(axes_value[0]) + references = spec.get("references", []) + assert isinstance(references, list) + display_groups = list(dict.fromkeys(item["display"]["group"] for item in series)) + colors = { + group: ( + "black" + if len(display_groups) == 1 + else color_values[index % len(color_values)] + ) + for index, group in enumerate(display_groups) + } + x_axis = spec["xAxis"] + y_axis = spec["yAxis"] + for axis, horizon in zip(axes, panels): + for reference in references: + if not isinstance(reference, dict): + continue + if ( + reference.get("scope") == "population_horizon" + and reference.get("horizon") != horizon + ): + continue + if reference.get("type") == "identity": + x_values, y_values = [0, 1], [0, 1] + elif reference.get("type") == "path": + points = reference.get("points", []) + x_values = [point["x"] for point in points] + y_values = [point["y"] for point in points] + else: + continue + axis.plot( + x_values, + y_values, + color="#BEBEBE", + linestyle="--", + linewidth=2, + ) + + panel_series = [ + item + for item in series + if item.get("horizon") is None or item.get("horizon") == horizon + ] + for item in panel_series: + rows = [row for row in data if row["seriesId"] == item["id"]] + display = item["display"] + axis.plot( + [row["ppcr"] for row in rows], + [row["sensitivity"] for row in rows], + label=display["label"], + color=colors[display["group"]], + linewidth=2, + ) + + axis.set_xlabel(x_axis["label"]) + axis.set_ylabel(y_axis["label"]) + axis.set_xlim(*x_axis["domain"]) + axis.set_ylim(*y_axis["domain"]) + if horizon is not None: + axis.set_title(f"Fixed Time Horizon: {horizon:g}") + if len(panel_series) > 1: + axis.legend() + figure.tight_layout() + return figure + + +def _render_gains_v2( + spec: dict[str, Any], + *, + renderer: str, + size: int, + color_values: list[str], +) -> Any: + """Render a canonical gains v2 spec with a non-default backend.""" + selected = _validate_renderer(renderer) + if selected == "matplotlib": + return _render_gains_matplotlib(spec, size=size, color_values=color_values) + if selected in {"browser", "rtichoke_viz"}: + return RtichokeBrowserChart(spec=spec, size=size) + raise ValueError("The Plotly renderer must use the existing production path.") From 10ccdddf372cbb5ca03994475b6f47c4f422e6a1 Mon Sep 17 00:00:00 2001 From: Uriah Finkel Date: Sun, 23 Aug 2026 07:27:08 +0300 Subject: [PATCH 06/10] Normalize committed source content --- src/rtichoke/_viz_spec_v2.py | 827 +++++++++++++++++------------------ 1 file changed, 413 insertions(+), 414 deletions(-) diff --git a/src/rtichoke/_viz_spec_v2.py b/src/rtichoke/_viz_spec_v2.py index c6cdc6cc..7253d4b0 100644 --- a/src/rtichoke/_viz_spec_v2.py +++ b/src/rtichoke/_viz_spec_v2.py @@ -1,414 +1,413 @@ -"""Internal builders for canonical ``rtichoke_viz`` v2 specifications. - -These helpers are deliberately not wired into production rendering yet. They -translate already-computed performance data plus semantic evaluation metadata -into the canonical visualization contract. -""" - -from __future__ import annotations - -from collections.abc import Mapping - -import polars as pl - -from rtichoke.processing.evaluation_semantics import _EvaluationMetadata - -_REQUIRED_ROC_COLUMNS = { - "reference_group", - "chosen_cutoff", - "sensitivity", - "specificity", -} -_REQUIRED_GAINS_COLUMNS = { - "reference_group", - "chosen_cutoff", - "sensitivity", - "ppcr", - "real_positives", - "n", -} - - -def _roc_v2_spec_from_performance_data( - performance_data: pl.DataFrame, - evaluation_metadata: Mapping[str, _EvaluationMetadata], -) -> dict[str, object]: - """Build a canonical ROC-v2 spec without recalculating statistics.""" - return _curve_v2_spec_from_performance_data( - performance_data, - evaluation_metadata, - chart_type="roc", - ) - - -def _gains_v2_spec_from_performance_data( - performance_data: pl.DataFrame, - evaluation_metadata: Mapping[str, _EvaluationMetadata], -) -> dict[str, object]: - """Build a canonical gains-v2 spec from production performance quantities.""" - spec = _curve_v2_spec_from_performance_data( - performance_data, - evaluation_metadata, - chart_type="gains", - ) - prevalence = _gains_population_prevalence(performance_data, evaluation_metadata) - - populations = list( - dict.fromkeys(metadata.population for metadata in evaluation_metadata.values()) - ) - spec["references"] = [ - {"type": "identity", "scope": "global", "label": "Random"}, - *[ - { - "type": "path", - "scope": "population", - "population": population, - "label": "Perfect Model", - "points": [ - {"x": 0, "y": 0}, - {"x": prevalence[population], "y": 1}, - {"x": 1, "y": 1}, - ], - } - for population in populations - ], - ] - return spec - - -def _gains_times_v2_spec_from_performance_data( - performance_data: pl.DataFrame, - evaluation_metadata: Mapping[str, _EvaluationMetadata], -) -> dict[str, object]: - """Build canonical time-dependent gains from calculated production data.""" - required = _REQUIRED_GAINS_COLUMNS | { - "fixed_time_horizon", - "censoring_heuristic", - "competing_heuristic", - } - missing = required.difference(performance_data.columns) - if missing: - raise ValueError( - "Time-dependent gains performance data is missing columns: " - + ", ".join(sorted(missing)) - ) - - rows = performance_data.select( - "reference_group", - "fixed_time_horizon", - "censoring_heuristic", - "competing_heuristic", - "chosen_cutoff", - "sensitivity", - "ppcr", - ).to_dicts() - row_groups = {str(row["reference_group"]) for row in rows} - missing_metadata = row_groups.difference(evaluation_metadata) - if missing_metadata: - raise ValueError( - "Time-dependent gains rows are missing evaluation metadata: " - + ", ".join(sorted(missing_metadata)) - ) - - ordered_groups = [group for group in evaluation_metadata if group in row_groups] - evaluation_ids = { - group: f"evaluation-{index}" - for index, group in enumerate(ordered_groups, start=1) - } - evaluations = [] - for group in ordered_groups: - metadata = evaluation_metadata[group] - evaluation: dict[str, object] = { - "id": evaluation_ids[group], - "population": metadata.population, - } - if metadata.model is not None: - evaluation["model"] = metadata.model - evaluations.append(evaluation) - - series_keys = list( - dict.fromkeys( - ( - str(row["reference_group"]), - float(row["fixed_time_horizon"]), - str(row["censoring_heuristic"]), - str(row["competing_heuristic"]), - ) - for row in rows - ) - ) - series_ids = { - key: f"series-{index}" for index, key in enumerate(series_keys, start=1) - } - series = [] - for key in series_keys: - group, horizon, _, _ = key - metadata = evaluation_metadata[group] - display_value = metadata.model or metadata.population - series.append( - { - "id": series_ids[key], - "evaluationId": evaluation_ids[group], - "horizon": horizon, - "display": { - "label": display_value, - "group": display_value, - "role": "model" if metadata.model is not None else "population", - }, - } - ) - - data = [] - for row in rows: - key = ( - str(row["reference_group"]), - float(row["fixed_time_horizon"]), - str(row["censoring_heuristic"]), - str(row["competing_heuristic"]), - ) - data.append( - { - "seriesId": series_ids[key], - "cutoff": row["chosen_cutoff"], - "ppcr": row["ppcr"], - "sensitivity": row["sensitivity"], - } - ) - - risks = _gains_population_horizon_risk(performance_data, evaluation_metadata) - references = [{"type": "identity", "scope": "global", "label": "Random"}] - for (population, horizon), risk in risks.items(): - references.append( - { - "type": "path", - "scope": "population_horizon", - "population": population, - "horizon": horizon, - "label": "Perfect Model", - "points": [ - {"x": 0, "y": 0}, - {"x": risk, "y": 1}, - {"x": 1, "y": 1}, - ], - } - ) - - return { - "schemaVersion": "2.0", - "type": "gains", - "evaluations": evaluations, - "series": series, - "data": data, - "x": "ppcr", - "y": "sensitivity", - "xAxis": {"label": "Predicted Positives (Rate)", "domain": [0, 1]}, - "yAxis": {"label": "Sensitivity", "domain": [0, 1]}, - "references": references, - } - - -def _gains_population_horizon_risk( - performance_data: pl.DataFrame, - evaluation_metadata: Mapping[str, _EvaluationMetadata], -) -> dict[tuple[str, float], float]: - """Map calculated cutoff-0 AJ event risk to semantic population/horizon.""" - group_risks = ( - performance_data.filter(pl.col("chosen_cutoff") == 0) - .select( - "reference_group", - "fixed_time_horizon", - (pl.col("real_positives") / pl.col("n")).alias("event_risk"), - ) - .unique() - .to_dicts() - ) - values: dict[tuple[str, float], set[float]] = {} - for row in group_risks: - group = str(row["reference_group"]) - metadata = evaluation_metadata.get(group) - if metadata is None: - continue - key = (metadata.population, float(row["fixed_time_horizon"])) - values.setdefault(key, set()).add(float(row["event_risk"])) - - populations = list( - dict.fromkeys(metadata.population for metadata in evaluation_metadata.values()) - ) - horizons = sorted( - float(value) - for value in performance_data["fixed_time_horizon"].unique().to_list() - ) - risks: dict[tuple[str, float], float] = {} - for key in ( - (population, horizon) - for horizon in horizons - for population in populations - if (population, horizon) in values - ): - candidates = values[key] - if len(candidates) != 1: - raise ValueError( - "Time-dependent gains must have one calculated event risk per " - f"population and horizon: {key[0]} at {key[1]}" - ) - risks[key] = next(iter(candidates)) - return risks - - -def _gains_population_prevalence( - performance_data: pl.DataFrame, - evaluation_metadata: Mapping[str, _EvaluationMetadata], -) -> dict[str, float]: - """Map production event prevalence from compatibility groups to populations.""" - group_prevalence = { - str(row["reference_group"]): float(row["prevalence"]) - for row in ( - performance_data.select( - "reference_group", - (pl.col("real_positives") / pl.col("n")).alias("prevalence"), - ) - .unique() - .to_dicts() - ) - } - population_values: dict[str, set[float]] = {} - for group, metadata in evaluation_metadata.items(): - if group not in group_prevalence: - continue - population_values.setdefault(metadata.population, set()).add( - group_prevalence[group] - ) - - prevalence: dict[str, float] = {} - for population in dict.fromkeys( - metadata.population for metadata in evaluation_metadata.values() - ): - values = population_values.get(population, set()) - if len(values) != 1: - raise ValueError( - "Gains performance data must have one prevalence per population: " - f"{population}" - ) - prevalence[population] = next(iter(values)) - return prevalence - - -def _curve_v2_spec_from_performance_data( - performance_data: pl.DataFrame, - evaluation_metadata: Mapping[str, _EvaluationMetadata], - *, - chart_type: str, -) -> dict[str, object]: - """Build common canonical curve semantics without recalculating statistics. - - ``reference_group`` is used only to join existing performance rows to the - semantic metadata established by the high-level production inputs. Stable - evaluation/series IDs are ordinal over that semantic metadata, so they do - not encode compatibility grouping names or presentation values. - """ - if chart_type == "roc": - required = _REQUIRED_ROC_COLUMNS - selected = ["reference_group", "chosen_cutoff", "sensitivity", "specificity"] - elif chart_type == "gains": - required = _REQUIRED_GAINS_COLUMNS - selected = ["reference_group", "chosen_cutoff", "sensitivity", "ppcr"] - else: - raise ValueError(f"Unsupported v2 curve type: {chart_type}") - - missing = required.difference(performance_data.columns) - if missing: - missing_columns = ", ".join(sorted(missing)) - raise ValueError( - f"{chart_type.upper()} performance data is missing columns: {missing_columns}" - ) - - rows = performance_data.select(*selected).to_dicts() - row_groups = {str(row["reference_group"]) for row in rows} - metadata_groups = set(evaluation_metadata) - missing_metadata = row_groups.difference(metadata_groups) - if missing_metadata: - groups = ", ".join(sorted(missing_metadata)) - raise ValueError( - f"{chart_type.upper()} performance rows are missing evaluation metadata: " - f"{groups}" - ) - - ordered_groups = [group for group in evaluation_metadata if group in row_groups] - evaluation_ids = { - group: f"evaluation-{index}" - for index, group in enumerate(ordered_groups, start=1) - } - series_ids = { - group: f"series-{index}" for index, group in enumerate(ordered_groups, start=1) - } - - evaluations: list[dict[str, object]] = [] - series: list[dict[str, object]] = [] - for group in ordered_groups: - metadata = evaluation_metadata[group] - evaluation: dict[str, object] = { - "id": evaluation_ids[group], - "population": metadata.population, - } - if metadata.model is not None: - evaluation["model"] = metadata.model - evaluations.append(evaluation) - - if metadata.model is not None: - display_value = metadata.model - display_role = "model" - else: - display_value = metadata.population - display_role = "population" - series.append( - { - "id": series_ids[group], - "evaluationId": evaluation_ids[group], - "display": { - "label": display_value, - "group": display_value, - "role": display_role, - }, - } - ) - - data = [] - for row in rows: - datum = { - "seriesId": series_ids[str(row["reference_group"])], - "cutoff": row["chosen_cutoff"], - "sensitivity": row["sensitivity"], - } - if chart_type == "roc": - datum["specificity"] = row["specificity"] - else: - datum["ppcr"] = row["ppcr"] - data.append(datum) - - if chart_type == "roc": - return { - "schemaVersion": "2.0", - "type": "roc", - "evaluations": evaluations, - "series": series, - "data": data, - "x": "false_positive_rate", - "y": "sensitivity", - "xAxis": {"label": "1 - Specificity", "domain": [0, 1]}, - "yAxis": {"label": "Sensitivity", "domain": [0, 1]}, - "references": [{"type": "identity", "scope": "global"}], - } - - return { - "schemaVersion": "2.0", - "type": "gains", - "evaluations": evaluations, - "series": series, - "data": data, - "x": "ppcr", - "y": "sensitivity", - "xAxis": {"label": "Predicted Positives (Rate)", "domain": [0, 1]}, - "yAxis": {"label": "Sensitivity", "domain": [0, 1]}, - "references": [], - } - +"""Internal builders for canonical ``rtichoke_viz`` v2 specifications. + +These helpers are deliberately not wired into production rendering yet. They +translate already-computed performance data plus semantic evaluation metadata +into the canonical visualization contract. +""" + +from __future__ import annotations + +from collections.abc import Mapping + +import polars as pl + +from rtichoke.processing.evaluation_semantics import _EvaluationMetadata + +_REQUIRED_ROC_COLUMNS = { + "reference_group", + "chosen_cutoff", + "sensitivity", + "specificity", +} +_REQUIRED_GAINS_COLUMNS = { + "reference_group", + "chosen_cutoff", + "sensitivity", + "ppcr", + "real_positives", + "n", +} + + +def _roc_v2_spec_from_performance_data( + performance_data: pl.DataFrame, + evaluation_metadata: Mapping[str, _EvaluationMetadata], +) -> dict[str, object]: + """Build a canonical ROC-v2 spec without recalculating statistics.""" + return _curve_v2_spec_from_performance_data( + performance_data, + evaluation_metadata, + chart_type="roc", + ) + + +def _gains_v2_spec_from_performance_data( + performance_data: pl.DataFrame, + evaluation_metadata: Mapping[str, _EvaluationMetadata], +) -> dict[str, object]: + """Build a canonical gains-v2 spec from production performance quantities.""" + spec = _curve_v2_spec_from_performance_data( + performance_data, + evaluation_metadata, + chart_type="gains", + ) + prevalence = _gains_population_prevalence(performance_data, evaluation_metadata) + + populations = list( + dict.fromkeys(metadata.population for metadata in evaluation_metadata.values()) + ) + spec["references"] = [ + {"type": "identity", "scope": "global", "label": "Random"}, + *[ + { + "type": "path", + "scope": "population", + "population": population, + "label": "Perfect Model", + "points": [ + {"x": 0, "y": 0}, + {"x": prevalence[population], "y": 1}, + {"x": 1, "y": 1}, + ], + } + for population in populations + ], + ] + return spec + + +def _gains_times_v2_spec_from_performance_data( + performance_data: pl.DataFrame, + evaluation_metadata: Mapping[str, _EvaluationMetadata], +) -> dict[str, object]: + """Build canonical time-dependent gains from calculated production data.""" + required = _REQUIRED_GAINS_COLUMNS | { + "fixed_time_horizon", + "censoring_heuristic", + "competing_heuristic", + } + missing = required.difference(performance_data.columns) + if missing: + raise ValueError( + "Time-dependent gains performance data is missing columns: " + + ", ".join(sorted(missing)) + ) + + rows = performance_data.select( + "reference_group", + "fixed_time_horizon", + "censoring_heuristic", + "competing_heuristic", + "chosen_cutoff", + "sensitivity", + "ppcr", + ).to_dicts() + row_groups = {str(row["reference_group"]) for row in rows} + missing_metadata = row_groups.difference(evaluation_metadata) + if missing_metadata: + raise ValueError( + "Time-dependent gains rows are missing evaluation metadata: " + + ", ".join(sorted(missing_metadata)) + ) + + ordered_groups = [group for group in evaluation_metadata if group in row_groups] + evaluation_ids = { + group: f"evaluation-{index}" + for index, group in enumerate(ordered_groups, start=1) + } + evaluations = [] + for group in ordered_groups: + metadata = evaluation_metadata[group] + evaluation: dict[str, object] = { + "id": evaluation_ids[group], + "population": metadata.population, + } + if metadata.model is not None: + evaluation["model"] = metadata.model + evaluations.append(evaluation) + + series_keys = list( + dict.fromkeys( + ( + str(row["reference_group"]), + float(row["fixed_time_horizon"]), + str(row["censoring_heuristic"]), + str(row["competing_heuristic"]), + ) + for row in rows + ) + ) + series_ids = { + key: f"series-{index}" for index, key in enumerate(series_keys, start=1) + } + series = [] + for key in series_keys: + group, horizon, _, _ = key + metadata = evaluation_metadata[group] + display_value = metadata.model or metadata.population + series.append( + { + "id": series_ids[key], + "evaluationId": evaluation_ids[group], + "horizon": horizon, + "display": { + "label": display_value, + "group": display_value, + "role": "model" if metadata.model is not None else "population", + }, + } + ) + + data = [] + for row in rows: + key = ( + str(row["reference_group"]), + float(row["fixed_time_horizon"]), + str(row["censoring_heuristic"]), + str(row["competing_heuristic"]), + ) + data.append( + { + "seriesId": series_ids[key], + "cutoff": row["chosen_cutoff"], + "ppcr": row["ppcr"], + "sensitivity": row["sensitivity"], + } + ) + + risks = _gains_population_horizon_risk(performance_data, evaluation_metadata) + references = [{"type": "identity", "scope": "global", "label": "Random"}] + for (population, horizon), risk in risks.items(): + references.append( + { + "type": "path", + "scope": "population_horizon", + "population": population, + "horizon": horizon, + "label": "Perfect Model", + "points": [ + {"x": 0, "y": 0}, + {"x": risk, "y": 1}, + {"x": 1, "y": 1}, + ], + } + ) + + return { + "schemaVersion": "2.0", + "type": "gains", + "evaluations": evaluations, + "series": series, + "data": data, + "x": "ppcr", + "y": "sensitivity", + "xAxis": {"label": "Predicted Positives (Rate)", "domain": [0, 1]}, + "yAxis": {"label": "Sensitivity", "domain": [0, 1]}, + "references": references, + } + + +def _gains_population_horizon_risk( + performance_data: pl.DataFrame, + evaluation_metadata: Mapping[str, _EvaluationMetadata], +) -> dict[tuple[str, float], float]: + """Map calculated cutoff-0 AJ event risk to semantic population/horizon.""" + group_risks = ( + performance_data.filter(pl.col("chosen_cutoff") == 0) + .select( + "reference_group", + "fixed_time_horizon", + (pl.col("real_positives") / pl.col("n")).alias("event_risk"), + ) + .unique() + .to_dicts() + ) + values: dict[tuple[str, float], set[float]] = {} + for row in group_risks: + group = str(row["reference_group"]) + metadata = evaluation_metadata.get(group) + if metadata is None: + continue + key = (metadata.population, float(row["fixed_time_horizon"])) + values.setdefault(key, set()).add(float(row["event_risk"])) + + populations = list( + dict.fromkeys(metadata.population for metadata in evaluation_metadata.values()) + ) + horizons = sorted( + float(value) + for value in performance_data["fixed_time_horizon"].unique().to_list() + ) + risks: dict[tuple[str, float], float] = {} + for key in ( + (population, horizon) + for horizon in horizons + for population in populations + if (population, horizon) in values + ): + candidates = values[key] + if len(candidates) != 1: + raise ValueError( + "Time-dependent gains must have one calculated event risk per " + f"population and horizon: {key[0]} at {key[1]}" + ) + risks[key] = next(iter(candidates)) + return risks + + +def _gains_population_prevalence( + performance_data: pl.DataFrame, + evaluation_metadata: Mapping[str, _EvaluationMetadata], +) -> dict[str, float]: + """Map production event prevalence from compatibility groups to populations.""" + group_prevalence = { + str(row["reference_group"]): float(row["prevalence"]) + for row in ( + performance_data.select( + "reference_group", + (pl.col("real_positives") / pl.col("n")).alias("prevalence"), + ) + .unique() + .to_dicts() + ) + } + population_values: dict[str, set[float]] = {} + for group, metadata in evaluation_metadata.items(): + if group not in group_prevalence: + continue + population_values.setdefault(metadata.population, set()).add( + group_prevalence[group] + ) + + prevalence: dict[str, float] = {} + for population in dict.fromkeys( + metadata.population for metadata in evaluation_metadata.values() + ): + values = population_values.get(population, set()) + if len(values) != 1: + raise ValueError( + "Gains performance data must have one prevalence per population: " + f"{population}" + ) + prevalence[population] = next(iter(values)) + return prevalence + + +def _curve_v2_spec_from_performance_data( + performance_data: pl.DataFrame, + evaluation_metadata: Mapping[str, _EvaluationMetadata], + *, + chart_type: str, +) -> dict[str, object]: + """Build common canonical curve semantics without recalculating statistics. + + ``reference_group`` is used only to join existing performance rows to the + semantic metadata established by the high-level production inputs. Stable + evaluation/series IDs are ordinal over that semantic metadata, so they do + not encode compatibility grouping names or presentation values. + """ + if chart_type == "roc": + required = _REQUIRED_ROC_COLUMNS + selected = ["reference_group", "chosen_cutoff", "sensitivity", "specificity"] + elif chart_type == "gains": + required = _REQUIRED_GAINS_COLUMNS + selected = ["reference_group", "chosen_cutoff", "sensitivity", "ppcr"] + else: + raise ValueError(f"Unsupported v2 curve type: {chart_type}") + + missing = required.difference(performance_data.columns) + if missing: + missing_columns = ", ".join(sorted(missing)) + raise ValueError( + f"{chart_type.upper()} performance data is missing columns: {missing_columns}" + ) + + rows = performance_data.select(*selected).to_dicts() + row_groups = {str(row["reference_group"]) for row in rows} + metadata_groups = set(evaluation_metadata) + missing_metadata = row_groups.difference(metadata_groups) + if missing_metadata: + groups = ", ".join(sorted(missing_metadata)) + raise ValueError( + f"{chart_type.upper()} performance rows are missing evaluation metadata: " + f"{groups}" + ) + + ordered_groups = [group for group in evaluation_metadata if group in row_groups] + evaluation_ids = { + group: f"evaluation-{index}" + for index, group in enumerate(ordered_groups, start=1) + } + series_ids = { + group: f"series-{index}" for index, group in enumerate(ordered_groups, start=1) + } + + evaluations: list[dict[str, object]] = [] + series: list[dict[str, object]] = [] + for group in ordered_groups: + metadata = evaluation_metadata[group] + evaluation: dict[str, object] = { + "id": evaluation_ids[group], + "population": metadata.population, + } + if metadata.model is not None: + evaluation["model"] = metadata.model + evaluations.append(evaluation) + + if metadata.model is not None: + display_value = metadata.model + display_role = "model" + else: + display_value = metadata.population + display_role = "population" + series.append( + { + "id": series_ids[group], + "evaluationId": evaluation_ids[group], + "display": { + "label": display_value, + "group": display_value, + "role": display_role, + }, + } + ) + + data = [] + for row in rows: + datum = { + "seriesId": series_ids[str(row["reference_group"])], + "cutoff": row["chosen_cutoff"], + "sensitivity": row["sensitivity"], + } + if chart_type == "roc": + datum["specificity"] = row["specificity"] + else: + datum["ppcr"] = row["ppcr"] + data.append(datum) + + if chart_type == "roc": + return { + "schemaVersion": "2.0", + "type": "roc", + "evaluations": evaluations, + "series": series, + "data": data, + "x": "false_positive_rate", + "y": "sensitivity", + "xAxis": {"label": "1 - Specificity", "domain": [0, 1]}, + "yAxis": {"label": "Sensitivity", "domain": [0, 1]}, + "references": [{"type": "identity", "scope": "global"}], + } + + return { + "schemaVersion": "2.0", + "type": "gains", + "evaluations": evaluations, + "series": series, + "data": data, + "x": "ppcr", + "y": "sensitivity", + "xAxis": {"label": "Predicted Positives (Rate)", "domain": [0, 1]}, + "yAxis": {"label": "Sensitivity", "domain": [0, 1]}, + "references": [], + } From 93ea93225525ff6cc17252ebea8172a456e23e86 Mon Sep 17 00:00:00 2001 From: Uriah Finkel Date: Sun, 23 Aug 2026 07:27:12 +0300 Subject: [PATCH 07/10] Normalize committed source content --- src/rtichoke/discrimination/gains.py | 623 +++++++++++++-------------- 1 file changed, 311 insertions(+), 312 deletions(-) diff --git a/src/rtichoke/discrimination/gains.py b/src/rtichoke/discrimination/gains.py index 4fb194e0..a30b4d93 100644 --- a/src/rtichoke/discrimination/gains.py +++ b/src/rtichoke/discrimination/gains.py @@ -1,312 +1,311 @@ -""" -A module for Gains Curves using Plotly helpers -""" - -from typing import Any, Dict, List, Sequence, Union -from plotly.graph_objs._figure import Figure -from rtichoke.processing.binary_color_values import _apply_color_values_binary -from rtichoke.processing.plotly_helper_functions import ( - _create_rtichoke_plotly_curve_binary, - _plot_rtichoke_curve_binary, - _create_reference_lines_data, - _check_if_multiple_populations_are_being_validated_times, -) -from rtichoke.processing.time_reference_lines import ( - _create_rtichoke_plotly_curve_times_reference_safe, -) -import numpy as np -import polars as pl -from rtichoke._renderers import _render_gains_v2, _validate_renderer -from rtichoke._viz_spec_v2 import ( - _gains_times_v2_spec_from_performance_data, - _gains_v2_spec_from_performance_data, -) -from rtichoke.performance_data.performance_data import prepare_performance_data -from rtichoke.processing.evaluation_semantics import _build_evaluation_metadata - - -def _get_gains_aj_estimates_times(performance_data: pl.DataFrame) -> pl.DataFrame: - """Return one horizon-specific event estimate per reference group. - - For a gains reference curve the required event probability is the overall - event probability at the horizon. At probability threshold 0 everyone is - classified positive, so ``real_positives / n`` gives that quantity without - mixing in the cutoff-specific estimate at threshold 1. - """ - return ( - performance_data.filter(pl.col("chosen_cutoff") == 0) - .select("reference_group", "fixed_time_horizon", "real_positives", "n") - .unique() - .with_columns((pl.col("real_positives") / pl.col("n")).alias("aj_estimate")) - .select("reference_group", "fixed_time_horizon", "aj_estimate") - .sort(["reference_group", "fixed_time_horizon"]) - ) - - -def _replace_gains_reference_data_times( - curve_list: dict, performance_data: pl.DataFrame -) -> dict: - """Replace time-dependent gains references with one AJ estimate per horizon.""" - aj_estimates = _get_gains_aj_estimates_times(performance_data) - references = [] - - for horizon in curve_list["fixed_time_horizons"]: - aj_horizon = aj_estimates.filter(pl.col("fixed_time_horizon") == horizon) - multiple_populations = _check_if_multiple_populations_are_being_validated_times( - aj_horizon - ) - references.append( - _create_reference_lines_data( - curve="gains", - aj_estimates_from_performance_data=aj_horizon, - multiple_populations=multiple_populations, - ).with_columns(pl.lit(horizon).alias("fixed_time_horizon")) - ) - - curve_list["reference_data"] = ( - pl.concat(references, how="vertical") if references else pl.DataFrame() - ) - return curve_list - - -def create_gains_curve( - probs: Dict[str, np.ndarray], - reals: Union[np.ndarray, Dict[str, np.ndarray]], - by: float = 0.01, - stratified_by: Sequence[str] = ["probability_threshold"], - size: int = 600, - color_values: List[str] = [ - "#1b9e77", - "#d95f02", - "#7570b3", - "#e7298a", - "#07004D", - "#E6AB02", - "#FE5F55", - "#54494B", - "#006E90", - "#BC96E6", - "#52050A", - "#1F271B", - "#BE7C4D", - "#63768D", - "#08A045", - "#320A28", - "#82FF9E", - "#2176FF", - "#D1603D", - "#585123", - ], - renderer: str = "plotly", -) -> Any: - """Creates a Gains curve. - - A Gains curve is a marketing and business analytics tool that evaluates - the performance of a predictive model. It shows the percentage of - positive outcomes (the "gain") that can be captured by targeting a - certain percentage of the population, sorted by predicted probability. - - Parameters - ---------- - probs : Dict[str, np.ndarray] - A dictionary mapping model or dataset names to 1-D numpy arrays of - predicted probabilities. - reals : Union[np.ndarray, Dict[str, np.ndarray]] - The true binary labels (0 or 1). - by : float, optional - The step size for the probability thresholds. Defaults to 0.01. - stratified_by : Sequence[str], optional - Variables for stratification. Defaults to ``["probability_threshold"]``. - size : int, optional - The width and height of the plot in pixels. Defaults to 600. - color_values : List[str], optional - A list of hex color strings for the plot lines. - renderer : {"plotly", "matplotlib", "browser", "rtichoke_viz"}, optional - Rendering backend. The default, ``"plotly"``, preserves the existing - return value and behavior. ``"matplotlib"`` requires the optional - Matplotlib dependency. ``"browser"`` and its ``"rtichoke_viz"`` alias - return an offline browser chart backed by the packaged TypeScript bundle. - - Returns - ------- - Figure or RtichokeBrowserChart - A Plotly or Matplotlib figure, or an offline browser chart, depending - on ``renderer``. - """ - selected_renderer = _validate_renderer(renderer) - if selected_renderer != "plotly": - performance_data = prepare_performance_data( - probs=probs, - reals=reals, - stratified_by=stratified_by, - by=by, - ) - evaluation_metadata = _build_evaluation_metadata(probs, reals, np.array([])) - spec = _gains_v2_spec_from_performance_data( - performance_data, evaluation_metadata - ) - return _render_gains_v2( - spec, - renderer=selected_renderer, - size=size, - color_values=color_values, - ) - - fig = _create_rtichoke_plotly_curve_binary( - probs, - reals, - by=by, - stratified_by=stratified_by, - size=size, - color_values=color_values, - curve="gains", - ) - return _apply_color_values_binary(fig, color_values) - - -def plot_gains_curve( - performance_data: pl.DataFrame, - stratified_by: Sequence[str] = ["probability_threshold"], - size: int = 600, -) -> Figure: - """Plots a Gains curve from pre-computed performance data. - - This function is useful for plotting a Gains curve directly from a - DataFrame that already contains the necessary performance metrics. - - Parameters - ---------- - performance_data : pl.DataFrame - A Polars DataFrame with performance metrics. It must include columns - for the percentage of the population targeted and the corresponding - gain, along with any stratification variables. - stratified_by : Sequence[str], optional - The columns in `performance_data` used for stratification. Defaults to - ``["probability_threshold"]``. - size : int, optional - The width and height of the plot in pixels. Defaults to 600. - - Returns - ------- - Figure - A Plotly ``Figure`` object representing the Gains curve. - """ - fig = _plot_rtichoke_curve_binary( - performance_data, - size=size, - curve="gains", - ) - return fig - - -def create_gains_curve_times( - probs: Dict[str, np.ndarray], - reals: Union[np.ndarray, Dict[str, np.ndarray]], - times: Union[np.ndarray, Dict[str, np.ndarray]], - fixed_time_horizons: list[float], - heuristics_sets: list[Dict] = [ - { - "censoring_heuristic": "adjusted", - "competing_heuristic": "adjusted_as_negative", - } - ], - by: float = 0.01, - stratified_by: Sequence[str] = ["probability_threshold"], - size: int = 600, - color_values: List[str] = [ - "#1b9e77", - "#d95f02", - "#7570b3", - "#e7298a", - "#07004D", - "#E6AB02", - "#FE5F55", - "#54494B", - "#006E90", - "#BC96E6", - "#52050A", - "#1F271B", - "#BE7C4D", - "#63768D", - "#08A045", - "#320A28", - "#82FF9E", - "#2176FF", - "#D1603D", - "#585123", - ], - renderer: str = "plotly", -) -> Any: - """Creates a time-dependent Gains curve. - - Generates a Gains curve for time-to-event models, which is evaluated at - specified time horizons and handles censored data and competing risks. - - Parameters - ---------- - probs : Dict[str, np.ndarray] - A dictionary of predicted probabilities. - reals : Union[np.ndarray, Dict[str, np.ndarray]] - The true event statuses. - times : Union[np.ndarray, Dict[str, np.ndarray]] - The event or censoring times. - fixed_time_horizons : list[float] - A list of time points for performance evaluation. - heuristics_sets : list[Dict], optional - Specifies how to handle censored data and competing events. - by : float, optional - The step size for probability thresholds. Defaults to 0.01. - stratified_by : Sequence[str], optional - Variables for stratification. Defaults to ``["probability_threshold"]``. - size : int, optional - The width and height of the plot in pixels. Defaults to 600. - color_values : List[str], optional - A list of hex color strings for the plot lines. - renderer : {"plotly", "matplotlib", "browser", "rtichoke_viz"}, optional - Rendering backend. Plotly remains the default production behavior. - - Returns - ------- - Figure or RtichokeBrowserChart - A Plotly or Matplotlib figure, or an offline browser chart, depending - on ``renderer``. - """ - selected_renderer = _validate_renderer(renderer) - if selected_renderer != "plotly": - from rtichoke.performance_data.performance_data_times import ( - prepare_performance_data_times, - ) - - performance_data = prepare_performance_data_times( - probs, - reals, - times, - fixed_time_horizons=fixed_time_horizons, - heuristics_sets=heuristics_sets, - by=by, - stratified_by=stratified_by, - ) - evaluation_metadata = _build_evaluation_metadata(probs, reals, times) - spec = _gains_times_v2_spec_from_performance_data( - performance_data, evaluation_metadata - ) - return _render_gains_v2( - spec, - renderer=selected_renderer, - size=size, - color_values=color_values, - ) - - return _create_rtichoke_plotly_curve_times_reference_safe( - probs, - reals, - times, - fixed_time_horizons=fixed_time_horizons, - heuristics_sets=heuristics_sets, - by=by, - stratified_by=stratified_by, - size=size, - color_values=color_values, - curve="gains", - ) - +""" +A module for Gains Curves using Plotly helpers +""" + +from typing import Any, Dict, List, Sequence, Union +from plotly.graph_objs._figure import Figure +from rtichoke.processing.binary_color_values import _apply_color_values_binary +from rtichoke.processing.plotly_helper_functions import ( + _create_rtichoke_plotly_curve_binary, + _plot_rtichoke_curve_binary, + _create_reference_lines_data, + _check_if_multiple_populations_are_being_validated_times, +) +from rtichoke.processing.time_reference_lines import ( + _create_rtichoke_plotly_curve_times_reference_safe, +) +import numpy as np +import polars as pl +from rtichoke._renderers import _render_gains_v2, _validate_renderer +from rtichoke._viz_spec_v2 import ( + _gains_times_v2_spec_from_performance_data, + _gains_v2_spec_from_performance_data, +) +from rtichoke.performance_data.performance_data import prepare_performance_data +from rtichoke.processing.evaluation_semantics import _build_evaluation_metadata + + +def _get_gains_aj_estimates_times(performance_data: pl.DataFrame) -> pl.DataFrame: + """Return one horizon-specific event estimate per reference group. + + For a gains reference curve the required event probability is the overall + event probability at the horizon. At probability threshold 0 everyone is + classified positive, so ``real_positives / n`` gives that quantity without + mixing in the cutoff-specific estimate at threshold 1. + """ + return ( + performance_data.filter(pl.col("chosen_cutoff") == 0) + .select("reference_group", "fixed_time_horizon", "real_positives", "n") + .unique() + .with_columns((pl.col("real_positives") / pl.col("n")).alias("aj_estimate")) + .select("reference_group", "fixed_time_horizon", "aj_estimate") + .sort(["reference_group", "fixed_time_horizon"]) + ) + + +def _replace_gains_reference_data_times( + curve_list: dict, performance_data: pl.DataFrame +) -> dict: + """Replace time-dependent gains references with one AJ estimate per horizon.""" + aj_estimates = _get_gains_aj_estimates_times(performance_data) + references = [] + + for horizon in curve_list["fixed_time_horizons"]: + aj_horizon = aj_estimates.filter(pl.col("fixed_time_horizon") == horizon) + multiple_populations = _check_if_multiple_populations_are_being_validated_times( + aj_horizon + ) + references.append( + _create_reference_lines_data( + curve="gains", + aj_estimates_from_performance_data=aj_horizon, + multiple_populations=multiple_populations, + ).with_columns(pl.lit(horizon).alias("fixed_time_horizon")) + ) + + curve_list["reference_data"] = ( + pl.concat(references, how="vertical") if references else pl.DataFrame() + ) + return curve_list + + +def create_gains_curve( + probs: Dict[str, np.ndarray], + reals: Union[np.ndarray, Dict[str, np.ndarray]], + by: float = 0.01, + stratified_by: Sequence[str] = ["probability_threshold"], + size: int = 600, + color_values: List[str] = [ + "#1b9e77", + "#d95f02", + "#7570b3", + "#e7298a", + "#07004D", + "#E6AB02", + "#FE5F55", + "#54494B", + "#006E90", + "#BC96E6", + "#52050A", + "#1F271B", + "#BE7C4D", + "#63768D", + "#08A045", + "#320A28", + "#82FF9E", + "#2176FF", + "#D1603D", + "#585123", + ], + renderer: str = "plotly", +) -> Any: + """Creates a Gains curve. + + A Gains curve is a marketing and business analytics tool that evaluates + the performance of a predictive model. It shows the percentage of + positive outcomes (the "gain") that can be captured by targeting a + certain percentage of the population, sorted by predicted probability. + + Parameters + ---------- + probs : Dict[str, np.ndarray] + A dictionary mapping model or dataset names to 1-D numpy arrays of + predicted probabilities. + reals : Union[np.ndarray, Dict[str, np.ndarray]] + The true binary labels (0 or 1). + by : float, optional + The step size for the probability thresholds. Defaults to 0.01. + stratified_by : Sequence[str], optional + Variables for stratification. Defaults to ``["probability_threshold"]``. + size : int, optional + The width and height of the plot in pixels. Defaults to 600. + color_values : List[str], optional + A list of hex color strings for the plot lines. + renderer : {"plotly", "matplotlib", "browser", "rtichoke_viz"}, optional + Rendering backend. The default, ``"plotly"``, preserves the existing + return value and behavior. ``"matplotlib"`` requires the optional + Matplotlib dependency. ``"browser"`` and its ``"rtichoke_viz"`` alias + return an offline browser chart backed by the packaged TypeScript bundle. + + Returns + ------- + Figure or RtichokeBrowserChart + A Plotly or Matplotlib figure, or an offline browser chart, depending + on ``renderer``. + """ + selected_renderer = _validate_renderer(renderer) + if selected_renderer != "plotly": + performance_data = prepare_performance_data( + probs=probs, + reals=reals, + stratified_by=stratified_by, + by=by, + ) + evaluation_metadata = _build_evaluation_metadata(probs, reals, np.array([])) + spec = _gains_v2_spec_from_performance_data( + performance_data, evaluation_metadata + ) + return _render_gains_v2( + spec, + renderer=selected_renderer, + size=size, + color_values=color_values, + ) + + fig = _create_rtichoke_plotly_curve_binary( + probs, + reals, + by=by, + stratified_by=stratified_by, + size=size, + color_values=color_values, + curve="gains", + ) + return _apply_color_values_binary(fig, color_values) + + +def plot_gains_curve( + performance_data: pl.DataFrame, + stratified_by: Sequence[str] = ["probability_threshold"], + size: int = 600, +) -> Figure: + """Plots a Gains curve from pre-computed performance data. + + This function is useful for plotting a Gains curve directly from a + DataFrame that already contains the necessary performance metrics. + + Parameters + ---------- + performance_data : pl.DataFrame + A Polars DataFrame with performance metrics. It must include columns + for the percentage of the population targeted and the corresponding + gain, along with any stratification variables. + stratified_by : Sequence[str], optional + The columns in `performance_data` used for stratification. Defaults to + ``["probability_threshold"]``. + size : int, optional + The width and height of the plot in pixels. Defaults to 600. + + Returns + ------- + Figure + A Plotly ``Figure`` object representing the Gains curve. + """ + fig = _plot_rtichoke_curve_binary( + performance_data, + size=size, + curve="gains", + ) + return fig + + +def create_gains_curve_times( + probs: Dict[str, np.ndarray], + reals: Union[np.ndarray, Dict[str, np.ndarray]], + times: Union[np.ndarray, Dict[str, np.ndarray]], + fixed_time_horizons: list[float], + heuristics_sets: list[Dict] = [ + { + "censoring_heuristic": "adjusted", + "competing_heuristic": "adjusted_as_negative", + } + ], + by: float = 0.01, + stratified_by: Sequence[str] = ["probability_threshold"], + size: int = 600, + color_values: List[str] = [ + "#1b9e77", + "#d95f02", + "#7570b3", + "#e7298a", + "#07004D", + "#E6AB02", + "#FE5F55", + "#54494B", + "#006E90", + "#BC96E6", + "#52050A", + "#1F271B", + "#BE7C4D", + "#63768D", + "#08A045", + "#320A28", + "#82FF9E", + "#2176FF", + "#D1603D", + "#585123", + ], + renderer: str = "plotly", +) -> Any: + """Creates a time-dependent Gains curve. + + Generates a Gains curve for time-to-event models, which is evaluated at + specified time horizons and handles censored data and competing risks. + + Parameters + ---------- + probs : Dict[str, np.ndarray] + A dictionary of predicted probabilities. + reals : Union[np.ndarray, Dict[str, np.ndarray]] + The true event statuses. + times : Union[np.ndarray, Dict[str, np.ndarray]] + The event or censoring times. + fixed_time_horizons : list[float] + A list of time points for performance evaluation. + heuristics_sets : list[Dict], optional + Specifies how to handle censored data and competing events. + by : float, optional + The step size for probability thresholds. Defaults to 0.01. + stratified_by : Sequence[str], optional + Variables for stratification. Defaults to ``["probability_threshold"]``. + size : int, optional + The width and height of the plot in pixels. Defaults to 600. + color_values : List[str], optional + A list of hex color strings for the plot lines. + renderer : {"plotly", "matplotlib", "browser", "rtichoke_viz"}, optional + Rendering backend. Plotly remains the default production behavior. + + Returns + ------- + Figure or RtichokeBrowserChart + A Plotly or Matplotlib figure, or an offline browser chart, depending + on ``renderer``. + """ + selected_renderer = _validate_renderer(renderer) + if selected_renderer != "plotly": + from rtichoke.performance_data.performance_data_times import ( + prepare_performance_data_times, + ) + + performance_data = prepare_performance_data_times( + probs, + reals, + times, + fixed_time_horizons=fixed_time_horizons, + heuristics_sets=heuristics_sets, + by=by, + stratified_by=stratified_by, + ) + evaluation_metadata = _build_evaluation_metadata(probs, reals, times) + spec = _gains_times_v2_spec_from_performance_data( + performance_data, evaluation_metadata + ) + return _render_gains_v2( + spec, + renderer=selected_renderer, + size=size, + color_values=color_values, + ) + + return _create_rtichoke_plotly_curve_times_reference_safe( + probs, + reals, + times, + fixed_time_horizons=fixed_time_horizons, + heuristics_sets=heuristics_sets, + by=by, + stratified_by=stratified_by, + size=size, + color_values=color_values, + curve="gains", + ) From 07c270139959c117b2ae4aa4fd61e29e11036e79 Mon Sep 17 00:00:00 2001 From: Uriah Finkel Date: Sun, 23 Aug 2026 07:27:29 +0300 Subject: [PATCH 08/10] Normalize committed test content --- tests/test_time_gains_v2.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_time_gains_v2.py b/tests/test_time_gains_v2.py index 21c37c17..3d01c8bd 100644 --- a/tests/test_time_gains_v2.py +++ b/tests/test_time_gains_v2.py @@ -164,4 +164,3 @@ def test_time_gains_renderers_preserve_plotly_default_and_horizons(tmp_path: Pat "Fixed Time Horizon: 5", "Fixed Time Horizon: 10", ] - From 93b3d2055a3b75a2436c1cb34d06e51a27f8ca1a Mon Sep 17 00:00:00 2001 From: Uriah Finkel Date: Sun, 23 Aug 2026 09:02:28 +0300 Subject: [PATCH 09/10] Vendor rtichoke-viz v0.3.1 --- .../_vendor/rtichoke_viz/VENDORED_FROM | 9 +- .../rtichoke_viz/rtichoke-viz-0.3.0.tar.gz | Bin 148642 -> 0 bytes .../rtichoke_viz/rtichoke-viz-0.3.1.tar.gz | Bin 0 -> 150607 bytes .../_vendor/rtichoke_viz/rtichoke-viz.js | 536 +++++++++++++----- tests/test_rtichoke_viz_vendor.py | 31 +- 5 files changed, 431 insertions(+), 145 deletions(-) delete mode 100644 src/rtichoke/_vendor/rtichoke_viz/rtichoke-viz-0.3.0.tar.gz create mode 100644 src/rtichoke/_vendor/rtichoke_viz/rtichoke-viz-0.3.1.tar.gz diff --git a/src/rtichoke/_vendor/rtichoke_viz/VENDORED_FROM b/src/rtichoke/_vendor/rtichoke_viz/VENDORED_FROM index df5ec55d..7f2d8c53 100644 --- a/src/rtichoke/_vendor/rtichoke_viz/VENDORED_FROM +++ b/src/rtichoke/_vendor/rtichoke_viz/VENDORED_FROM @@ -1,5 +1,6 @@ repository=https://github.com/uriahf/rtichoke_viz -release=v0.3.0 -source_commit=aca9188ea856167557efb20980a0b43e0481b8c8 -archive=rtichoke-viz-0.3.0.tar.gz -sha256=558f8d9e16f9544659b84e33f72511065163291a1b97a3c5511b61d1e1f0cac1 +release=v0.3.1 +source_commit=5ccde928a0bf9fa6ece2b7572687b442c57a98a9 +archive=rtichoke-viz-0.3.1.tar.gz +sha256=121aa8eb8d0f8427ecfb2c01dab0fb05668eaedf47ddcfc0cd282a7ecf1ce448 + diff --git a/src/rtichoke/_vendor/rtichoke_viz/rtichoke-viz-0.3.0.tar.gz b/src/rtichoke/_vendor/rtichoke_viz/rtichoke-viz-0.3.0.tar.gz deleted file mode 100644 index 4962a38637e9a70995190042d2f204c7545cc72f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148642 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 z 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 z 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%0A$-vNlV>4D+hmAF8<`*EblM<%h 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
mh=MuBO(YT`Y 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 `group-${index2 + 1}` + ) : [...groupsOrCount]; + const theme = mergeTheme(options); + if (!Number.isFinite(theme.width) || theme.width <= 0 || !Number.isFinite(theme.height) || theme.height <= 0) + throw new Error( + "Renderer width and height must be positive finite numbers" + ); + if (!Number.isInteger(theme.tip.digits) || theme.tip.digits < 0 || theme.tip.digits > 20) + throw new Error("Renderer tip digits must be an integer between 0 and 20"); + const colors = groups2.length <= 1 ? ["#000000"] : [...theme.colors]; + if (colors.length < groups2.length) + throw new Error( + "Renderer colors must contain at least one color per display group" + ); + const assigned = colors.slice(0, Math.max(groups2.length, 1)); + return { + theme: { ...theme, colors: assigned }, + groups: groups2, + colors: assigned, + colorByGroup: new Map( + groups2.map((group2, index2) => [group2, assigned[index2]]) + ), + showLegend: groups2.length > 1 + }; } function displayBySeries(spec) { return new Map(spec.series.map((series) => [series.id, series.display])); } +function displayGroups(spec) { + return [...new Set(spec.series.map((series) => series.display.group))]; +} function seriesRenderData(spec, data) { const displays = displayBySeries(spec); return data.map((datum2) => ({ @@ -18666,137 +18725,356 @@ function seriesRenderData(spec, data) { label: displays.get(datum2.seriesId).label })); } -function referenceMarks(spec) { +function tooltip(digits, fields) { + return fields.filter(([, value]) => value !== void 0).map( + ([label, value]) => `${label}: ${typeof value === "number" ? value.toFixed(digits) : String(value)}` + ).join("\n"); +} +function basePlotOptions(resolved, spec) { + const { theme } = resolved; + const labelByGroup = new Map( + spec.series.map((series) => [series.display.group, series.display.label]) + ); + return { + width: theme.width, + height: theme.height, + marginTop: theme.margins.top, + marginRight: theme.margins.right, + marginBottom: theme.margins.bottom, + marginLeft: theme.margins.left, + style: { + background: theme.background, + color: theme.axis.color, + fontFamily: theme.typography.fontFamily, + fontSize: `${theme.typography.fontSize}px` + }, + color: { + legend: resolved.showLegend, + domain: resolved.groups, + range: resolved.colors, + tickFormat: (group2) => labelByGroup.get(group2) ?? group2 + } + }; +} +function axisOptions2(theme, label, domain) { + return { + label, + domain, + grid: false, + line: true, + ticks: theme.axis.ticks, + tickSize: theme.axis.tickSize, + tickPadding: theme.axis.tickPadding, + tickFormat: theme.axis.numberFormat + }; +} +function frameMark(theme) { + return frame2({ + stroke: theme.frame.color, + strokeWidth: theme.frame.width + }); +} +function referenceMarks(spec, theme) { + const style = { + stroke: theme.reference.color, + strokeWidth: theme.reference.width, + strokeDasharray: theme.reference.dash + }; const marks2 = []; for (const reference of spec.references ?? []) { - if (reference.type === "identity") { - marks2.push(line([{ x: 0, y: 0 }, { x: 1, y: 1 }], { - x: "x", - y: "y", - stroke: "#BEBEBE", - strokeWidth: 2, - strokeDasharray: "4,4" - })); - } else if (reference.type === "path" && reference.points) { - marks2.push(line(reference.points, { - x: "x", - y: "y", - stroke: "#BEBEBE", - strokeWidth: 2, - strokeDasharray: "4,4" - })); - } + if (reference.type === "identity") + marks2.push( + line( + [ + { x: 0, y: 0 }, + { x: 1, y: 1 } + ], + { x: "x", y: "y", ...style, title: reference.label } + ) + ); + else if (reference.type === "horizontal" && reference.value !== void 0) + marks2.push( + ruleY([reference.value], { ...style, title: reference.label }) + ); + else if (reference.type === "path" && reference.points) + marks2.push( + line(reference.points, { + x: "x", + y: "y", + ...style, + title: reference.label + }) + ); } return marks2; } -function renderRocV2(spec) { - assertV2ReferentialIntegrity(spec); - const groups2 = [...new Set(spec.series.map((series) => series.display.group))]; - const showLegend = groups2.length > 1; - const data = seriesRenderData(spec, spec.data).map((datum2) => ({ ...datum2, false_positive_rate: 1 - datum2.specificity })); - const marks2 = []; - if (spec.references?.some((reference) => reference.type === "identity")) { - marks2.push(line([{ x: 0, y: 0 }, { x: 1, y: 1 }], { x: "x", y: "y", stroke: "#BEBEBE", strokeWidth: 2 })); +function finishMarks(marks2, theme) { + marks2.push(frameMark(theme)); + return marks2; +} +function themedPlot(options, theme) { + const plot2 = plot(options); + for (const label of plot2.querySelectorAll( + '[aria-label$="axis label"] text' + )) { + label.style.fontSize = `${theme.typography.axisTitleSize}px`; + label.style.fontWeight = String(theme.typography.axisTitleWeight); } - marks2.push(line(data, { x: "false_positive_rate", y: "sensitivity", z: "seriesId", stroke: "group", strokeWidth: 2, tip: true })); - return plot({ - width: 600, - height: 600, - marginLeft: 64, - marginBottom: 56, - style: BASE_STYLE2, - x: { label: spec.xAxis.label, domain: spec.xAxis.domain, grid: false, ticks: 6 }, - y: { label: spec.yAxis.label, domain: spec.yAxis.domain, grid: false, ticks: 6 }, - color: { legend: showLegend, range: showLegend ? RTICHOKE_COLORS3 : ["#000000"] }, - marks: marks2 - }); + for (const frame3 of plot2.querySelectorAll( + '[aria-label="frame"]' + )) { + frame3.setAttribute("stroke", theme.frame.color); + } + if (plot2 instanceof HTMLElement) { + plot2.style.fontSize = `${theme.typography.legendSize}px`; + for (const swatch of plot2.querySelectorAll( + 'svg[width="15"]' + )) { + swatch.setAttribute("width", String(theme.legend.swatchWidth)); + } + } + return plot2; } -function renderCalibrationV2(spec) { +function renderRocV2(spec, options = {}) { assertV2ReferentialIntegrity(spec); - const groups2 = [...new Set(spec.series.map((series) => series.display.group))]; - const showLegend = groups2.length > 1; - const colorRange = showLegend ? RTICHOKE_COLORS3 : ["#000000"]; - const data = seriesRenderData(spec, spec.data); - const marks2 = []; - if (spec.references?.some((reference) => reference.type === "identity")) { - marks2.push(line([{ x: 0, y: 0 }, { x: 1, y: 1 }], { x: "x", y: "y", stroke: "#BEBEBE", strokeWidth: 2, strokeDasharray: "4,4" })); - } - marks2.push(line(data, { x: "predicted", y: "observed", z: "seriesId", stroke: "group", strokeWidth: 2, tip: true })); + const resolved = resolveV2RenderOptions(displayGroups(spec), options); + const { theme } = resolved; + const data = seriesRenderData(spec, spec.data).map((datum2) => ({ + ...datum2, + false_positive_rate: 1 - datum2.specificity, + title: tooltip(theme.tip.digits, [ + ["Model", datum2.label], + ["Cutoff", datum2.cutoff], + ["Sensitivity", datum2.sensitivity], + ["Specificity", datum2.specificity] + ]) + })); + const marks2 = referenceMarks(spec, theme); + marks2.push( + line(data, { + x: "false_positive_rate", + y: "sensitivity", + z: "seriesId", + stroke: "group", + strokeWidth: theme.line.width, + strokeDasharray: theme.line.dash ?? void 0, + title: "title", + tip: true + }) + ); + return themedPlot( + { + ...basePlotOptions(resolved, spec), + x: axisOptions2(theme, spec.xAxis.label, spec.xAxis.domain), + y: axisOptions2(theme, spec.yAxis.label, spec.yAxis.domain), + marks: finishMarks(marks2, theme) + }, + theme + ); +} +function renderCalibrationV2(spec, options = {}) { + assertV2ReferentialIntegrity(spec); + const resolved = resolveV2RenderOptions(displayGroups(spec), options); + const { theme } = resolved; + const data = seriesRenderData(spec, spec.data).map((datum2) => ({ + ...datum2, + title: tooltip(theme.tip.digits, [ + ["Model", datum2.label], + ["Predicted", datum2.predicted], + ["Observed", datum2.observed], + ["Events", datum2.events], + ["Total", datum2.total] + ]) + })); + const marks2 = referenceMarks(spec, theme); + marks2.push( + line(data, { + x: "predicted", + y: "observed", + z: "seriesId", + stroke: "group", + strokeWidth: theme.line.width, + strokeDasharray: theme.line.dash ?? void 0, + title: "title", + tip: true + }) + ); const discrete = data.filter((datum2) => datum2.method === "discrete"); - if (discrete.length > 0) marks2.push(dot(discrete, { x: "predicted", y: "observed", fill: "group", stroke: "white", strokeWidth: 1.5, r: 5, tip: true })); + if (discrete.length > 0) + marks2.push( + dot(discrete, { + x: "predicted", + y: "observed", + fill: theme.marker.fill ?? "group", + stroke: theme.marker.stroke, + strokeWidth: theme.marker.strokeWidth, + r: theme.marker.radius, + title: "title", + tip: true + }) + ); const hasDistribution = (spec.distribution?.length ?? 0) > 0; - const calibration = plot({ - width: 600, - height: hasDistribution ? 480 : 600, - marginLeft: 64, - marginBottom: hasDistribution ? 16 : 56, - style: BASE_STYLE2, - x: { label: hasDistribution ? null : spec.xAxis.label, domain: spec.xAxis.domain, grid: false, ticks: 6, axis: hasDistribution ? null : "bottom" }, - y: { label: spec.yAxis.label, domain: spec.yAxis.domain, grid: false, ticks: 6 }, - color: { legend: showLegend, range: colorRange }, - marks: marks2 - }); + const mainHeight = hasDistribution ? Math.round(theme.height * 0.8) : theme.height; + const calibration = themedPlot( + { + ...basePlotOptions(resolved, spec), + height: mainHeight, + marginBottom: hasDistribution ? 8 : theme.margins.bottom, + x: hasDistribution ? { + ...axisOptions2(theme, spec.xAxis.label, spec.xAxis.domain), + axis: null, + label: null + } : axisOptions2(theme, spec.xAxis.label, spec.xAxis.domain), + y: axisOptions2(theme, spec.yAxis.label, spec.yAxis.domain), + marks: finishMarks(marks2, theme) + }, + theme + ); if (!hasDistribution || !spec.distribution) return calibration; - const distribution = seriesRenderData(spec, spec.distribution); - const histogram = plot({ - width: 600, - height: 120, - marginLeft: 64, - marginTop: 0, - marginBottom: 48, - style: BASE_STYLE2, - x: { label: spec.xAxis.label, domain: spec.xAxis.domain, grid: false, ticks: 6 }, - y: { label: null, grid: false, ticks: 3 }, - color: { legend: false, range: colorRange }, - marks: [rectY(distribution, { x1: (datum2) => datum2.midpoint - datum2.binWidth / 2, x2: (datum2) => datum2.midpoint + datum2.binWidth / 2, y: "count", fill: "group", fillOpacity: 1 / Math.max(groups2.length, 1), tip: true })] - }); + const distribution = seriesRenderData(spec, spec.distribution).map( + (datum2) => ({ + ...datum2, + title: tooltip(theme.tip.digits, [ + ["Model", datum2.label], + ["Midpoint", datum2.midpoint], + ["Count", datum2.count] + ]) + }) + ); + const histogram = themedPlot( + { + ...basePlotOptions(resolved, spec), + height: theme.height - mainHeight, + marginTop: 0, + marginBottom: theme.margins.bottom, + x: axisOptions2(theme, spec.xAxis.label, spec.xAxis.domain), + y: { + label: null, + grid: false, + ticks: 3, + tickSize: theme.axis.tickSize, + tickPadding: theme.axis.tickPadding + }, + color: { legend: false, domain: resolved.groups, range: resolved.colors }, + marks: finishMarks( + [ + rectY(distribution, { + x1: (datum2) => datum2.midpoint - datum2.binWidth / 2, + x2: (datum2) => datum2.midpoint + datum2.binWidth / 2, + y: "count", + fill: "group", + fillOpacity: 1 / Math.max(resolved.groups.length, 1), + title: "title", + tip: true + }) + ], + theme + ) + }, + theme + ); const container = document.createElement("div"); - container.style.width = "600px"; + container.className = "rtichoke-calibration"; + container.style.width = `${theme.width}px`; container.style.maxWidth = "100%"; container.append(calibration, histogram); return container; } -function renderPrecisionRecallV2(spec) { +function renderLineChart(spec, options, x2, y2) { assertV2ReferentialIntegrity(spec); - const groups2 = [...new Set(spec.series.map((series) => series.display.group))]; - const showLegend = groups2.length > 1; - const data = seriesRenderData(spec, spec.data); - const marks2 = []; - for (const reference of spec.references ?? []) if (reference.type === "horizontal" && reference.value !== void 0) marks2.push(ruleY([reference.value], { stroke: "#BEBEBE", strokeWidth: 2, strokeDasharray: "4,4" })); - marks2.push(line(data, { x: "sensitivity", y: "ppv", z: "seriesId", stroke: "group", strokeWidth: 2, tip: true })); - marks2.push(dot(data, { x: "sensitivity", y: "ppv", fill: "group", stroke: "white", strokeWidth: 1.5, r: 4, tip: true })); - return plot({ - width: 600, - height: 600, - marginLeft: 64, - marginBottom: 56, - style: BASE_STYLE2, - x: { label: spec.xAxis.label, domain: spec.xAxis.domain, grid: false, ticks: 6 }, - y: { label: spec.yAxis.label, domain: spec.yAxis.domain, grid: false, ticks: 6 }, - color: { legend: showLegend, domain: groups2, range: showLegend ? RTICHOKE_COLORS3 : ["#000000"] }, - marks: marks2 + const resolved = resolveV2RenderOptions(displayGroups(spec), options); + const { theme } = resolved; + const data = seriesRenderData( + spec, + spec.data + ).map((datum2) => { + const values2 = datum2; + return { + ...datum2, + title: tooltip(theme.tip.digits, [ + ["Model", datum2.label], + ["Cutoff", values2.cutoff], + [x2 === "ppcr" ? "PPCR" : "Sensitivity", values2[x2]], + [y2 === "ppv" ? "PPV" : "Sensitivity", values2[y2]] + ]) + }; }); + const marks2 = referenceMarks(spec, theme); + marks2.push( + line(data, { + x: x2, + y: y2, + z: "seriesId", + stroke: "group", + strokeWidth: theme.line.width, + strokeDasharray: theme.line.dash ?? void 0, + title: "title", + tip: true + }) + ); + return themedPlot( + { + ...basePlotOptions(resolved, spec), + x: axisOptions2(theme, spec.xAxis.label, spec.xAxis.domain), + y: axisOptions2(theme, spec.yAxis.label, spec.yAxis.domain), + marks: finishMarks(marks2, theme) + }, + theme + ); +} +function horizons(spec) { + return [ + ...new Set( + spec.series.map((series) => series.horizon).filter((horizon) => horizon !== void 0) + ) + ]; +} +function selectHorizonSpec(spec, horizon) { + const series = spec.series.filter( + (item) => item.horizon === void 0 || item.horizon === horizon + ); + const seriesIds = new Set(series.map((item) => item.id)); + return { + ...spec, + series, + data: spec.data.filter((datum2) => seriesIds.has(datum2.seriesId)), + references: spec.references?.filter( + (reference) => reference.scope !== "population_horizon" || reference.horizon === horizon + ) + }; +} +function renderHorizonLineChart(spec, options, x2, y2) { + const availableHorizons = horizons(spec); + if (availableHorizons.length <= 1) return renderLineChart(spec, options, x2, y2); + const container = document.createElement("div"); + container.className = "rtichoke-horizon-chart"; + const control = document.createElement("label"); + control.textContent = "Fixed Time Horizon: "; + const select = document.createElement("select"); + select.setAttribute("aria-label", "Fixed Time Horizon"); + for (const horizon of availableHorizons) { + const option = document.createElement("option"); + option.value = String(horizon); + option.textContent = String(horizon); + select.append(option); + } + control.append(select); + const chart = document.createElement("div"); + const draw = (horizon) => { + chart.replaceChildren( + renderLineChart(selectHorizonSpec(spec, horizon), options, x2, y2) + ); + }; + select.addEventListener("change", () => draw(Number(select.value))); + container.append(control, chart); + draw(availableHorizons[0]); + return container; +} +function renderPrecisionRecallV2(spec, options = {}) { + return renderLineChart(spec, options, "sensitivity", "ppv"); } function renderGainsV2(spec, options = {}) { - assertV2ReferentialIntegrity(spec); - const groups2 = [...new Set(spec.series.map((series) => series.display.group))]; - const showLegend = groups2.length > 1; - const resolved = resolveV2RenderOptions(groups2.length, options); - const data = seriesRenderData(spec, spec.data); - const marks2 = referenceMarks(spec); - marks2.push(line(data, { x: "ppcr", y: "sensitivity", z: "seriesId", stroke: "group", strokeWidth: 2, tip: true })); - marks2.push(dot(data, { x: "ppcr", y: "sensitivity", fill: "group", stroke: "white", strokeWidth: 1.5, r: 4, tip: true })); - return plot({ - width: resolved.width, - height: resolved.height, - marginLeft: 64, - marginBottom: 56, - style: BASE_STYLE2, - x: { label: spec.xAxis.label, domain: spec.xAxis.domain, grid: false, ticks: 6 }, - y: { label: spec.yAxis.label, domain: spec.yAxis.domain, grid: false, ticks: 6 }, - color: { legend: showLegend, domain: groups2, range: resolved.colors }, - marks: marks2 - }); + return renderHorizonLineChart(spec, options, "ppcr", "sensitivity"); } export { CalibrationSpecSchema, @@ -18806,6 +19084,8 @@ export { EvaluationSpecSchema, GainsV2SpecSchema, PrecisionRecallV2SpecSchema, + RTICHOKE_BROWSER_THEME, + RTICHOKE_COLORS3 as RTICHOKE_COLORS, ReferenceLineV2SpecSchema, RocSpecSchema, RocV2SpecSchema, @@ -18821,8 +19101,10 @@ export { renderPrecisionRecallV2, renderRoc, renderRocV2, + resolveV2RenderOptions, rocSpecFromRtichokePython, rocSpecFromRtichokeR, rocV2SpecFromRtichokePython, rocV2SpecFromRtichokeR }; + diff --git a/tests/test_rtichoke_viz_vendor.py b/tests/test_rtichoke_viz_vendor.py index aa069e3c..6a76ef9e 100644 --- a/tests/test_rtichoke_viz_vendor.py +++ b/tests/test_rtichoke_viz_vendor.py @@ -6,28 +6,28 @@ _VENDOR = Path(__file__).parents[1] / "src" / "rtichoke" / "_vendor" / "rtichoke_viz" -def test_vendored_rtichoke_viz_v030_provenance_archive_and_schemas(): +def test_vendored_rtichoke_viz_v031_provenance_archive_and_schemas(): provenance = (_VENDOR / "VENDORED_FROM").read_text() - assert "release=v0.3.0" in provenance - assert "source_commit=aca9188ea856167557efb20980a0b43e0481b8c8" in provenance - assert "archive=rtichoke-viz-0.3.0.tar.gz" in provenance + assert "release=v0.3.1" in provenance + assert "source_commit=5ccde928a0bf9fa6ece2b7572687b442c57a98a9" in provenance + assert "archive=rtichoke-viz-0.3.1.tar.gz" in provenance assert ( - "sha256=558f8d9e16f9544659b84e33f72511065163291a1b97a3c5511b61d1e1f0cac1" + "sha256=121aa8eb8d0f8427ecfb2c01dab0fb05668eaedf47ddcfc0cd282a7ecf1ce448" in provenance ) - archive = _VENDOR / "rtichoke-viz-0.3.0.tar.gz" + archive = _VENDOR / "rtichoke-viz-0.3.1.tar.gz" assert hashlib.sha256(archive.read_bytes()).hexdigest() == ( - "558f8d9e16f9544659b84e33f72511065163291a1b97a3c5511b61d1e1f0cac1" + "121aa8eb8d0f8427ecfb2c01dab0fb05668eaedf47ddcfc0cd282a7ecf1ce448" ) with tarfile.open(archive, "r:gz") as release: assert set(release.getnames()) == { - "rtichoke-viz-0.3.0", - "rtichoke-viz-0.3.0/MANIFEST", - "rtichoke-viz-0.3.0/rtichoke-viz.css", - "rtichoke-viz-0.3.0/rtichoke-viz.js", - "rtichoke-viz-0.3.0/rtichoke-viz.schema.json", - "rtichoke-viz-0.3.0/rtichoke-viz-v2.schema.json", + "rtichoke-viz-0.3.1", + "rtichoke-viz-0.3.1/MANIFEST", + "rtichoke-viz-0.3.1/rtichoke-viz.css", + "rtichoke-viz-0.3.1/rtichoke-viz.js", + "rtichoke-viz-0.3.1/rtichoke-viz.schema.json", + "rtichoke-viz-0.3.1/rtichoke-viz-v2.schema.json", } assert (_VENDOR / "rtichoke-viz.js").stat().st_size > 0 @@ -39,7 +39,7 @@ def test_vendored_rtichoke_viz_v030_provenance_archive_and_schemas(): assert '"$id": "https://rtichoke.dev/schema/viz/2.0.json"' in v2_schema -def test_v030_bundle_keeps_v1_and_adds_v2_browser_exports(): +def test_v031_bundle_keeps_v1_adds_v2_exports_and_time_horizon_control(): bundle = (_VENDOR / "rtichoke-viz.js").read_text(encoding="utf-8") for export_name in ( "renderRoc", @@ -49,3 +49,6 @@ def test_v030_bundle_keeps_v1_and_adds_v2_browser_exports(): "RtichokeChartSpecV2Schema", ): assert export_name in bundle + + assert "Fixed Time Horizon" in bundle + From 836456ec87698c69bacb8fa12e57a979bba7e660 Mon Sep 17 00:00:00 2001 From: Uriah Finkel Date: Sun, 23 Aug 2026 09:04:41 +0300 Subject: [PATCH 10/10] Normalize vendor test formatting --- tests/test_rtichoke_viz_vendor.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_rtichoke_viz_vendor.py b/tests/test_rtichoke_viz_vendor.py index 6a76ef9e..2e6618de 100644 --- a/tests/test_rtichoke_viz_vendor.py +++ b/tests/test_rtichoke_viz_vendor.py @@ -51,4 +51,3 @@ def test_v031_bundle_keeps_v1_adds_v2_exports_and_time_horizon_control(): assert export_name in bundle assert "Fixed Time Horizon" in bundle -