diff options
author | Daniel Friesel <daniel.friesel@uos.de> | 2021-09-30 15:18:36 +0200 |
---|---|---|
committer | Daniel Friesel <daniel.friesel@uos.de> | 2021-09-30 15:18:36 +0200 |
commit | f7c75bcc50b7da48ac00fdab379319ed49041204 (patch) | |
tree | b945dc45bfbc806bf4d9fe921f5f2484217f04af /lib | |
parent | dfc888a1ee09e377c015cef0dac9652d97f9c698 (diff) |
observations_to_by_name: extract attributes name from observations
Diffstat (limited to 'lib')
-rw-r--r-- | lib/utils.py | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/lib/utils.py b/lib/utils.py index b904974..86829b3 100644 --- a/lib/utils.py +++ b/lib/utils.py @@ -199,24 +199,31 @@ def param_dict_to_list(param_dict, parameter_names, default=None): return ret -def observations_to_by_name(observations: list, attributes: list): +def observations_to_by_name(observations: list): """ Convert observation list to by_name dictionary for AnalyticModel analysis :param observations: list of dicts, each representing one measurement. dict keys: "name": name of observed state/transition/... - "param": {"parameter name": parameter value, ...} dict + "param": {"parameter name": parameter value, ...}, + "attribute:" {"attribute name": attribute value, ...} + :param attributes: observed attributes (i.e., actual measurements). Each measurement dict must have an entry holding the data value for each attribute. It should not be None. :returns: tuple (by_name, parameter_names) which can be passed to AnalyticModel """ parameter_names = set() + attributes_by_name = dict() by_name = dict() for observation in observations: + if observation["name"] not in attributes_by_name: + attributes_by_name[observation["name"]] = set() parameter_names.update(observation["param"].keys()) + attributes_by_name[observation["name"]].update(observation["attribute"].keys()) name = observation["name"] if name not in by_name: + attributes = list(attributes_by_name[observation["name"]]) by_name[name] = {"attributes": attributes, "param": list()} for attribute in attributes: by_name[name][attribute] = list() @@ -226,14 +233,18 @@ def observations_to_by_name(observations: list, attributes: list): by_name[name]["param"].append( param_dict_to_list(observation["param"], parameter_names) ) - for attribute in attributes: - if observation[attribute] is None: + for attribute in attributes_by_name[name]: + if attribute not in observation["attribute"]: + raise ValueError( + f"""Attribute "{attribute}" missing in observation "{name}". Parameters = {observation["param"]}""" + ) + if observation["attribute"][attribute] is None: raise ValueError( f"""Attribute "{attribute}" of observation "{name}" is None. This is not allowed. Parameters = {observation["param"]}""" ) - by_name[name][attribute].append(observation[attribute]) + by_name[name][attribute].append(observation["attribute"][attribute]) for name in by_name: - for attribute in attributes: + for attribute in attributes_by_name[name]: by_name[name][attribute] = np.array(by_name[name][attribute]) return by_name, parameter_names |