User Tools

Site Tools

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
    • Windows 10
    • Python 3.7.6

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 分別為
    • signal 為心電值得raw data
    • sampling_rate 為signal採樣的頻率,default = 1000Hz
    • show 為一是否畫圖的bool值,default = True

  • 圖一、show = True 會話出一張像上方的這種圖形 (Input 為 10秒的ecg data)
  • 回傳的值為剛好足以畫出上方的圖,可以進入他的biosppy.plotting.plot_ecg()看看圖是怎麼畫的,這邊不再贅述。
  • 然而從這邊return完的值可以知道並沒有HRV的feature值,是個相對使用pyHRV簡單的結果。

pyHRV

  • 在使用他的API前請先看一下這張圖
  • 可以看到這些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檔做讀檔即可。

TAGS

  • 36 person(s) visited this page until now.

Permalink blog/2024-04-15_share_hrv_analysis_python3_by_pyhrv_biosppy.txt · Last modified: 2024/04/15 15:46 by jethro

oeffentlich