Skip to content

Commit 0a2de3b

Browse files
authored
Release 0.1.21
2 parents 1bf7e0f + 8768c50 commit 0a2de3b

File tree

11 files changed

+120
-18
lines changed

11 files changed

+120
-18
lines changed

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,15 @@
22

33
## 0.1 series
44

5+
### 0.1.21
6+
7+
* PEtab spec compliance: measurements must now be not null, and numeric (#76)
8+
* Users who relied on null measurements for simulation/plotting are
9+
recommended to store these dummy simulation-only measurements in an
10+
additional file, separate to real measurements used for calibration
11+
* Improve Unicode support (#79, fixes #77)
12+
* Convenience methods to scale or unscale a parameter vector (#78)
13+
514
### 0.1.20
615

716
* Visualization: plot additional simulation points (not only at measurements) (#62), bugfix (#68)

petab/conditions.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,7 @@ def write_condition_df(df: pd.DataFrame, filename: str) -> None:
5151
df: PEtab condition table
5252
filename: Destination file name
5353
"""
54-
with open(filename, 'w') as fh:
55-
df.to_csv(fh, sep='\t', index=True)
54+
df.to_csv(filename, sep='\t', index=True)
5655

5756

5857
def create_condition_df(parameter_ids: Iterable[str],

petab/core.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,7 @@ def write_simulation_df(df: pd.DataFrame, filename: str) -> None:
4040
df: PEtab simulation table
4141
filename: Destination file name
4242
"""
43-
with open(filename, 'w') as fh:
44-
df.to_csv(fh, sep='\t', index=False)
43+
df.to_csv(filename, sep='\t', index=False)
4544

4645

4746
def get_visualization_df(visualization_file: str) -> pd.DataFrame:
@@ -70,8 +69,7 @@ def write_visualization_df(df: pd.DataFrame, filename: str) -> None:
7069
df: PEtab visualization table
7170
filename: Destination file name
7271
"""
73-
with open(filename, 'w') as fh:
74-
df.to_csv(fh, sep='\t', index=False)
72+
df.to_csv(filename, sep='\t', index=False)
7573

7674

7775
def get_notnull_columns(df: pd.DataFrame, candidates: Iterable):

petab/lint.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
__all__ = ['assert_all_parameters_present_in_parameter_df',
2121
'assert_measured_observables_defined',
2222
'assert_measurement_conditions_present_in_condition_table',
23+
'assert_measurements_not_null',
24+
'assert_measurements_numeric',
2325
'assert_model_parameters_in_condition_or_parameter_table',
2426
'assert_no_leading_trailing_whitespace',
2527
'assert_noise_distributions_valid',
@@ -177,6 +179,9 @@ def check_measurement_df(df: pd.DataFrame,
177179
measurements.assert_overrides_match_parameter_count(
178180
df, observable_df)
179181

182+
assert_measurements_not_null(df)
183+
assert_measurements_numeric(df)
184+
180185

181186
def check_parameter_df(
182187
df: pd.DataFrame,
@@ -906,6 +911,51 @@ def assert_measurement_conditions_present_in_condition_table(
906911
+ str(missing_conditions))
907912

908913

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+
909959
def is_valid_identifier(x: str) -> bool:
910960
"""Check whether `x` is a valid identifier
911961

petab/measurements.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,7 @@ def write_measurement_df(df: pd.DataFrame, filename: str) -> None:
5757
df: PEtab measurement table
5858
filename: Destination file name
5959
"""
60-
with open(filename, 'w') as fh:
61-
df.to_csv(fh, sep='\t', index=False)
60+
df.to_csv(filename, sep='\t', index=False)
6261

6362

6463
def get_noise_distributions(measurement_df: pd.DataFrame) -> dict:

petab/observables.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ def write_observable_df(df: pd.DataFrame, filename: str) -> None:
6060
df: PEtab observable table
6161
filename: Destination file name
6262
"""
63-
with open(filename, 'w') as fh:
64-
df.to_csv(fh, sep='\t', index=True)
63+
df.to_csv(filename, sep='\t', index=True)
6564

6665

6766
def get_output_parameters(

petab/parameters.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,7 @@ def write_parameter_df(df: pd.DataFrame, filename: str) -> None:
8989
df: PEtab parameter table
9090
filename: Destination file name
9191
"""
92-
with open(filename, 'w') as fh:
93-
df.to_csv(fh, sep='\t', index=True)
92+
df.to_csv(filename, sep='\t', index=True)
9493

9594

9695
def get_optimization_parameters(parameter_df: pd.DataFrame) -> List[str]:

petab/problem.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -727,6 +727,54 @@ def sample_parameter_startpoints(self, n_starts: int = 100):
727727
return sampling.sample_parameter_startpoints(
728728
self.parameter_df, n_starts=n_starts)
729729

730+
def unscale_parameters(
731+
self,
732+
x_dict: Dict[str, float],
733+
) -> Dict[str, float]:
734+
"""Unscale parameter values.
735+
736+
Parameters
737+
----------
738+
x_dict:
739+
Keys are parameter IDs in the PEtab problem, values are scaled
740+
parameter values.
741+
742+
Returns
743+
-------
744+
The unscaled parameter values.
745+
"""
746+
return {
747+
parameter_id: parameters.unscale(
748+
parameter_value,
749+
self.parameter_df[PARAMETER_SCALE][parameter_id],
750+
)
751+
for parameter_id, parameter_value in x_dict.items()
752+
}
753+
754+
def scale_parameters(
755+
self,
756+
x_dict: Dict[str, float],
757+
) -> Dict[str, float]:
758+
"""Scale parameter values.
759+
760+
Parameters
761+
----------
762+
x_dict:
763+
Keys are parameter IDs in the PEtab problem, values are unscaled
764+
parameter values.
765+
766+
Returns
767+
-------
768+
The scaled parameter values.
769+
"""
770+
return {
771+
parameter_id: parameters.scale(
772+
parameter_value,
773+
self.parameter_df[PARAMETER_SCALE][parameter_id],
774+
)
775+
for parameter_id, parameter_value in x_dict.items()
776+
}
777+
730778

731779
def get_default_condition_file_name(model_name: str, folder: str = ''):
732780
"""Get file name according to proposed convention"""

petab/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
"""PEtab library version"""
2-
__version__ = '0.1.20'
2+
__version__ = '0.1.21'

tests/test_parameters.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@ def test_write_parameter_df():
112112
"""Test parameters.write_parameter_df."""
113113
parameter_df = pd.DataFrame(data={
114114
PARAMETER_ID: ['par1', 'par2'],
115-
PARAMETER_NAME: ['parname1', 'parname2'],
115+
# Test utf8 characters
116+
PARAMETER_NAME: ['ɑ', 'β'],
116117
}).set_index(PARAMETER_ID)
117118

118119
with tempfile.NamedTemporaryFile(mode='w', delete=True) as fh:

0 commit comments

Comments
 (0)