Source code for piel.analysis.electronic.metrics
from piel.types import RFAmplifierCollection, ComponentMetrics, ScalarMetric
import pandas as pd
[docs]
def compose_amplifier_collection_performance_dataframe(
amplifier_collection: RFAmplifierCollection, desired_metrics: list[str]
) -> pd.DataFrame:
"""
Composes performance parameters of amplifiers into a pandas DataFrame,
handling multiple metrics per component.
Args:
amplifier_collection (RFAmplifierCollection): The collection of RF amplifiers.
desired_metrics (List[str]): List of metric names to include in the DataFrame.
Returns:
pd.DataFrame: DataFrame containing the specified metrics for each amplifier and metrics instance.
"""
records = []
for comp_idx, component in enumerate(amplifier_collection.components, start=1):
metrics_list: list[ComponentMetrics] = getattr(component, "metrics", [])
if not metrics_list:
# If no metrics are present, fill with None
record = {"Component_ID": comp_idx, "Metrics_Instance": None}
for metric in desired_metrics:
record[metric] = None
records.append(record)
continue
for metric_idx, metrics in enumerate(metrics_list, start=1):
record = {"Component_ID": comp_idx, "Metrics_Instance": metric_idx}
for metric in desired_metrics:
# Use getattr to safely access the metric; default to None if not present
metric_obj = getattr(metrics, metric, None)
if isinstance(metric_obj, ScalarMetric):
# Assuming ScalarMetric has 'min' and 'max' attributes
# You may need to adjust based on actual implementation
record[f"{metric}_min"] = getattr(metric_obj, "min", None)
record[f"{metric}_max"] = getattr(metric_obj, "max", None)
else:
# For non-ScalarMetric (e.g., strings), assign directly
record[metric] = metric_obj
records.append(record)
# Create DataFrame from records
df = pd.DataFrame(records)
return df