Source code for piel.analysis.signals.frequency.core.metrics
import pandas as pd
import logging
from piel.types import Phasor, ScalarMetric, FrequencyMetric, dBm
# Configure logger
logger = logging.getLogger(__name__)
[docs]
def max_power_s21_frequency_metric_from_dataframe(
dataframe: pd.DataFrame,
) -> FrequencyMetric:
"""
Extracts the maximum s_21_magnitude_dBm from the DataFrame, composes the corresponding input input,
and returns both as a Phasor and ScalarMetric.
Parameters:
dataframe (pd.DataFrame): DataFrame containing the required columns.
Returns:
Tuple[Phasor, ScalarMetric]: A tuple containing the input Phasor and the output ScalarMetric.
"""
required_columns = [
"magnitude_dBm",
"phase_degree",
"frequency_Hz",
"s_21_magnitude_dBm",
"s_21_phase_degree",
"s_21_frequency_Hz",
]
# Check if all required columns are present
missing_columns = [col for col in required_columns if col not in dataframe.columns]
if missing_columns:
logger.error(f"Missing required columns: {missing_columns}")
raise ValueError(
f"The DataFrame is missing required columns: {missing_columns}"
)
# Find the row with the maximum s_21_magnitude_dBm
max_s21_row = dataframe.loc[dataframe["s_21_magnitude_dBm"].idxmax()]
logger.debug(f"Row with maximum s_21_magnitude_dBm: \n{max_s21_row}")
# Extract input input components
input_magnitude_dBm = max_s21_row["magnitude_dBm"]
input_phase_degree = max_s21_row["phase_degree"]
input_frequency_Hz = max_s21_row["frequency_Hz"]
logger.debug(
f"Input Phasor Components - Magnitude: {input_magnitude_dBm} dBm, "
f"Phase: {input_phase_degree} degrees, Frequency: {input_frequency_Hz} Hz"
)
# Create Phasor instance for input (as scalar)
input_phasor = Phasor(
magnitude=input_magnitude_dBm,
phase=input_phase_degree,
frequency=input_frequency_Hz,
)
logger.debug(f"Input Phasor created: {input_phasor}")
# Extract the maximum s_21_magnitude_dBm and its corresponding unit
max_s21_magnitude_dBm = max_s21_row["s_21_magnitude_dBm"]
logger.debug(f"Maximum s_21_magnitude_dBm: {max_s21_magnitude_dBm} dBm")
# Create ScalarMetric instance for output
scalar_metric = ScalarMetric(
value=max_s21_magnitude_dBm,
unit=dBm,
description="Maximum s21 magnitude in dBm",
)
logger.debug(f"ScalarMetric created: {scalar_metric}")
frequency_metric = FrequencyMetric(
input=input_phasor,
metric=scalar_metric,
)
return frequency_metric