diff --git a/petab/v1/conditions.py b/petab/v1/conditions.py index 5dc46565..8caf04dc 100644 --- a/petab/v1/conditions.py +++ b/petab/v1/conditions.py @@ -111,7 +111,7 @@ def get_parametric_overrides(condition_df: pd.DataFrame) -> list[str]: result = [] for column in constant_parameters: - if np.issubdtype(condition_df[column].dtype, np.number): + if not pd.api.types.is_string_dtype(condition_df[column].dtype): continue floatified = condition_df.loc[:, column].apply(core.to_float_if_float) diff --git a/petab/v1/lint.py b/petab/v1/lint.py index 6d06c492..434b5030 100644 --- a/petab/v1/lint.py +++ b/petab/v1/lint.py @@ -129,7 +129,7 @@ def check_condition_df( ) for column_name in req_cols: - if not np.issubdtype(df[column_name].dtype, np.number): + if pd.api.types.is_string_dtype(df[column_name].dtype): assert_no_leading_trailing_whitespace( df[column_name].values, column_name ) @@ -173,14 +173,14 @@ def check_measurement_df( _check_df(df, MEASUREMENT_DF_REQUIRED_COLS, "measurement") for column_name in MEASUREMENT_DF_REQUIRED_COLS: - if not np.issubdtype(df[column_name].dtype, np.number): + if pd.api.types.is_string_dtype(df[column_name].dtype): assert_no_leading_trailing_whitespace( df[column_name].values, column_name ) for column_name in MEASUREMENT_DF_OPTIONAL_COLS: - if column_name in df and not np.issubdtype( - df[column_name].dtype, np.number + if column_name in df and pd.api.types.is_string_dtype( + df[column_name].dtype ): assert_no_leading_trailing_whitespace( df[column_name].values, column_name @@ -243,7 +243,7 @@ def check_parameter_df( check_ids(df.index.values, kind="parameter") for column_name in PARAMETER_DF_REQUIRED_COLS[1:]: # 0 is PARAMETER_ID - if not np.issubdtype(df[column_name].dtype, np.number): + if pd.api.types.is_string_dtype(df[column_name].dtype): assert_no_leading_trailing_whitespace( df[column_name].values, column_name ) @@ -304,14 +304,14 @@ def check_observable_df(observable_df: pd.DataFrame) -> None: check_ids(observable_df.index.values, kind="observable") for column_name in OBSERVABLE_DF_REQUIRED_COLS[1:]: - if not np.issubdtype(observable_df[column_name].dtype, np.number): + if pd.api.types.is_string_dtype(observable_df[column_name].dtype): assert_no_leading_trailing_whitespace( observable_df[column_name].values, column_name ) for column_name in OBSERVABLE_DF_OPTIONAL_COLS: - if column_name in observable_df and not np.issubdtype( - observable_df[column_name].dtype, np.number + if column_name in observable_df and pd.api.types.is_string_dtype( + observable_df[column_name].dtype ): assert_no_leading_trailing_whitespace( observable_df[column_name].values, column_name diff --git a/petab/v1/visualize/data_overview.py b/petab/v1/visualize/data_overview.py index 349b503c..41f22ed2 100644 --- a/petab/v1/visualize/data_overview.py +++ b/petab/v1/visualize/data_overview.py @@ -69,7 +69,7 @@ def get_data_per_observable(measurement_df: pd.DataFrame) -> pd.DataFrame: my_measurements[PREEQUILIBRATION_CONDITION_ID] = ( my_measurements[PREEQUILIBRATION_CONDITION_ID] .astype("object") - .fillna("", inplace=True) + .fillna("") ) index.append(PREEQUILIBRATION_CONDITION_ID) diff --git a/pyproject.toml b/pyproject.toml index 6efd02a4..2d36dbba 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,7 @@ description = "Parameter estimation tabular data" requires-python = ">=3.11" dependencies = [ "numpy>=1.15.1", - "pandas>=1.2.0,<3", + "pandas>=1.2.0", "python-libsbml>=5.17.0", "sympy", "colorama", diff --git a/tests/v1/test_petab.py b/tests/v1/test_petab.py index 564dcb7f..7fe6cb9e 100644 --- a/tests/v1/test_petab.py +++ b/tests/v1/test_petab.py @@ -508,7 +508,7 @@ def test_flatten_timepoint_specific_output_overrides(): ) pd.testing.assert_frame_equal( - problem.observable_df, observable_df_expected + problem.observable_df, observable_df_expected, check_dtype=False ) pd.testing.assert_frame_equal( problem.measurement_df, measurement_df_expected