医学数据预处理操作流程

医学数据预处理

本次任务的目的是处理PO2,PCO2两个指标。这两个指标均为病人的血气指标,以一定的时间间隔采集。一个病人一次住院期间可能收集一次或者多次。要求,按照采集时间的前后顺序,汇总每个病人每次住院期间的所有的pO2, pCO2指标值。涉及到的预处理方法包括插值,去噪,缺失值填充,离群点数据处理,可视化等。
一、初始化程序代码

import pandas as pd
import matplotlib.pyplot as plt
from random import sample
import numpy as np

%matplotlib inline

设置可视化风格

plt.style.use(‘tableau-colorblind10’)

设置字体为黑体

plt.rcParams[‘font.sans-serif’] = [‘SimHei’]

二、数据提取过程
1.数据提取

根据采集时间来读取数据

df = pd.read_csv(‘mini_label_events.csv’, index_col=‘CHARTTIME’)

筛选出po2和pco2数据

po2 = df.query(‘ITEMID in [490, 3785, 3837, 50821]’)
pco2 = df.query(‘ITEMID in [3784, 3835, 50818]’)

创建DateFrame来存储数据

a1 = pd.DataFrame()
a1[“PO2”] = po2[“VALUENUM”]
a1[“PCO2”] = pco2[“VALUENUM”]
a1[“SUBJECT_ID”] = po2[“SUBJECT_ID”]
a1[“HADM_ID1”] = po2[“HADM_ID”]
a1[‘采集时间’] = a1.index

重置索引

a1.reset_index()

根据采集时间从早到晚排序

a1.sort_values(by=‘CHARTTIME’, inplace=True)

插入序号并设置索引

a1.insert(1, ‘序号’, range(1, len(a1) + 1))
a1.set_index(‘序号’, inplace=True)
a1.reset_index(drop=True)
a1

运行结果:

2.提取CHART表格中PO2和PCO2数据

df1 = pd.read_csv(‘mini_chart_events.csv’,
low_memory=False, index_col=“CHARTTIME”)

筛选出po2和pco2数据

po2 = df2.query(‘ITEMID490 | ITEMID3785 | ITEMID3837 | ITEMID50821’)

po2 = df1.query(‘ITEMID in [490, 3785, 3837, 50821]’)
pco2 = df1.query(‘ITEMID in [3784, 3835, 50818]’)

这里存在重复时间索引,删除前面一个,保留最后一个

po2 = po2.reset_index().drop_duplicates(
subset=‘CHARTTIME’, keep=‘last’).set_index(‘CHARTTIME’)
pco2 = pco2.reset_index().drop_duplicates(
subset=‘CHARTTIME’, keep=‘last’).set_index(‘CHARTTIME’)

创建DateFrame来存储数据

a2 = pd.DataFrame()
a2[“PO2”] = po2[“VALUENUM”]
a2[“PCO2”] = pco2[“VALUENUM”]
a2[“SUBJECT_ID”] = po2[“SUBJECT_ID”]
a2[“HADM_ID1”] = po2[“HADM_ID”]
a2[‘采集时间’] = a2.index

重置索引

a2.reset_index()

根据采集时间从早到晚排序

a2.sort_values(by=‘CHARTTIME’, inplace=True)

插入序号并设置索引

a2.insert(0, ‘序号’, range(1, len(a2) + 1))
a2.set_index(‘序号’, inplace=True)
a2

运行结果:

3.最小采集时间间隔

根据病人ID和不同住院时间的ID进行分组

group = a1.groupby([“SUBJECT_ID”, “HADM_ID1”])

提取采集时间大于1的组别(只有2个时间以上才能求间隔)

tem_list = []
for key, item in group[‘采集时间’]:
if item.count() > 1:
tem_list.append(item)

提取各组的所有采集时间间隔

interval_list = []
for i in range(len(tem_list)):
tem_list[i].sort_values(ascending=False, inplace=True) # 对采集时间进行从大到小的排序
for j in range(tem_list[i].count() - 1):
interval = pd.to_datetime(
tem_list[i].iloc[j]) - pd.to_datetime(tem_list[i].iloc[j+1])
interval_list.append(interval)

min(interval_list)

运行结果:

三、插值
1.对LABEVENTS表进行插值

ipl1 = pd.DataFrame() # 用来存储插值后的结果

for key, item in group:
item.set_index(‘采集时间’, inplace=True)
item.index = pd.to_datetime(item.index)
# 设置重采样时间间隔为1min,该时间由上面选取得到
ev_ipl = item.resample(‘1min’).interpolate() # 这里使用默认的线性插值
ipl1 = pd.concat([ipl1, ev_ipl], axis=0)

重置索引

ipl1.reset_index(inplace=True)

插入序号并设为索引

ipl1.insert(0, ‘序号’, range(1, 1 + len(ipl1)))
ipl1.set_index(‘序号’, inplace=True)

更换顺序

order = [‘PO2’, ‘PCO2’, ‘SUBJECT_ID’, ‘HADM_ID1’, ‘采集时间’]
ipl1 = ipl1[order]
ipl1

运行结果:

2.对CHARTEVENTS表进行插值

ipl2 = pd.DataFrame() # 用来存储插值后的结果

根据病人ID和不同住院时间的ID进行分组

group2 = a2.groupby([“SUBJECT_ID”, “HADM_ID1”])
for key, item in group2:
item.set_index(‘采集时间’, inplace=True)
item.index = pd.to_datetime(item.index)
# 设置重采样时间间隔为1min,该时间由上面选取得到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值