|
20 | 20 | __all__ = ['assert_all_parameters_present_in_parameter_df', |
21 | 21 | 'assert_measured_observables_defined', |
22 | 22 | 'assert_measurement_conditions_present_in_condition_table', |
| 23 | + 'assert_measurements_not_null', |
| 24 | + 'assert_measurements_numeric', |
23 | 25 | 'assert_model_parameters_in_condition_or_parameter_table', |
24 | 26 | 'assert_no_leading_trailing_whitespace', |
25 | 27 | 'assert_noise_distributions_valid', |
@@ -177,6 +179,9 @@ def check_measurement_df(df: pd.DataFrame, |
177 | 179 | measurements.assert_overrides_match_parameter_count( |
178 | 180 | df, observable_df) |
179 | 181 |
|
| 182 | + assert_measurements_not_null(df) |
| 183 | + assert_measurements_numeric(df) |
| 184 | + |
180 | 185 |
|
181 | 186 | def check_parameter_df( |
182 | 187 | df: pd.DataFrame, |
@@ -906,6 +911,51 @@ def assert_measurement_conditions_present_in_condition_table( |
906 | 911 | + str(missing_conditions)) |
907 | 912 |
|
908 | 913 |
|
| 914 | +def assert_measurements_not_null( |
| 915 | + measurement_df: pd.DataFrame, |
| 916 | +) -> None: |
| 917 | + """Check whether all measurements are not null. |
| 918 | +
|
| 919 | + Arguments: |
| 920 | + measurement_df: |
| 921 | + PEtab measurement table. |
| 922 | +
|
| 923 | + Raises: |
| 924 | + AssertionError: |
| 925 | + Some measurement value(s) are null (missing). |
| 926 | + """ |
| 927 | + if measurement_df[MEASUREMENT].isnull().any(): |
| 928 | + raise AssertionError('Some measurement(s) are null (missing).') |
| 929 | + |
| 930 | + |
| 931 | +def assert_measurements_numeric( |
| 932 | + measurement_df: pd.DataFrame, |
| 933 | +) -> None: |
| 934 | + """Check whether all measurements are numeric. |
| 935 | +
|
| 936 | + Note that null (missing) measurements are ignored. |
| 937 | +
|
| 938 | + Arguments: |
| 939 | + measurement_df: |
| 940 | + PEtab measurement table. |
| 941 | +
|
| 942 | + Raises: |
| 943 | + AssertionError: |
| 944 | + Some measurement value(s) are not numeric. |
| 945 | + """ |
| 946 | + not_null_measurement_values = measurement_df[MEASUREMENT].dropna() |
| 947 | + all_measurements_are_numeric = ( |
| 948 | + pd.to_numeric(not_null_measurement_values, errors='coerce') |
| 949 | + .notnull() |
| 950 | + .all() |
| 951 | + ) |
| 952 | + if not all_measurements_are_numeric: |
| 953 | + raise AssertionError( |
| 954 | + 'Some values in the `petab.C.MEASUREMENT` column of the PEtab ' |
| 955 | + 'measurements table are not numeric.' |
| 956 | + ) |
| 957 | + |
| 958 | + |
909 | 959 | def is_valid_identifier(x: str) -> bool: |
910 | 960 | """Check whether `x` is a valid identifier |
911 | 961 |
|
|
0 commit comments