blog:2024-04-15_share_hrv_analysis_python3_by_pyhrv_biosppy
2024-04-15 Share: [HRV Analysis](python3) by pyHRV, BioSPPy
Local Backup
近期在用python做HRV(Heart Rate Variability)的初步分析,僅此紀錄一下
過程中找到這兩個好用的open source package,分別是pyHRV 和 BioSPPy。
這篇文章主要會聚焦在我在使用這兩個package時候遇到的問題。
Environment
Install package
在安裝這兩個套件的時候都沒什麼問題,在CMD中分別輸入以下指令安裝即可
python -m pip install pyHRV
python -m pip install biosppy
BioSPPy
-
套件可以分析bvp ecg eda eeg emg resp等類型的資料
這邊主要針對ecg心電圖的部份
Returns = biosppy.signals.ecg.ecg(signal=None, sampling_rate=1000.0, show=True)
"""
Returns
-------
ts : array / Signal time axis reference(seconds).
(資料對應的時間陣列)
filtered : array / Filtered ECG signal.
(濾波後的資料陣列)
rpeaks : array / R-peak location indices.
(R-peak所在的 index 陣列)
templates_ts : array / Templates time axis reference(seconds).
(templates對應的時間陣列)
templates : array / Extracted heartbeat templates.
(心電圖模板,如下右圖)
heart_rate_ts : array / Heart rate time axis reference(seconds).
(每分鐘心律對應的時間陣列)
heart_rate : array / Instantaneous heart rate (bpm).
(每分鐘的心律資料陣列)
"""
Parameters 分別為
圖一、show = True 會話出一張像上方的這種圖形 (Input 為 10秒的ecg data)
回傳的值為剛好足以畫出上方的圖,可以進入他的biosppy.plotting.plot_ecg()看看圖是怎麼畫的,這邊不再贅述。
然而從這邊return完的值可以知道並沒有HRV的feature值,是個相對使用pyHRV簡單的結果。
pyHRV
-
-
-
可以看到這些API共分成3層,使用越高層的API會一口氣呼叫其下層的API,可以計算更多的feature但也會相對地耗時
因為實驗需求的關係,專案需要real time 的分析其中兩個parameter 分別是 time_domain的 SDNN 與 frequency_domain 的 logLF
如果直接呼叫
Returns = pyhrv.hrv(signal)
會非常的耗時,所以若僅要使用少部份features可以直接呼叫上圖Parameter (Level 3) 的方法,以SDNN 和 logLF 為例:
#parameter nni : array / NN-intervals (ms or s)
SDNN = pyhrv.time_domain.sdnn(nni)['sdnn']
lnLF =
pyhrv.frequency_domain.welch_psd(nni = nni,
mode='dev')[0]['fft_log'][1]
#當mode = 'dev'的時候就不會畫圖,共有三種mode,可依需求去選擇
這邊可以看到他需要的input是nni(NN-intervals),並不是我們原本的signal,所以要先將nni運算出來,這邊就可以先用BiosPPy的ecg()得到R-Peaks indices的值。
這是在pyHRV的
官網中計算intervals的範例 # Import packages
import biosppy
import pyhrv.tools as tools
from opensignalsreader import OpenSignalsReader
# Load sample ECG signal stored in an OpenSignals file
signal = OpenSignalsReader('SampleECG.txt').signal('ECG')
# Get R-peak locations (and hide the ECG plots)
rpeaks = biosppy.signals.ecg.ecg(signal, show=False)[2]
# Compute NNI parameters
nni = tools.nn_intervals(rpeaks)
但是這邊有一點是必須注意的,就是上面的資料Sample Rate預設是1000,而我的資料集的Sample Rate是2048,所以最後一行要修正成
nni = tools.nn_intervals(rpeaks) / 2.048
處理好這邊的nni 就可以放心的去用Level 3 的各式API了 !
而Level 1 的 pyHRV.hrv()就沒有這個問題,因為其中有個sample_rate 的 parameter可以改,但這邊預設也是 1000 就是了。
結論
1、官方的文件至少要先從前面掃過一遍阿…一開始不知道有level 3 的API可以call,一直在想要怎麼加快速度,結果浪費了一大堆時間
2、也發現了pyplot在畫圖上只要有call到show(),原本其他function畫好圖的東西,就算該function 的 show = False 還是會將全部得圖畫出來。我的狀況是我只要針對我要的資料畫出一張圖,但在算pyHRV Frequency domain的時候就算show的bool值設成 False 他還是會先畫好但是沒有show出來而已,這部分的code biosppy就寫的比較好,若show = False就完全不畫圖。不過pyHRV也是有個參數可以調整,mode = 'dev' 就不會畫圖了 (不過我一開始沒注意到也是花了我很多時間)
以上大概就是一堆很簡單的問題但是花了我超多時間的心得…這邊附上一張我最後的成果圖嗚嗚。
上面兩張圖是Resp的資料不是ecg的,但比較簡單就沒說了XD
附註補充一下在這之中發現plt的Figures可以不只是存成png,可以用一個Pickle的套件存下來存成後來讀取還是可以互動的Figure,但還是得用python讀取就是了,教學連結在
這邊。後續單純讀圖應用的話應該可以直接寫成一個簡單的py檔做讀檔即可。
Permalink blog/2024-04-15_share_hrv_analysis_python3_by_pyhrv_biosppy.txt · Last modified: 2024/04/15 15:46 by
jethro