본문 바로가기
Health/심전도(ECG) 분석

2. ECG 데이터 클린징 (Revised)

by 꼰대코더 2023. 12. 7.

디바이스 : Polar H10

취득앱     : Android Polar Equine

일시         : 2023/12/07 18시 10분에서 5분간 정

자세         : 기립한 자세로 특별한 움직임은 없었음
헤더의 비데이터 부분은 삭제

HEADER START
USER:
DATE/TIME: 12.7.23 18.15.02
DEVICE_ID: B8D32221 DEVICE_VERSION: 3.2.0  APP_VERSION: 1.2.2
CHANNELS:HR RR MS SKINCONTACT
HEADER END
0.808 413 
1.091 420 
1.538 428 
1.593 436 
1.04 444 

 

1. Header 삭제

 

2. 데이터 구조 
    [ECG 강도(mV)] [Milli Second] [스페이스]

    마지막에 쓸데없는 스페이스가 붙어 있다. pandas에서 sep=' ' 로 읽어 들일시 스페이스가 더미 칼럼으로 생성된다.

 

3. pandas 로 읽어 들이기

    스페이스로 구분했을때 3번째 칼럼으로 더미가 생기기 때문에 일단 'dummy' 라는 헤더로 읽어 들인다.

import pandas as pd

df = pd.read_csv('ECG_12.7.23_18.15.02.csv', sep=' ', names=['mV', 'ms', 'dummy'])
df.head()
      mV   ms  dummy
0  0.808  413    NaN
1  1.091  420    NaN
2  1.538  428    NaN
3  1.593  436    NaN
4  1.040  444    NaN

 

4. ms, dummy 칼럼을 삭제

    inplace=True 옵션을 넣어서 자체적으로 칼럼을 삭제
    ※ sample Hz를 알기 때문에 ms 도 불필요

df.drop(['ms','dummy'], axis=1, inplace=True)
      mV   
0  0.808
1  1.091
2  1.538
3  1.593
4  1.040

 

5. 초기는 노이즈가 많기 때문에 30초를 건너뜀

data = self.product._data["mV"].to_numpy()
# 초기 30초 버리기 -> 샘플링 수 x 30초
skip_secs = 130 * 30
data = data[skip_secs:]

 

6. 일부(1000 ~ 2000 로우)를 그래프로 표현

plt.title("ECG 130Hz")
plt.plot(data, color='blue', label='Raw')
plt.xlabel("Time miliseconds")
plt.xlim(0,3000)
plt.legend()
plt.show()

'Health > 심전도(ECG) 분석' 카테고리의 다른 글

6. Heart Rate Variability (HRV)  (1) 2024.01.07
5. R-R Intervals  (1) 2024.01.07
4. Peak(R) detection (Revised)  (0) 2023.12.13
3. 시그널 전처리 (Revised)  (1) 2023.12.09
1. 심전도 분석에 관해  (2) 2023.12.03