Python-心電預處理
- 一、使用pandas讀取資料
- 1、資料說明
- 2、代碼呈現
- 二、畫心電圖
- 1、畫一條心電圖
- 2、畫多條心電圖
- 三、心電濾波
- 四、截取心拍
一、使用pandas讀取資料
1、資料說明
心電資料以csv檔案保存,有5條心電資料,每一行為一條,如下圖所示,畫出了第一條心電圖,

2、代碼呈現
使用pandas讀取csv檔案,將資料保存為二維陣列,讀取csv檔案時要特別注意檔案是否包含行索引和列標,
目標:讀一個 excel檔案========》陣列(10,5600)
第一種情況 沒有行索引 沒有列標
第二種情況 有行索引 沒有列標
第三種情況 沒有行索引 沒有列標
第四種情況 有行索引 有列索引
作者:周鵬 2020-10-26
"""
############################################################
# 第一種情況 沒有行索引 沒有列標
filename1 = "data1.csv"
data1 = pd.read_csv(filename1, header=None).values
print("第一種情況:", data1.shape)
# 第二種情況 有行索引 沒有列索標
filename2 = "data2.csv"
data2 = pd.read_csv(filename2, index_col=0, header=None).values
print("第二種情況:", data2.shape)
# 第一種情況 沒有行索引 有列索標
filename3 = "data3.csv"
data3 = pd.read_csv(filename3).values
print("第三種情況:", data3.shape)
# 第一種情況 有行索引 有列索標
filename4 = "data4.csv"
data4 = pd.read_csv(filename4, index_col=0).values
print("第四種情況:", data4.shape)
運行結果

二、畫心電圖
1、畫一條心電圖
import matplotlib.pyplot as plt
import pandas as pd
"""
任務1:資料切片
每一個人資料長度:(1,5600)
任務2:畫出心電
作者:周鵬 2020-10-26
"""
filename = "data1.csv"
data = pd.read_csv(filename, header=None).values
#################################################
# 任務1:資料切片shape
data1 = data[0, :] # 取出第一條心電資料
print("第一個人的資料長度:", data1.shape)
# 任務2:資料顯示
plt.title("the first one")
plt.plot(data1)
plt.xlabel("current/mv")
plt.ylabel("time/s")
plt.show()

2、畫多條心電圖
def heart_plot(data):
for i in range(10):
plt.subplot(10, 1, i + 1)
plt.plot(data[i, :])
plt.show()
heart_plot(data)

三、心電濾波
濾波的目的是去出噪音,使心電波形更加平滑,這里用到了第三方庫heartpy(添加鏈接描述),它是專門用于處理心電資料的python庫,
import heartpy as hp
import pandas as pd
import matplotlib.pyplot as plt
"""
高通濾波
低通濾波
帶通濾波
作者:周鵬 2020-10-26
"""
filename = "data1.csv"
data = pd.read_csv(filename, header=None).values
data = hp.scale_data(data)
data1 = data[0, :]
# 高通濾波 >0.75hz
data1_high = hp.filter_signal(data1, cutoff=0.75, sample_rate=500.0, order=3, filtertype='highpass')
# 低通濾波 <15hz
data1_low = hp.filter_signal(data1, cutoff=15, sample_rate=500.0, order=3, filtertype='lowpass')
# 帶通濾波 [0.75, 15]
data1_band = hp.filter_signal(data1, cutoff=[0.75, 15], sample_rate=500.0, order=3, filtertype='bandpass')
plt.subplot(4, 1, 1)
plt.title("origial dada")
plt.plot(data1)
plt.subplot(4, 1, 2)
plt.title("data_high")
plt.plot(data1_high)
plt.subplot(4, 1, 3)
plt.title("data_low")
plt.plot(data1_low)
plt.subplot(4, 1, 4)
plt.title("data_band")
plt.plot(data1_band)
plt.show()

四、截取心拍
import heartpy as hp
import pandas as pd
import matplotlib.pyplot as plt
"""
截取心拍
作者:周鵬 2020-10-26
"""
filename = "data1.csv"
data = pd.read_csv(filename, header=None).values[0, :]
data = hp.scale_data(data)
# 自動獲取R波位置
working_data, measures = hp.process(data, 500.0)
hp.plotter(working_data, measures)
自動獲取R波位置,并用點標出,

截取心拍
# 獲取R波對應的下標
peaklists = working_data['peaklist']
# 去頭去尾 因為頭尾資料不一定是完整的
peaklists = peaklists[1:-1]
print("所有R波對應的下標:", peaklists)
# 獲取心拍
for i in peaklists:
tem_data = data[i - 150:i + 150]
plt.plot(tem_data)
title = str(i)
plt.title(title)
plt.show()
畫出其中一個心拍
今天就分享這些內容!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/200983.html
標籤:java
上一篇:我的Python生涯
