From b2318a0bc6d469370fa1cd3373f70f6aafaeb682 Mon Sep 17 00:00:00 2001 From: Uriah Finkel Date: Mon, 15 Dec 2025 10:46:10 +0200 Subject: [PATCH 1/2] chore: close #243 --- .../helpers/sandbox_observable_helpers.py | 148 +++++++++--------- 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/src/rtichoke/helpers/sandbox_observable_helpers.py b/src/rtichoke/helpers/sandbox_observable_helpers.py index 9bd7499..d3cc352 100644 --- a/src/rtichoke/helpers/sandbox_observable_helpers.py +++ b/src/rtichoke/helpers/sandbox_observable_helpers.py @@ -1,4 +1,4 @@ -from lifelines import AalenJohansenFitter +# from lifelines import AalenJohansenFitter import pandas as pd import numpy as np import polars as pl @@ -15,93 +15,93 @@ def _enum_dataframe(column_name: str, values: Sequence[str]) -> pl.DataFrame: return pl.DataFrame({column_name: pl.Series(values, dtype=enum_dtype)}) -def extract_aj_estimate(data_to_adjust, fixed_time_horizons): - """ - Python implementation of the R extract_aj_estimate function for Aalen-Johansen estimation. - - Parameters: - data_to_adjust (pd.DataFrame): DataFrame containing survival data - fixed_time_horizons (list or float): Time points at which to evaluate the survival - - Returns: - pd.DataFrame: DataFrame with Aalen-Johansen estimates - """ +# def extract_aj_estimate(data_to_adjust, fixed_time_horizons): +# """ +# Python implementation of the R extract_aj_estimate function for Aalen-Johansen estimation. + +# Parameters: +# data_to_adjust (pd.DataFrame): DataFrame containing survival data +# fixed_time_horizons (list or float): Time points at which to evaluate the survival + +# Returns: +# pd.DataFrame: DataFrame with Aalen-Johansen estimates +# """ + +# # Ensure fixed_time_horizons is a list +# if not isinstance(fixed_time_horizons, list): +# fixed_time_horizons = [fixed_time_horizons] + +# # Create a categorical version of reals for stratification +# data = data_to_adjust.copy() +# data["reals_cat"] = pd.Categorical( +# data["reals_labels"], +# categories=[ +# "real_negatives", +# "real_positives", +# "real_competing", +# "real_censored", +# ], +# ordered=True, +# ) - # Ensure fixed_time_horizons is a list - if not isinstance(fixed_time_horizons, list): - fixed_time_horizons = [fixed_time_horizons] +# # Get unique strata values +# strata_values = data["strata"].unique() - # Create a categorical version of reals for stratification - data = data_to_adjust.copy() - data["reals_cat"] = pd.Categorical( - data["reals_labels"], - categories=[ - "real_negatives", - "real_positives", - "real_competing", - "real_censored", - ], - ordered=True, - ) +# event_map = { +# "real_negatives": 0, # Treat as censored +# "real_positives": 1, # Event of interest +# "real_competing": 2, # Competing risk +# "real_censored": 0, # Censored +# } - # Get unique strata values - strata_values = data["strata"].unique() +# data["event_code"] = data["reals_labels"].map(event_map) - event_map = { - "real_negatives": 0, # Treat as censored - "real_positives": 1, # Event of interest - "real_competing": 2, # Competing risk - "real_censored": 0, # Censored - } +# # Initialize result dataframes +# results = [] - data["event_code"] = data["reals_labels"].map(event_map) +# # For each stratum, fit Aalen-Johansen model +# for stratum in strata_values: +# # Filter data for current stratum +# stratum_data = data.loc[data["strata"] == stratum] - # Initialize result dataframes - results = [] +# # Initialize Aalen-Johansen fitter +# ajf = AalenJohansenFitter() +# ajf_competing = AalenJohansenFitter() - # For each stratum, fit Aalen-Johansen model - for stratum in strata_values: - # Filter data for current stratum - stratum_data = data.loc[data["strata"] == stratum] +# # Fit the model +# ajf.fit(stratum_data["times"], stratum_data["event_code"], event_of_interest=1) - # Initialize Aalen-Johansen fitter - ajf = AalenJohansenFitter() - ajf_competing = AalenJohansenFitter() +# ajf_competing.fit( +# stratum_data["times"], stratum_data["event_code"], event_of_interest=2 +# ) - # Fit the model - ajf.fit(stratum_data["times"], stratum_data["event_code"], event_of_interest=1) +# # Calculate cumulative incidence at fixed time horizons +# for t in fixed_time_horizons: +# n = len(stratum_data) +# real_positives_est = ajf.predict(t) +# real_competing_est = ajf_competing.predict(t) +# real_negatives_est = 1 - real_positives_est - real_competing_est - ajf_competing.fit( - stratum_data["times"], stratum_data["event_code"], event_of_interest=2 - ) +# states = ["real_negatives", "real_positives", "real_competing"] +# estimates = [real_negatives_est, real_positives_est, real_competing_est] - # Calculate cumulative incidence at fixed time horizons - for t in fixed_time_horizons: - n = len(stratum_data) - real_positives_est = ajf.predict(t) - real_competing_est = ajf_competing.predict(t) - real_negatives_est = 1 - real_positives_est - real_competing_est - - states = ["real_negatives", "real_positives", "real_competing"] - estimates = [real_negatives_est, real_positives_est, real_competing_est] - - for state, estimate in zip(states, estimates): - results.append( - { - "strata": stratum, - "reals": state, - "fixed_time_horizon": t, - "reals_estimate": estimate * n, - } - ) +# for state, estimate in zip(states, estimates): +# results.append( +# { +# "strata": stratum, +# "reals": state, +# "fixed_time_horizon": t, +# "reals_estimate": estimate * n, +# } +# ) - # Convert to DataFrame - result_df = pd.DataFrame(results) +# # Convert to DataFrame +# result_df = pd.DataFrame(results) - # Convert strata to categorical if needed - result_df["strata"] = pd.Categorical(result_df["strata"]) +# # Convert strata to categorical if needed +# result_df["strata"] = pd.Categorical(result_df["strata"]) - return result_df +# return result_df def add_cutoff_strata(data: pl.DataFrame, by: float, stratified_by) -> pl.DataFrame: From a6592fc19391859be8189aa7b05b0f5b38d376d0 Mon Sep 17 00:00:00 2001 From: Uriah Finkel Date: Mon, 15 Dec 2025 10:47:00 +0200 Subject: [PATCH 2/2] build: bump version --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index d71c787..7ff976a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,7 @@ dependencies = [ "pyarrow>=21.0.0", ] name = "rtichoke" -version = "0.1.24" +version = "0.1.25" description = "interactive visualizations for performance of predictive models" readme = "README.md" diff --git a/uv.lock b/uv.lock index e8ffad5..7cf5135 100644 --- a/uv.lock +++ b/uv.lock @@ -3888,7 +3888,7 @@ wheels = [ [[package]] name = "rtichoke" -version = "0.1.24" +version = "0.1.25" source = { editable = "." } dependencies = [ { name = "marimo", version = "0.17.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },