Source code for piel.experimental.measurements.data.dc
import pandas as pd
from piel.types import PathTypes, V, A, Unit
from piel.file_system import return_path
from piel.models.physical.electrical import (
construct_dc_signal,
construct_current_dc_signal,
construct_voltage_dc_signal,
)
from piel.types import (
SignalDCCollection,
DCSweepMeasurementDataCollection,
SignalDC,
VoltageCurrentSignalNamePair,
Experiment,
ExperimentData,
)
from piel.analysis.signals.dc import compile_dc_min_max_metrics_from_dc_collection
[docs]
def construct_sourcemeter_sweep_signal_from_csv(
file_path: PathTypes,
voltage_signal_name: str,
current_signal_name: str,
**kwargs,
) -> SignalDC:
file = return_path(file_path)
dataframe = pd.read_csv(file)
signal = construct_sourcemeter_sweep_signal_from_dataframe(
dataframe=dataframe,
voltage_signal_name=voltage_signal_name,
current_signal_name=current_signal_name,
**kwargs,
)
return signal
[docs]
def construct_sourcemeter_sweep_signal_from_dataframe(
dataframe: pd.DataFrame,
voltage_signal_name: str,
current_signal_name: str,
signal_kwargs: dict = None,
**kwargs,
) -> SignalDC:
if signal_kwargs is None:
signal_kwargs = {}
voltage_signal_data = dataframe[voltage_signal_name].values
current_signal_data = dataframe[current_signal_name].values
signal = construct_dc_signal(
voltage_signal_name=voltage_signal_name,
voltage_signal_values=voltage_signal_data,
current_signal_name=current_signal_name,
current_signal_values=current_signal_data,
**signal_kwargs,
)
return signal
[docs]
def construct_multimeter_sweep_signal_from_csv(
file_path: PathTypes,
signal_name: str,
unit: Unit = V,
**kwargs,
) -> SignalDC:
"""
Construct a multimeter sweep signal from a CSV file.
Parameters
----------
file_path : PathTypes
The path to the CSV file.
signal_name : str
The name of the signal.
unit: Unit
Determines type of signal.
**kwargs
Returns
-------
SignalDC
The multimeter sweep signal
"""
file = return_path(file_path)
dataframe = pd.read_csv(file)
if unit is V:
signal = construct_voltage_dc_signal(
name=signal_name, values=dataframe[signal_name].values
)
elif unit is A:
signal = construct_current_dc_signal(
name=signal_name, values=dataframe[signal_name].values ** kwargs
)
else:
raise ValueError(f"Unimplemented signal unit: {unit}")
return signal
[docs]
def construct_multimeter_sweep_signal_from_dataframe(
dataframe: pd.DataFrame,
signal_name: str,
signal_kwargs: dict = None,
**kwargs,
) -> SignalDC:
"""
Construct a multimeter sweep signal from a dataframe.
Parameters
----------
dataframe : pd.DataFrame
The dataframe containing the multimeter sweep signal data.
signal_name : str
The name of the signal.
signal_kwargs : dict
Additional keyword arguments.
**kwargs
Returns
-------
SignalDC
The multimeter sweep signal
"""
if signal_kwargs is None:
signal_kwargs = {}
signal_data = dataframe[signal_name].values
signal = construct_voltage_dc_signal(name=signal_name, values=signal_data)
return signal
[docs]
def extract_signal_data_from_dataframe(
dataframe: pd.DataFrame,
input_signal_name_list: list[VoltageCurrentSignalNamePair],
output_signal_name_list: list[str],
power_signal_name_list: list[VoltageCurrentSignalNamePair],
**kwargs,
) -> SignalDCCollection:
"""
Extract DC sweep data from a dataframe.
Parameters
----------
dataframe : pd.DataFrame
The dataframe containing the DC sweep data.
input_signal_name_list : list[VoltageCurrentSignalNamePair]
The pairs of sourcemeter voltage and current signal names.
output_signal_name_list : list[str]
The multimeter signals.
power_signal_name_list : list[VoltageCurrentSignalNamePair]
The pairs of sourcemeter voltage and current signal names.
**kwargs
Additional keyword arguments.
Returns
-------
SignalDCCollection
The DC sweep data.
"""
# Iterate through the sourcemeter signals and create the sourcemeter sweep signals
input_sweep_signals = []
for sourcemeter_voltage_signal_pair in input_signal_name_list:
voltage_signal_name_i = sourcemeter_voltage_signal_pair[0]
current_signal_name_i = sourcemeter_voltage_signal_pair[1]
sourcemeter_sweep_signal = construct_sourcemeter_sweep_signal_from_dataframe(
dataframe=dataframe,
voltage_signal_name=voltage_signal_name_i,
current_signal_name=current_signal_name_i,
)
input_sweep_signals.append(sourcemeter_sweep_signal)
power_sweep_signals = []
for sourcemeter_voltage_signal_pair in power_signal_name_list:
voltage_signal_name_i = sourcemeter_voltage_signal_pair[0]
current_signal_name_i = sourcemeter_voltage_signal_pair[1]
sourcemeter_sweep_signal = construct_sourcemeter_sweep_signal_from_dataframe(
dataframe=dataframe,
voltage_signal_name=voltage_signal_name_i,
current_signal_name=current_signal_name_i,
)
power_sweep_signals.append(sourcemeter_sweep_signal)
# Iterate through the multimeter signals and create the multimeter sweep signals
output_sweep_signals = []
for multimeter_signal in output_signal_name_list:
multimeter_sweep_signal = construct_multimeter_sweep_signal_from_dataframe(
dataframe=dataframe, signal_name=multimeter_signal
)
output_sweep_signals.append(multimeter_sweep_signal)
return SignalDCCollection(
inputs=input_sweep_signals,
outputs=output_sweep_signals,
power=power_sweep_signals,
**kwargs,
)
[docs]
def extract_signal_data_from_csv(
file_path: PathTypes,
input_signal_name_list: list[VoltageCurrentSignalNamePair],
output_signal_name_list: list[str],
power_signal_name_list: list[VoltageCurrentSignalNamePair],
**kwargs,
) -> SignalDCCollection:
"""
Extract DC sweep data from a CSV file.
Parameters
----------
file_path : PathTypes
The path to the CSV file.
input_signal_name_list : list[VoltageCurrentSignalNamePair]
The pairs of sourcemeter voltage and current signal names.
output_signal_name_list : list[str]
The multimeter signals.
power_signal_name_list : list[VoltageCurrentSignalNamePair]
The pairs of sourcemeter voltage and current signal names relating to power lines.
**kwargs
Additional keyword arguments.
Returns
-------
SignalDCCollection
The DC sweep data.
"""
file = return_path(file_path)
dataframe = pd.read_csv(file)
return extract_signal_data_from_dataframe(
dataframe=dataframe,
input_signal_name_list=input_signal_name_list,
output_signal_name_list=output_signal_name_list,
power_signal_name_list=power_signal_name_list,
**kwargs,
)
[docs]
def extract_dc_sweeps_from_operating_point_csv(
file_path: PathTypes,
input_signal_name_list: list[VoltageCurrentSignalNamePair],
output_signal_name_list: list[str],
power_signal_name_list: list[VoltageCurrentSignalNamePair],
unique_operating_point_columns: list[str],
**kwargs,
) -> DCSweepMeasurementDataCollection:
"""
Extract DC sweep data from a full operating point CSV file. The operating point CSV file contains the DC sweep data
for multiple operating points. The unique operating point columns are used to extract the unique operating points
from the CSV file. The DC sweep data is then extracted for each unique operating point. The DC sweep data is
returned as a DCMeasurementDataCollection. The DCMeasurementDataCollection is a list of DCMeasurementDataTypes.
Parameters
----------
file_path : PathTypes
The path to the operating point CSV file.
input_signal_name_list : list[VoltageCurrentSignalNamePair]
The pairs of sourcemeter voltage and current signal names.
output_signal_name_list : list[str]
The multimeter signals.
power_signal_name_list : list[VoltageCurrentSignalNamePair]
The pairs of sourcemeter voltage and current signal names relating to power lines.
unique_operating_point_columns : list[str]
The unique operating point columns.
**kwargs
Additional keyword arguments.
Returns
-------
DCMeasurementDataCollection
The DC sweep data collection.
"""
file = return_path(file_path)
dataframe = pd.read_csv(file)
# Extract the unique operating points
unique_operating_points = dataframe[
unique_operating_point_columns
].drop_duplicates()
# Iterate through the unique operating points and extract the DC sweep data
dc_sweep_data = []
for _, operating_point in unique_operating_points.iterrows():
operating_point_data = dataframe[
(dataframe[unique_operating_point_columns] == operating_point).all(axis=1)
]
dc_sweep = extract_signal_data_from_dataframe(
dataframe=operating_point_data,
input_signal_name_list=input_signal_name_list,
output_signal_name_list=output_signal_name_list,
power_signal_name_list=power_signal_name_list,
**kwargs,
)
dc_sweep_data.append(dc_sweep)
return DCSweepMeasurementDataCollection(collection=dc_sweep_data)
[docs]
def extract_dc_sweep_experiment_data_from_csv(
file_path: PathTypes,
input_signal_name_list: list[VoltageCurrentSignalNamePair],
output_signal_name_list: list[str],
power_signal_name_list: list[VoltageCurrentSignalNamePair],
unique_operating_point_columns: list[str],
**kwargs,
) -> ExperimentData:
"""
Extract DC sweep data experiment data from a full operating point CSV file. The operating point CSV file contains the DC sweep data
for multiple operating points. The unique operating point columns are used to extract the unique operating points
from the CSV file. The DC sweep data is then extracted for each unique operating point. The DC sweep data is returned as a ExperimentData with the unique_operating_point_columns as part of the parameter_list definition, and the sweep data as part of the collection DCSweepMeasurementDataCollection.
Parameters
----------
file_path : PathTypes
The path to the operating point CSV file.
input_signal_name_list : list[VoltageCurrentSignalNamePair]
The pairs of sourcemeter voltage and current signal names.
output_signal_name_list : list[str]
The multimeter signals.
power_signal_name_list : list[VoltageCurrentSignalNamePair]
The pairs of sourcemeter voltage and current signal names of the power lines.
unique_operating_point_columns : list[str]
The unique operating point columns.
**kwargs
Additional keyword arguments.
Returns
-------
ExperimentData
A collection of experiment and metadata to represent a DC sweep analysis.
"""
file = return_path(file_path)
dataframe = pd.read_csv(file)
# Extract the unique operating points
unique_operating_points = dataframe[
unique_operating_point_columns
].drop_duplicates()
parameters_list = unique_operating_points.to_dict(orient="records")
data_collection = extract_dc_sweeps_from_operating_point_csv(
file_path=file_path,
input_signal_name_list=input_signal_name_list,
output_signal_name_list=output_signal_name_list,
power_signal_name_list=power_signal_name_list,
unique_operating_point_columns=unique_operating_point_columns,
**kwargs,
)
# Create metadata containers for automatic plotting/analysis.
experiment = Experiment(
parameters_list=parameters_list,
)
# Final output
experiment_data = ExperimentData(experiment=experiment, data=data_collection)
return experiment_data
[docs]
def extract_dc_metrics_from_experiment_data(
experiment_data: ExperimentData,
parameter_column: str = "driver_b_v_set",
label_column_name="ID",
**kwargs,
):
experiment_data_metrics = compile_dc_min_max_metrics_from_dc_collection(
[collection for collection in experiment_data.data.collection],
label_list=[
v_dd for v_dd in experiment_data.experiment.parameters[parameter_column]
],
label_column_name=label_column_name,
**kwargs,
)
return experiment_data_metrics