Source code for biopsykit.signals.ecg.event_extraction._q_peak_vanlien2013

import pandas as pd
from tpcp import Parameter

from biopsykit.signals._base_extraction import HANDLE_MISSING_EVENTS, CanHandleMissingEventsMixin
from biopsykit.signals.ecg.event_extraction._base_ecg_extraction import BaseEcgExtractionWithHeartbeats
from biopsykit.utils.dtypes import (
    EcgRawDataFrame,
    HeartbeatSegmentationDataFrame,
    is_ecg_raw_dataframe,
    is_heartbeat_segmentation_dataframe,
    is_q_peak_dataframe,
)


[docs]class QPeakExtractionVanLien2013(BaseEcgExtractionWithHeartbeats, CanHandleMissingEventsMixin): """Algorithm to extract Q-peaks based on the detection of the R-peak, as suggested by Van Lien et al. (2013). The Q-peak is estimated by subtracting a fixed time interval from the R-peak location. The fixed time interval is defined by the parameter ``time_interval``. For more information on the algorithm, see [Van13]_. References ---------- .. [Van13] Van Lien, R., Schutte, N. M., Meijer, J. H., & De Geus, E. J. C. (2013). Estimated preejection period (PEP) based on the detection of the R-peak and dZ/dt-min peaks does not adequately reflect the actual PEP across a wide range of laboratory and ambulatory conditions. International Journal of Psychophysiology, 87(1), 60-69. https://doi.org/10.1016/j.ijpsycho.2012.11.001 """ # parameters time_interval_ms: Parameter[int] def __init__(self, time_interval_ms: int = 40, handle_missing_events: HANDLE_MISSING_EVENTS = "warn"): """Initialize new ``QPeakExtractionVanLien2013`` algorithm instance. Parameters ---------- time_interval_ms : int, optional Specify the constant time interval in milliseconds which will be subtracted from the R-peak for Q-peak estimation. Default: 40 ms handle_missing_events : one of {"warn", "raise", "ignore"}, optional How to handle missing data in the input dataframes. Default: "warn" """ super().__init__(handle_missing_events=handle_missing_events) self.time_interval_ms = time_interval_ms # @make_action_safe
[docs] def extract( self, *, ecg: EcgRawDataFrame | None, heartbeats: HeartbeatSegmentationDataFrame, sampling_rate_hz: float, ): """Extract Q-peaks from given ECG signal. The results are saved in the ``points_`` attribute of the super class. Parameters ---------- ecg: :class:`~pandas.DataFrame` ECG signal. Not used in this function since Q-peak is estimated from the R-peaks in the ``heartbeats`` DataFrame. heartbeats: :class:`~pandas.DataFrame` DataFrame containing one row per segmented heartbeat, each row contains start, end, and R-peak location (in samples from beginning of signal) of that heartbeat, index functions as id of heartbeat sampling_rate_hz: int Sampling rate of ECG signal in hz Returns ------- self Raises ------ :exc:`~biopsykit.utils.exceptions.EventExtractionError` If the event extraction fails and ``handle_missing`` is set to "raise" """ is_ecg_raw_dataframe(ecg) is_heartbeat_segmentation_dataframe(heartbeats) # TODO handle missing? # convert the fixed time_interval from milliseconds into samples time_interval_in_samples = int((self.time_interval_ms / 1000) * sampling_rate_hz) # get the r_peaks from the heartbeats Dataframe r_peaks = heartbeats[["r_peak_sample"]] # subtract the fixed time_interval from the r_peak samples to estimate the q_peaks q_peaks = r_peaks - time_interval_in_samples q_peaks.columns = ["q_peak_sample"] q_peaks = q_peaks.assign(nan_reason=pd.NA) q_peaks = q_peaks.astype({"q_peak_sample": "Int64", "nan_reason": "object"}) is_q_peak_dataframe(q_peaks) self.points_ = q_peaks return self