From 0b22e8cb96cf9dd81fa873ddf6bfa770ca740850 Mon Sep 17 00:00:00 2001 From: Daniel Weindl Date: Thu, 22 Oct 2026 16:10:40 +0200 Subject: [PATCH] Fix pandas 3.1 deprecations, require pandas>=2.3 * Don't pass `float_precision` to `read_csv` for pandas>=3.1, where round-trip float parsing is the default * Replace deprecated `inplace=True` by reassignment. As a consequence, `get_{condition,observable,parameter,mapping}_df` no longer modify DataFrames passed by the caller * Avoid `fillna` with incompatible fill values * Use a full-length key when adding the sum row to a MultiIndex DataFrame in `get_data_per_observable` * Turn all warnings, including `DeprecationWarning`s, into errors in tests. The pandas deprecation warnings derive from `DeprecationWarning`, which was ignored so far * Require pandas>=2.3 in accordance with NEP 29 Closes #570 Co-Authored-By: Claude Opus 5.5 --- petab/_utils.py | 10 ++++++++++ petab/v1/conditions.py | 10 +++++----- petab/v1/core.py | 5 +++-- petab/v1/mapping.py | 8 ++++---- petab/v1/measurements.py | 12 ++++++++---- petab/v1/observables.py | 8 ++++---- petab/v1/parameters.py | 10 +++++----- petab/v1/simplify.py | 6 ++---- petab/v1/visualize/data_overview.py | 5 ++++- petab/v1/visualize/plotting.py | 5 ++--- petab/v2/conditions.py | 3 ++- petab/v2/experiments.py | 4 +++- petab/v2/petab1to2.py | 19 +++++++++---------- pyproject.toml | 2 +- pytest.ini | 7 +++---- tests/v1/test_combine.py | 6 +++--- tests/v1/test_conditions.py | 5 ++++- tests/v1/test_lint.py | 16 ++++++++-------- tests/v1/test_observables.py | 5 +++-- tests/v1/test_parameter_mapping.py | 18 +++++++++--------- tests/v1/test_parameters.py | 4 ++-- tests/v1/test_petab.py | 10 +++++----- tests/v1/test_sbml.py | 6 +++--- tests/v1/test_simplify.py | 12 ++++++------ 24 files changed, 108 insertions(+), 88 deletions(-) diff --git a/petab/_utils.py b/petab/_utils.py index 808cebe7..def79ad8 100644 --- a/petab/_utils.py +++ b/petab/_utils.py @@ -2,10 +2,20 @@ from pathlib import Path +import pandas as pd from pydantic import AnyUrl, TypeAdapter PathOrUrlAdapter = TypeAdapter(AnyUrl | Path) +#: Extra keyword arguments for :func:`pandas.read_csv` to ensure lossless +#: float parsing. ``float_precision`` is deprecated in pandas>=3.1, +#: where round-trip parsing is the default. +READ_CSV_FLOAT_KWARGS = ( + {"float_precision": "round_trip"} + if tuple(map(int, pd.__version__.split(".")[:2])) < (3, 1) + else {} +) + def _generate_path( file_path: str | Path | AnyUrl, diff --git a/petab/v1/conditions.py b/petab/v1/conditions.py index 5dca2f6d..61bea3e7 100644 --- a/petab/v1/conditions.py +++ b/petab/v1/conditions.py @@ -6,6 +6,7 @@ import numpy as np import pandas as pd +from .._utils import READ_CSV_FLOAT_KWARGS from . import core, lint from .C import * @@ -32,7 +33,7 @@ def get_condition_df( if isinstance(condition_file, str | Path): condition_file = pd.read_csv( - condition_file, sep="\t", float_precision="round_trip" + condition_file, sep="\t", **READ_CSV_FLOAT_KWARGS ) lint.assert_no_leading_trailing_whitespace( @@ -40,13 +41,12 @@ def get_condition_df( ) if not isinstance(condition_file.index, pd.RangeIndex): - condition_file.reset_index( + condition_file = condition_file.reset_index( drop=condition_file.index.name != CONDITION_ID, - inplace=True, ) try: - condition_file.set_index([CONDITION_ID], inplace=True) + condition_file = condition_file.set_index([CONDITION_ID]) except KeyError: raise KeyError( f"Condition table missing mandatory field {CONDITION_ID}." @@ -90,7 +90,7 @@ def create_condition_df( raise ValueError("Invalid parameter ID: " + p) df[p] = np.nan - df.set_index(CONDITION_ID, inplace=True) + df = df.set_index(CONDITION_ID) return df diff --git a/petab/v1/core.py b/petab/v1/core.py index 9de03cfa..5262f6e1 100644 --- a/petab/v1/core.py +++ b/petab/v1/core.py @@ -14,6 +14,7 @@ import pandas as pd from pandas.api.types import is_string_dtype +from .._utils import READ_CSV_FLOAT_KWARGS from . import yaml from .C import * @@ -52,7 +53,7 @@ def get_simulation_df(simulation_file: str | Path) -> pd.DataFrame: Simulation DataFrame """ return pd.read_csv( - simulation_file, sep="\t", index_col=None, float_precision="round_trip" + simulation_file, sep="\t", index_col=None, **READ_CSV_FLOAT_KWARGS ) @@ -94,7 +95,7 @@ def get_visualization_df( sep="\t", index_col=None, converters=types, - float_precision="round_trip", + **READ_CSV_FLOAT_KWARGS, ) except pd.errors.EmptyDataError: warn( diff --git a/petab/v1/mapping.py b/petab/v1/mapping.py index af344920..d8081c8d 100644 --- a/petab/v1/mapping.py +++ b/petab/v1/mapping.py @@ -5,6 +5,7 @@ import pandas as pd +from .._utils import READ_CSV_FLOAT_KWARGS from . import lint from .C import * from .models import Model @@ -34,13 +35,12 @@ def get_mapping_df( if isinstance(mapping_file, str | Path): mapping_file = pd.read_csv( - mapping_file, sep="\t", float_precision="round_trip" + mapping_file, sep="\t", **READ_CSV_FLOAT_KWARGS ) if not isinstance(mapping_file.index, pd.RangeIndex): - mapping_file.reset_index( + mapping_file = mapping_file.reset_index( drop=mapping_file.index.name != PETAB_ENTITY_ID, - inplace=True, ) for col in MAPPING_DF_REQUIRED_COLS: @@ -51,7 +51,7 @@ def get_mapping_df( mapping_file.reset_index()[col].values, col ) - mapping_file.set_index([PETAB_ENTITY_ID], inplace=True) + mapping_file = mapping_file.set_index([PETAB_ENTITY_ID]) return mapping_file diff --git a/petab/v1/measurements.py b/petab/v1/measurements.py index a39a21ec..fab92ac7 100644 --- a/petab/v1/measurements.py +++ b/petab/v1/measurements.py @@ -8,6 +8,7 @@ import numpy as np import pandas as pd +from .._utils import READ_CSV_FLOAT_KWARGS from . import core, lint, observables from .C import * @@ -42,7 +43,7 @@ def get_measurement_df( if isinstance(measurement_file, str | Path): measurement_file = pd.read_csv( - measurement_file, sep="\t", float_precision="round_trip" + measurement_file, sep="\t", **READ_CSV_FLOAT_KWARGS ) lint.assert_no_leading_trailing_whitespace( @@ -94,7 +95,8 @@ def get_simulation_conditions(measurement_df: pd.DataFrame) -> pd.DataFrame: # We require NaN-containing rows, but they are ignored by `groupby`, # therefore replace them before simulation_conditions = ( - measurement_df.fillna("") + measurement_df[grouping_cols] + .fillna("") .groupby(grouping_cols) .size() .reset_index()[grouping_cols] @@ -129,7 +131,9 @@ def get_rows_for_condition( # check for equality in all grouping cols if PREEQUILIBRATION_CONDITION_ID in condition: row_filter = ( - measurement_df[PREEQUILIBRATION_CONDITION_ID].fillna("") + measurement_df[PREEQUILIBRATION_CONDITION_ID] + .astype("object") + .fillna("") == condition[PREEQUILIBRATION_CONDITION_ID] ) & row_filter if SIMULATION_CONDITION_ID in condition: @@ -251,7 +255,7 @@ def measurements_have_replicates(measurement_df: pd.DataFrame) -> bool: ], ) return np.any( - measurement_df.fillna("").groupby(grouping_cols).size().values - 1 + measurement_df.groupby(grouping_cols, dropna=False).size().values - 1 ) diff --git a/petab/v1/observables.py b/petab/v1/observables.py index d5862ccc..8a9a02a5 100644 --- a/petab/v1/observables.py +++ b/petab/v1/observables.py @@ -7,6 +7,7 @@ import pandas as pd +from .._utils import READ_CSV_FLOAT_KWARGS from . import core, lint from .C import * from .math import sympify_petab @@ -39,7 +40,7 @@ def get_observable_df( if isinstance(observable_file, str | Path): observable_file = pd.read_csv( - observable_file, sep="\t", float_precision="round_trip" + observable_file, sep="\t", **READ_CSV_FLOAT_KWARGS ) lint.assert_no_leading_trailing_whitespace( @@ -47,13 +48,12 @@ def get_observable_df( ) if not isinstance(observable_file.index, pd.RangeIndex): - observable_file.reset_index( + observable_file = observable_file.reset_index( drop=observable_file.index.name != OBSERVABLE_ID, - inplace=True, ) try: - observable_file.set_index([OBSERVABLE_ID], inplace=True) + observable_file = observable_file.set_index([OBSERVABLE_ID]) except KeyError: raise KeyError( f"Observable table missing mandatory field {OBSERVABLE_ID}." diff --git a/petab/v1/parameters.py b/petab/v1/parameters.py index 3ce2593c..a5c66a09 100644 --- a/petab/v1/parameters.py +++ b/petab/v1/parameters.py @@ -14,6 +14,7 @@ import numpy as np import pandas as pd +from .._utils import READ_CSV_FLOAT_KWARGS from . import conditions, core, lint, measurements, observables from .C import * from .models import Model @@ -59,7 +60,7 @@ def get_parameter_df( parameter_df = parameter_file elif isinstance(parameter_file, str | Path): parameter_df = pd.read_csv( - parameter_file, sep="\t", float_precision="round_trip" + parameter_file, sep="\t", **READ_CSV_FLOAT_KWARGS ) elif isinstance(parameter_file, Iterable): dfs = [get_parameter_df(x) for x in parameter_file if x] @@ -78,13 +79,12 @@ def get_parameter_df( ) if not isinstance(parameter_df.index, pd.RangeIndex): - parameter_df.reset_index( + parameter_df = parameter_df.reset_index( drop=parameter_file.index.name != PARAMETER_ID, - inplace=True, ) try: - parameter_df.set_index([PARAMETER_ID], inplace=True) + parameter_df = parameter_df.set_index([PARAMETER_ID]) except KeyError as e: raise KeyError( f"Parameter table missing mandatory field {PARAMETER_ID}." @@ -240,7 +240,7 @@ def create_parameter_df( OBJECTIVE_PRIOR_PARAMETERS: "", } ) - df.set_index([PARAMETER_ID], inplace=True) + df = df.set_index([PARAMETER_ID]) # For model parameters, set nominal values as defined in the model for parameter_id in df.index: diff --git a/petab/v1/simplify.py b/petab/v1/simplify.py index d9db5ce1..4853936e 100644 --- a/petab/v1/simplify.py +++ b/petab/v1/simplify.py @@ -23,8 +23,7 @@ def remove_nan_measurements(problem: Problem): """Drop any measurements that are NaN""" problem.measurement_df = problem.measurement_df[ ~problem.measurement_df[MEASUREMENT].isna() - ] - problem.measurement_df.reset_index(inplace=True, drop=True) + ].reset_index(drop=True) def remove_unused_observables(problem: Problem): @@ -103,8 +102,7 @@ def condition_parameters_to_parameter_table(problem: Problem): } for parameter_id, value in replacements.items() ] - rows = pd.DataFrame(rows) - rows.set_index(PARAMETER_ID, inplace=True) + rows = pd.DataFrame(rows).set_index(PARAMETER_ID) if problem.parameter_df is None: problem.parameter_df = rows diff --git a/petab/v1/visualize/data_overview.py b/petab/v1/visualize/data_overview.py index 41f22ed2..e8651093 100644 --- a/petab/v1/visualize/data_overview.py +++ b/petab/v1/visualize/data_overview.py @@ -83,7 +83,10 @@ def get_data_per_observable(measurement_df: pd.DataFrame) -> pd.DataFrame: ) # Add row and column sums - data_per_observable.loc["SUM", :] = data_per_observable.sum(axis=0).values + sum_row = "SUM" if len(index) == 1 else ("SUM", "") + data_per_observable.loc[sum_row, :] = data_per_observable.sum( + axis=0 + ).values data_per_observable["SUM"] = data_per_observable.sum(axis=1).values data_per_observable = data_per_observable.astype(int) diff --git a/petab/v1/visualize/plotting.py b/petab/v1/visualize/plotting.py index 5dacd9b1..e17bde4f 100644 --- a/petab/v1/visualize/plotting.py +++ b/petab/v1/visualize/plotting.py @@ -61,8 +61,7 @@ def __init__( conditions_: np.ndarray | pd.Series | None, data_to_plot: pd.DataFrame | None = None, ): - self.data_to_plot = data_to_plot - self.data_to_plot.sort_index(inplace=True) + self.data_to_plot = data_to_plot.sort_index() self.conditions = conditions_ if self.conditions is not None: @@ -76,7 +75,7 @@ def __init__( if isinstance(self.conditions, np.ndarray): self.conditions.sort() elif isinstance(self.conditions, pd.Series): - self.conditions.sort_index(inplace=True) + self.conditions = self.conditions.sort_index() def add_x_offset(self, offset) -> None: """ diff --git a/petab/v2/conditions.py b/petab/v2/conditions.py index deea1a0c..3283f832 100644 --- a/petab/v2/conditions.py +++ b/petab/v2/conditions.py @@ -6,6 +6,7 @@ import pandas as pd +from .._utils import READ_CSV_FLOAT_KWARGS from ..v1.lint import assert_no_leading_trailing_whitespace __all__ = [ @@ -27,7 +28,7 @@ def get_condition_df( if isinstance(condition_file, str | Path): condition_file = pd.read_csv( - condition_file, sep="\t", float_precision="round_trip" + condition_file, sep="\t", **READ_CSV_FLOAT_KWARGS ) assert_no_leading_trailing_whitespace( diff --git a/petab/v2/experiments.py b/petab/v2/experiments.py index 3a06ea76..55d95d4c 100644 --- a/petab/v2/experiments.py +++ b/petab/v2/experiments.py @@ -4,6 +4,8 @@ import pandas as pd +from .._utils import READ_CSV_FLOAT_KWARGS + __all__ = ["get_experiment_df", "write_experiment_df"] @@ -22,7 +24,7 @@ def get_experiment_df( if isinstance(experiments_file, str | Path): experiments_file = pd.read_csv( - experiments_file, sep="\t", float_precision="round_trip" + experiments_file, sep="\t", **READ_CSV_FLOAT_KWARGS ) return experiments_file diff --git a/petab/v2/petab1to2.py b/petab/v2/petab1to2.py index e3cb19c3..bd7f9e44 100644 --- a/petab/v2/petab1to2.py +++ b/petab/v2/petab1to2.py @@ -231,15 +231,16 @@ def create_experiment_id(sim_cond_id: str, preeq_cond_id: str) -> str: measurement_df = v1.get_measurement_df(get_src_path(measurement_file)) # if there is already an experiment ID column, we rename it if v2.C.EXPERIMENT_ID in measurement_df.columns: - measurement_df.rename( + measurement_df = measurement_df.rename( columns={v2.C.EXPERIMENT_ID: f"experiment_id_{uuid4()}"}, - inplace=True, ) # add pre-eq condition id if not present or convert to string # for simplicity if v1.C.PREEQUILIBRATION_CONDITION_ID in measurement_df.columns: - measurement_df.fillna( - {v1.C.PREEQUILIBRATION_CONDITION_ID: ""}, inplace=True + measurement_df[v1.C.PREEQUILIBRATION_CONDITION_ID] = ( + measurement_df[v1.C.PREEQUILIBRATION_CONDITION_ID] + .astype("object") + .fillna("") ) else: measurement_df[v1.C.PREEQUILIBRATION_CONDITION_ID] = "" @@ -362,7 +363,7 @@ def v1v2_condition_df( condition_df = condition_df.copy().reset_index() with suppress(KeyError): # conditionName was dropped in PEtab v2 - condition_df.drop(columns=[v1.C.CONDITION_NAME], inplace=True) + condition_df = condition_df.drop(columns=[v1.C.CONDITION_NAME]) condition_df = condition_df.melt( id_vars=[v1.C.CONDITION_ID], @@ -458,7 +459,7 @@ def get_noise_formula(row): stacklevel=4, ) - df.drop(columns=[v1.C.OBSERVABLE_TRANSFORMATION], inplace=True) + df = df.drop(columns=[v1.C.OBSERVABLE_TRANSFORMATION]) def extract_placeholders(row: pd.Series, type_: str) -> str: """Extract placeholders from observable formula.""" @@ -588,12 +589,11 @@ def update_prior(row) -> tuple[str, str | None]: ) # rename objectivePrior* to prior* - df.rename( + df = df.rename( columns={ v1.C.OBJECTIVE_PRIOR_TYPE: v2.C.PRIOR_DISTRIBUTION, v1.C.OBJECTIVE_PRIOR_PARAMETERS: v2.C.PRIOR_PARAMETERS, }, - inplace=True, errors="ignore", ) # some columns were dropped in PEtab v2 @@ -610,13 +610,12 @@ def update_prior(row) -> tuple[str, str | None]: "Parameter scales are not supported in PEtab v2.", stacklevel=9, ) - df.drop( + df = df.drop( columns=[ v1.C.INITIALIZATION_PRIOR_TYPE, v1.C.INITIALIZATION_PRIOR_PARAMETERS, v1.C.PARAMETER_SCALE, ], - inplace=True, errors="ignore", ) diff --git a/pyproject.toml b/pyproject.toml index 482c30ac..05683be8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,7 @@ description = "Parameter estimation tabular data" requires-python = ">=3.12" dependencies = [ "numpy>=2.1", - "pandas>=1.2.0", + "pandas>=2.3", "python-libsbml>=5.17.0", "sympy", "colorama", diff --git a/pytest.ini b/pytest.ini index 721d63d9..cbe1a3b5 100644 --- a/pytest.ini +++ b/pytest.ini @@ -5,7 +5,6 @@ testpaths = tests filterwarnings = error - # TODO: until tests are reorganized for petab.v1 - ignore::DeprecationWarning - ignore:.*inspect.getargspec\(\) is deprecated.*:DeprecationWarning - ignore:.*Passing unrecognized arguments to super\(PyDevIPCompleter6\).*:DeprecationWarning + # SWIG-generated bindings (python-libcombine) on Python>=3.14. + # Raising this warning during module initialization segfaults. + ignore:builtin type .* has no __module__ attribute:DeprecationWarning diff --git a/tests/v1/test_combine.py b/tests/v1/test_combine.py index 117354d1..8bc502b5 100644 --- a/tests/v1/test_combine.py +++ b/tests/v1/test_combine.py @@ -35,7 +35,7 @@ def test_combine_archive(): "fixedParameter1": [1.0, 2.0], } ) - condition_df.set_index(CONDITION_ID, inplace=True) + condition_df = condition_df.set_index(CONDITION_ID) parameter_df = pd.DataFrame( data={ @@ -43,7 +43,7 @@ def test_combine_archive(): PARAMETER_NAME: ["", "..."], } ) - parameter_df.set_index(PARAMETER_ID, inplace=True) + parameter_df = parameter_df.set_index(PARAMETER_ID) observable_df = pd.DataFrame( data={ @@ -52,7 +52,7 @@ def test_combine_archive(): NOISE_FORMULA: [1], } ) - observable_df.set_index(OBSERVABLE_ID, inplace=True) + observable_df = observable_df.set_index(OBSERVABLE_ID) sbml_file_name = "model.xml" measurement_file_name = "measurements.tsv" diff --git a/tests/v1/test_conditions.py b/tests/v1/test_conditions.py index c594ea8f..1b3195fb 100644 --- a/tests/v1/test_conditions.py +++ b/tests/v1/test_conditions.py @@ -76,7 +76,10 @@ def test_get_condition_df(): os.remove(file_name) # test other arguments - assert (petab.get_condition_df(condition_df) == condition_df).all().all() + pd.testing.assert_frame_equal( + petab.get_condition_df(condition_df), + condition_df.set_index(CONDITION_ID), + ) assert petab.get_condition_df(None) is None diff --git a/tests/v1/test_lint.py b/tests/v1/test_lint.py index 64e0dd0c..e0b6ae1c 100644 --- a/tests/v1/test_lint.py +++ b/tests/v1/test_lint.py @@ -29,7 +29,7 @@ def test_assert_measured_observables_present(): OBSERVABLE_ID: ["obs1"], } ) - observable_df.set_index(OBSERVABLE_ID, inplace=True) + observable_df = observable_df.set_index(OBSERVABLE_ID) with pytest.raises(AssertionError): lint.assert_measured_observables_defined(measurement_df, observable_df) @@ -144,7 +144,7 @@ def test_assert_overrides_match_parameter_count(): NOISE_FORMULA: ["noiseParameter1_0obsPar1noisePar", "1.0"], } ) - observable_df.set_index(OBSERVABLE_ID, inplace=True) + observable_df = observable_df.set_index(OBSERVABLE_ID) measurement_df_orig = pd.DataFrame( data={ @@ -302,7 +302,7 @@ def test_assert_noise_distributions_valid(): NOISE_DISTRIBUTION: ["", ""], } ) - observable_df.set_index([OBSERVABLE_ID], inplace=True) + observable_df = observable_df.set_index([OBSERVABLE_ID]) lint.assert_noise_distributions_valid(observable_df) @@ -314,7 +314,7 @@ def test_assert_noise_distributions_valid(): with pytest.raises(ValueError): lint.assert_noise_distributions_valid(observable_df) - observable_df.drop(columns=NOISE_DISTRIBUTION, inplace=True) + observable_df = observable_df.drop(columns=NOISE_DISTRIBUTION) lint.assert_noise_distributions_valid(observable_df) @@ -328,7 +328,7 @@ def test_check_measurement_df(): NOISE_DISTRIBUTION: ["", ""], } ) - observable_df.set_index([OBSERVABLE_ID], inplace=True) + observable_df = observable_df.set_index([OBSERVABLE_ID]) measurement_df = pd.DataFrame( data={ @@ -459,7 +459,7 @@ def test_assert_measurement_conditions_present_in_condition_table(): "fixedParameter1": [1.0, 2.0], } ) - condition_df.set_index(CONDITION_ID, inplace=True) + condition_df = condition_df.set_index(CONDITION_ID) measurement_df = pd.DataFrame( data={ @@ -511,7 +511,7 @@ def test_check_condition_df(): "p1": [nan], } ) - condition_df.set_index(CONDITION_ID, inplace=True) + condition_df = condition_df.set_index(CONDITION_ID) # parameter missing in model with pytest.raises(AssertionError): @@ -617,7 +617,7 @@ def test_condition_ids_are_unique(): "parameter1": [1.0, 2.0], } ) - condition_df.set_index(CONDITION_ID, inplace=True) + condition_df = condition_df.set_index(CONDITION_ID) with pytest.raises(AssertionError): lint.check_condition_df(condition_df) diff --git a/tests/v1/test_observables.py b/tests/v1/test_observables.py index 5e094990..95ae8e18 100644 --- a/tests/v1/test_observables.py +++ b/tests/v1/test_observables.py @@ -44,8 +44,9 @@ def test_get_observable_df(): assert (df == observable_df.set_index(OBSERVABLE_ID)).all().all() # test other arguments - assert ( - (petab.get_observable_df(observable_df) == observable_df).all().all() + pd.testing.assert_frame_equal( + petab.get_observable_df(observable_df), + observable_df.set_index(OBSERVABLE_ID), ) assert petab.get_observable_df(None) is None diff --git a/tests/v1/test_parameter_mapping.py b/tests/v1/test_parameter_mapping.py index 0d97b734..ddb5ca99 100644 --- a/tests/v1/test_parameter_mapping.py +++ b/tests/v1/test_parameter_mapping.py @@ -100,7 +100,7 @@ def test_no_condition_specific(condition_df_2_conditions): PARAMETER_SCALE: [LOG, LOG10, LIN], } ) - parameter_df.set_index(PARAMETER_ID, inplace=True) + parameter_df = parameter_df.set_index(PARAMETER_ID) expected = [ ( @@ -282,7 +282,7 @@ def test_all_override(condition_df_2_conditions): ESTIMATE: [1] * 7, } ) - parameter_df.set_index(PARAMETER_ID, inplace=True) + parameter_df = parameter_df.set_index(PARAMETER_ID) expected = [ ( @@ -357,7 +357,7 @@ def test_partial_override(condition_df_2_conditions): "fixedParameter2": [nan, 2.5], } ) - condition_df.set_index("conditionId", inplace=True) + condition_df = condition_df.set_index("conditionId") model = SbmlModel.from_antimony( """ @@ -402,7 +402,7 @@ def test_partial_override(condition_df_2_conditions): ESTIMATE: [1, 1, 1, 1, 1], } ) - parameter_df.set_index(PARAMETER_ID, inplace=True) + parameter_df = parameter_df.set_index(PARAMETER_ID) expected = [ ( @@ -476,7 +476,7 @@ def test_parameterized_condition_table(): ], } ) - condition_df.set_index(CONDITION_ID, inplace=True) + condition_df = condition_df.set_index(CONDITION_ID) measurement_df = pd.DataFrame( data={ @@ -498,7 +498,7 @@ def test_parameterized_condition_table(): ESTIMATE: [1, 1], } ) - parameter_df.set_index(PARAMETER_ID, inplace=True) + parameter_df = parameter_df.set_index(PARAMETER_ID) model = SbmlModel.from_antimony("dynamicParameter1 = 1.0") @@ -566,7 +566,7 @@ def test_parameterized_condition_table_changed_scale(): ], } ) - condition_df.set_index("conditionId", inplace=True) + condition_df = condition_df.set_index("conditionId") # set up measurement table measurement_df = pd.DataFrame( @@ -596,7 +596,7 @@ def test_parameterized_condition_table_changed_scale(): PARAMETER_SCALE: [LOG10, LIN, LOG10], } ) - parameter_df.set_index(PARAMETER_ID, inplace=True) + parameter_df = parameter_df.set_index(PARAMETER_ID) # test without preequilibration condition; unscaled known parameters @@ -701,7 +701,7 @@ def test_fill_in_nominal_values(): ESTIMATE: [1, 0], } ) - parameter_df.set_index([PARAMETER_ID], inplace=True) + parameter_df = parameter_df.set_index([PARAMETER_ID]) par_mapping = {"estimated": "estimated", "not_estimated": "not_estimated"} scale_mapping = {"estimated": LIN, "not_estimated": LIN} diff --git a/tests/v1/test_parameters.py b/tests/v1/test_parameters.py index da7b420c..42e86165 100644 --- a/tests/v1/test_parameters.py +++ b/tests/v1/test_parameters.py @@ -20,7 +20,7 @@ def test_get_optimization_parameter_scaling(): PARAMETER_SCALE: [LIN, LOG, LOG10], } ) - df.set_index(PARAMETER_ID, inplace=True) + df = df.set_index(PARAMETER_ID) # parameter and scale expected = {"p1": LIN, "p3": LOG10} @@ -38,7 +38,7 @@ def test_get_optimization_parameters(): ESTIMATE: [1, 0, 1], } ) - df.set_index(PARAMETER_ID, inplace=True) + df = df.set_index(PARAMETER_ID) expected = ["p1", "p3"] diff --git a/tests/v1/test_petab.py b/tests/v1/test_petab.py index 194ee6ea..a352fb58 100644 --- a/tests/v1/test_petab.py +++ b/tests/v1/test_petab.py @@ -26,7 +26,7 @@ def condition_df_2_conditions(): "fixedParameter1": [1.0, 2.0], } ) - condition_df.set_index("conditionId", inplace=True) + condition_df = condition_df.set_index("conditionId") condition_df.fixedParameter1 = condition_df.fixedParameter1.astype( "object" ) @@ -377,7 +377,7 @@ def test_flatten_timepoint_specific_output_overrides(): ], } ) - observable_df.set_index(OBSERVABLE_ID, inplace=True) + observable_df = observable_df.set_index(OBSERVABLE_ID) # new observable IDs # (obs${i_obs}_${i_obsParOverride}_${i_noiseParOverride}_${i_condition}) @@ -427,7 +427,7 @@ def test_flatten_timepoint_specific_output_overrides(): ], } ) - observable_df_expected.set_index(OBSERVABLE_ID, inplace=True) + observable_df_expected = observable_df_expected.set_index(OBSERVABLE_ID) # Measurement table with timepoint-specific overrides measurement_df = pd.DataFrame( @@ -558,7 +558,7 @@ def test_flatten_timepoint_specific_output_overrides_special_cases(): NOISE_FORMULA: ["noiseParameter1_obs1"], } ) - observable_df.set_index(OBSERVABLE_ID, inplace=True) + observable_df = observable_df.set_index(OBSERVABLE_ID) observable_df_expected = pd.DataFrame( data={ @@ -573,7 +573,7 @@ def test_flatten_timepoint_specific_output_overrides_special_cases(): ], } ) - observable_df_expected.set_index(OBSERVABLE_ID, inplace=True) + observable_df_expected = observable_df_expected.set_index(OBSERVABLE_ID) # Measurement table with timepoint-specific overrides measurement_df = pd.DataFrame( diff --git a/tests/v1/test_sbml.py b/tests/v1/test_sbml.py index f97381ec..c3e3e8de 100644 --- a/tests/v1/test_sbml.py +++ b/tests/v1/test_sbml.py @@ -37,7 +37,7 @@ def create_test_data(): "compartment_1": [2], } ) - condition_df.set_index([petab.CONDITION_ID], inplace=True) + condition_df = condition_df.set_index([petab.CONDITION_ID]) observable_df = pd.DataFrame( { @@ -45,7 +45,7 @@ def create_test_data(): petab.OBSERVABLE_FORMULA: ["2 * species_1"], } ) - observable_df.set_index([petab.OBSERVABLE_ID], inplace=True) + observable_df = observable_df.set_index([petab.OBSERVABLE_ID]) measurement_df = pd.DataFrame( { @@ -67,7 +67,7 @@ def create_test_data(): petab.ESTIMATE: [0, 1, 0], } ) - parameter_df.set_index([petab.PARAMETER_ID], inplace=True) + parameter_df = parameter_df.set_index([petab.PARAMETER_ID]) return model, condition_df, observable_df, measurement_df, parameter_df diff --git a/tests/v1/test_simplify.py b/tests/v1/test_simplify.py index 316cc058..37d1edfe 100644 --- a/tests/v1/test_simplify.py +++ b/tests/v1/test_simplify.py @@ -25,7 +25,7 @@ def problem() -> Problem: NOISE_FORMULA: [1.0, 2.0, 3.0], } ) - observable_df.set_index(OBSERVABLE_ID, inplace=True) + observable_df = observable_df.set_index(OBSERVABLE_ID) conditions_df = pd.DataFrame( { @@ -38,7 +38,7 @@ def problem() -> Problem: "same_value_for_all_conditions": [4.0] * 3, } ) - conditions_df.set_index(CONDITION_ID, inplace=True) + conditions_df = conditions_df.set_index(CONDITION_ID) measurement_df = pd.DataFrame( { @@ -97,7 +97,7 @@ def test_remove_unused_observables(problem): NOISE_FORMULA: [1.0, 3.0], } ) - expected.set_index(OBSERVABLE_ID, inplace=True) + expected = expected.set_index(OBSERVABLE_ID) assert not problem.observable_df.equals(expected) remove_unused_observables(problem) @@ -113,7 +113,7 @@ def test_remove_unused_conditions(problem): "same_value_for_all_conditions": [4.0] * 2, } ) - expected.set_index(CONDITION_ID, inplace=True) + expected = expected.set_index(CONDITION_ID) assert not problem.condition_df.equals(expected) remove_unused_conditions(problem) @@ -132,7 +132,7 @@ def test_condition_parameters_to_parameter_table(problem): "some_parameter": [1.0, 2.0, 3.0], } ) - expected_conditions.set_index(CONDITION_ID, inplace=True) + expected_conditions = expected_conditions.set_index(CONDITION_ID) assert not problem.condition_df.equals(expected_conditions) expected_parameters = pd.DataFrame( @@ -145,7 +145,7 @@ def test_condition_parameters_to_parameter_table(problem): ESTIMATE: [0], } ) - expected_parameters.set_index(PARAMETER_ID, inplace=True) + expected_parameters = expected_parameters.set_index(PARAMETER_ID) assert problem.parameter_df is None condition_parameters_to_parameter_table(problem)