Source code for piel.analysis.signals.dc.metrics

import numpy as np
import pandas as pd
from piel.types import SignalDCCollection
from .transfer.metrics import get_out_min_max, get_out_response_in_transition_range
from .transfer.power import get_power_metrics


[docs] def compile_dc_min_max_metrics_from_dc_collection( collections: list[SignalDCCollection], label_list: list[str], label_column_name: str = "label", threshold_kwargs: dict = None, debug: bool = False, **kwargs, ) -> pd.DataFrame: """ Compiles DC analysis metrics from a list of SignalDCCollection instances into a final DataFrame. Args: collections (List[SignalDCCollection]): List of SignalDCCollection instances to analyze. label_list (List[str]): List of labels corresponding to each SignalDCCollection. threshold_kwargs (dict, optional): Threshold kwargs for the transition transmission. Defaults to None. label_column_name (str, optional): How the label column should be called. Defaults to "label". debug (bool, optional): If True, raises exceptions during processing. Defaults to False. **kwargs: Additional keyword arguments for pd.DataFrame. Returns: pd.DataFrame: A DataFrame containing the compiled metrics with combined min-max columns. """ if not (len(collections) == len(label_list)): raise ValueError("Length of collections and label_list must be equal.") if threshold_kwargs is None: threshold_kwargs = {} data = [] for idx, (collection, label) in enumerate(zip(collections, label_list)): try: # Apply analysis functions vout_metrics = get_out_min_max(collection, **threshold_kwargs) vin_metrics = get_out_response_in_transition_range( collection, **threshold_kwargs ) power_metrics = get_power_metrics(collection, **threshold_kwargs) # Extract metrics min_vin = vin_metrics.min max_vin = vin_metrics.max vout_min = vout_metrics.min vout_max = vout_metrics.max power_max = power_metrics.max / 1e-3 # Convert to mW power_delta = ( power_metrics.max - power_metrics.min ) / 1e-3 # Convert to mW # Format metrics to three decimal places formatted_vin = f"{min_vin:.3f}-{max_vin:.3f}" formatted_vout = f"{vout_min:.3f}-{vout_max:.3f}" formatted_power_max = f"{power_max:.3f}" formatted_power_delta = f"{power_delta:.3f}" # Append to data data.append( { label_column_name: label, r"$V_{out}$ $V$": formatted_vout, r"$V_{tr,in}$ $V$": formatted_vin, r"$P_{dd,max}$ $mW$": formatted_power_max, r"$\Delta P_{dd}$ $mW$": formatted_power_delta, } ) except Exception as e: print( f"Error processing collection at index {idx} with label '{label}': {e}" ) # Optionally, append NaNs or skip data.append( { label_column_name: label, r"$V_{out}$ $V$": np.nan, r"$V_{tr,in}$ $V$": np.nan, r"$P_{dd,max}$ $mW$": np.nan, r"$\Delta P_{dd}$ $mW$": np.nan, } ) if debug: raise e # Create DataFrame final_df = pd.DataFrame(data, **kwargs) return final_df
[docs] def compile_dc_transition_metrics_from_dc_collection( collections: list[SignalDCCollection], label_list: list[str], label_column_name: str = "label", threshold_kwargs: dict = None, debug: bool = False, **kwargs, ) -> pd.DataFrame: """ Compiles DC analysis metrics from a list of SignalDCCollection instances into a final DataFrame. Args: collections (List[SignalDCCollection]): List of SignalDCCollection instances to analyze. label_list (List[str]): List of labels corresponding to each SignalDCCollection. threshold_kwargs (dict, optional): Threshold kwargs for the transition transmission. Defaults to None. label_column_name (str, optional): How the label column should be called. Defaults to "label". debug (bool, optional): If True, raises exceptions during processing. Defaults to False. **kwargs: Additional keyword arguments for pd.DataFrame. Returns: pd.DataFrame: A DataFrame containing the compiled metrics with combined min-max columns. """ if not (len(collections) == len(label_list)): raise ValueError("Length of collections and label_list must be equal.") if threshold_kwargs is None: threshold_kwargs = {} data = [] for idx, (collection, label) in enumerate(zip(collections, label_list)): try: # Apply analysis functions vout_metrics = get_out_min_max(collection, **threshold_kwargs) vin_metrics = get_out_response_in_transition_range( collection, **threshold_kwargs ) # Extract metrics min_vin = vin_metrics.min max_vin = vin_metrics.max vout_min = vout_metrics.min vout_max = vout_metrics.max # Format metrics to three decimal places formatted_vin = f"{min_vin:.3f}-{max_vin:.3f}" formatted_vout = f"{vout_min:.3f}-{vout_max:.3f}" # Append to data data.append( { label_column_name: label, r"$V_{out}$ $V$": formatted_vout, r"$V_{tr,in}$ $V$": formatted_vin, } ) except Exception as e: print( f"Error processing collection at index {idx} with label '{label}': {e}" ) # Optionally, append NaNs or skip data.append( { label_column_name: label, r"$V_{out}$ $V$": np.nan, r"$V_{tr,in}$ $V$": np.nan, } ) if debug: raise e # Create DataFrame final_df = pd.DataFrame(data, **kwargs) return final_df