meta00 / vital_sqi

A package for physiological signal quality control
MIT License
30 stars 11 forks source link

Vital_sqi: Signal quality control of physiological signals

Build Status codecov Documentation Status PyPI version License: MIT

Description

Vital_sqi is a Python package for signal quality index (SQI) extraction and quality assignment for ECG and PPG waveforms. The package provides:

  1. Support PPG and ECG waveforms in various data formats extracted from wearables.
  2. Unified point of access for the current state-of-the-art SQIs: standard statistics, HRV, RR interval, and waveform based SQIs.
  3. Rule-based classification of signal quality using user-defined thresholds for the extracted SQIs per signal segment.
  4. Pipeline and GUIs for SQI extraction and quality assignment.

Prerequisites and Installation

The package works with Python 3.7 and Python 3.8.

pip install vital-sqi

Getting started

The package is built around three classes: SignalSQI Rule Ruleset

  1. signal_obj SignalSQI object, has the following attributes:
    • signal_obj.signal containing waveform data (pandas dataframe).
    • signal_obj.sampling_rate containing sampling rate, either input by user or automatically inferred from the waveform.
    • signal_obj.sqis containing SQIs (pandas dataframe) that are derived by functions of vital_sqi.sqi modules or an external table, with SQI values as columns and signal segments as rows. After signal classification, decision of accept or reject for each signal segment is in decision column. If signal segmentation is done with the package, the table will contain also coordinates in column start and end.
    • signal_obj.rules and signal_obj.ruleset containing a list of rules and a ruleset used for signal classification.
  2. rules list of Rule objects, in which each corresponds to an SQI and contains thresholds for quality assignment. Rules could be read into signal_obj from .json file in the following format:
    "test_sqi": {
        "name": "test_sqi",
        "def": [
            {"op": ">", "value": "10", "label": "reject"},
            {"op": ">=", "value": "3", "label": "accept"},
            {"op": "<", "value": "3", "label": "reject"}],
        "desc": "",
        "ref": ""
    }
  3. ruleset object of class Ruleset contains a set of selected rules (selected from the list of rules in signal_obj.rule) and the order to apply them in quality assignment (see schema below). Notice that this is not a tree-based classification.

Example of a rule set

Pipelines

The package includes two pipelines for ECG (similarly for PPG) data as follows:

We also provide an GUI to easily define rule and ruleset, and execute them with an input SQI table (Help - hyperlink to readthedocs)

Main steps

Following are the main steps to use the package for SQI extraction and signal classification. For details, see the documentation.

1. Reading/Writing

Signal waveform is read into an object of SignalSQI class and written to the following format using vital_sqi.data module.

2.Preprocessing and segmentation vital_sqi.preprocessing allows doing:

3. SQI extraction

The implemented SQIs, vital_sqi.sqi module, are divided into 4 groups:

The function vital_sqi.pipeline_function.extract_sqi is used to extract a number of SQIs from segments. The requested SQIs are defined in a json file called SQI dictionary. We provide a dictionary template for all implemented SQIs, with default parameters, in vital_sqi/resource/sqi_dict.json.

4. Quality classification

The package allows making rule set from SQIs and user-defined thresholds for quality classification. A segment assigned as accept pass all rules in the set, otherwise reject. Rules in the set have ordered, which might help to improve speed.

We ran brute force threshold searching for an in-house PPG dataset (generated with Smartcare, doubly annotated by domain experts) to obtain a set of recommended thresholds, as found in resource/rule_dict.json.

References