Source code for piel.experimental.analysis.operating_point
from ...utils import get_unique_dataframe_subsets
from piel.types.experimental import Experiment, ExperimentData, ExperimentDataCollection
from ..measurements.map import measurement_data_to_measurement_collection_data_map
from ...models import load_from_dict
[docs]
def create_experiment_data_collection_from_unique_parameters(
experiment_data: ExperimentData,
) -> ExperimentDataCollection:
"""
Each individual raw ``ExperimentData`` can contain multiple operating points or unique parameters which are being
tested. It can be handy to create subsets of ``ExperimentData`` -> multiple ``ExperimentData``s
that correspond to relevant operating points stored with the relevant parameters both internally and in an
``ExperimentDataCollection``. As such, it is easier to understand the collection of data
measurements based on this and perform plotting accordingly in a more relevant implementation. Likewise,
the corresponding operating point metadata is encoded in the generated ``ExperimentData`` sets.
First, we will need to extract the operating points from the ``ExperimentData.experiment.parameters``.
This can be done by identifying the unique elements from the pandas DataFrame.
Then, we will need to create a new ``ExperimentData`` for each of the operating points.
Finally, we will need to create a new ``ExperimentDataCollection`` with the new ``ExperimentData``.
"""
# We need to make this function capable of running with loaded serialized items
experiment_data = experiment_data.model_dump()
experiment_data = load_from_dict(experiment_data, type=ExperimentData)
experiment = load_from_dict(experiment_data.experiment, type=Experiment)
# First we extract the relevant parameter subsets
unique_parameter_subset_dictionary = get_unique_dataframe_subsets(
experiment.parameters
)
# Then we create a new ExperimentData for each of the operating points, we also need to create a new Experiment within the ExperimentData to match the indices
experiment_data_collection = list()
for (
identifier_i,
unique_parameter_subset_i,
) in unique_parameter_subset_dictionary.items():
# We also need to create a new Experiment within the ExperimentData to match the indices
experiment_instances_subset_i = [
experiment.experiment_instances[i] for i in unique_parameter_subset_i.index
]
# Create sub experiment accordingly
experiment_i = Experiment(
name=f"{experiment.name}_{identifier_i}",
goal=f"{experiment.goal}_{identifier_i}",
experiment_instances=experiment_instances_subset_i,
parameters_list=unique_parameter_subset_i.to_dict(orient="records"),
)
# Create subset of experiment data
experiment_data_instances_subset_i = [
experiment_data.data["collection"][i]
for i in unique_parameter_subset_i.index
]
# Create the measurement collection with the correct type.
collection_type = measurement_data_to_measurement_collection_data_map[
experiment_data.data["collection"][-1]["type"]
]
# Create the corresponding ExperimentData
data_collection = collection_type(
name=f"{experiment_i.name}_{identifier_i}",
collection=experiment_data_instances_subset_i,
)
experiment_data_i = ExperimentData(
name=experiment_i.name,
experiment=experiment_i,
data=data_collection,
)
experiment_data_collection.append(experiment_data_i)
# Create the corresponding ExperimentDataCollection
experiment_data_collection = ExperimentDataCollection(
name=experiment_data.name, collection=experiment_data_collection
)
return experiment_data_collection