MIMIC-IV数据分析 - 使用Python进行心脏病案例分析

图片

 数据来源:PostgreSQL数据库

我们首先需要导入一些用于在 Python 中处理数据的工具。

  • NumPy : 用于处理数字

  • Pandas: 用于分析数据 

  • MatPlotLib:用于制作绘图 

  • psconpg2: 用于连接到数据库

安装

pip install psycopg2  pandas matplotlib  numpy

图片

连接数据库

我们可以使用 psycopg2 库连接到 MIMIC 数据库一旦建立连接,我们将运行一个简单的 SQL 查询

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport psycopg2
schema_name = 'mimic'# 连接到MIMIC-IV数据库conn = psycopg2.connect(dbname='mimiciv', user='postgres', password='mimic',                        host='10.234.211.51', port=5432)query_schema = 'SET search_path to ' + schema_name + ';'


# # 设置查询语句# # 我们选择从mimiciv_hosp.admissions表中提取hadm_id等于10006的行。# # 在写sql代码时,最好先执行“set search_path to mimiciv" 随后的所有操作均不需要指明表格的位置;否则,任何操作都应该在表格名前面加前缀mimicivquery1 = query_schema + 'SELECT subject_id, hadm_id, admittime, dischtime, admission_type FROM  mimiciv_hosp.admissions'
# 运行查询并将结果分配给变量admissions_pd = pd.read_sql_query(query1,conn)admissions_pd.head()print(admissions_pd.head())

图片

图片

图片

一、查询出患者住院信息(随时间变化)

我们之前 【重要】MIMIC-IV表结构详解(一) 讲到 , chartevents表主要记录了患者临床治疗和检测结果,用于图表展示

图片

加载 chartevents数据

Chartevents 表包含在患者临床的数据。它包括心率、呼吸频率、温度等变量。

图片

但是该表没有具体什么疾病和指标,所以我们需要将它和mimiciv_icu.d_items表联表查询, 他们 是用itemid关联

图片

但是要想查询随时间变化的心脏相关指标,比如心率、呼吸频率等,我们需要知道患者的入院时间 intime (icustay表里面) 和 指标记录时间charttime (chartevents表里面),把这两个表关联查询, 用charttime - intime就得到了入院以后几小时后各时刻的指标

图片

DATETIME_DIFF : MIMIC数据提取教程 - 官方提供的时间函数(一)

图片

图片

图片

检查患者的心率(通过筛选label来实现)

  • 我们可以使用列名称选择各个列

  • 例如,如果我们只想选择标签列,我们可以写 ce.LABEL 或 ce['LABEL']

图片

图片

以类似的方式,我们可以使用索引从数据中选择行

例如,要选择标签等于“心率”的行,我们将使用 ce[ce['label'].str.contains('Heart Rate')]选取含有heart rate的label数据

图片

图片

二、图 1:患者的心率如何随时间变化?

我们可以创建 x 和 y 轴值来创建心率时间序列图。

图片

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport psycopg2
schema_name = 'mimic'# 连接到MIMIC-IV数据库conn = psycopg2.connect(dbname='mimiciv', user='postgres', password='mimic',                        host='10.241.148.228', port=5432)query_schema = 'SET search_path to ' + schema_name + ';'
# # # 设置查询语句# # # 我们选择从mimiciv_hosp.admissions表中提取hadm_id等于10006的行。# # # 在写sql代码时,最好先执行“set search_path to mimiciv" 随后的所有操作均不需要指明表格的位置;否则,任何操作都应该在表格名前面加前缀mimiciv# query1 = query_schema + 'SELECT subject_id, hadm_id, admittime, dischtime, admission_type FROM  mimiciv_hosp.admissions'## # 运行查询并将结果分配给变量# admissions_pd = pd.read_sql_query(query1,conn)# admissions_pd.head()# print(admissions_pd.head())
query = """

SELECT de.stay_id  , mimiciv_derived.datetime_diff(de.charttime, ie.intime, 'HOUR' ) AS HOURS  , di.label  , de.value  , de.valuenum  , de.valueuomFROM mimiciv_icu.chartevents deINNER join  mimiciv_icu.d_items diON de.itemid = di.itemidINNER join  mimiciv_icu.icustays ieON de.stay_id = ie.stay_idWHERE de.stay_id = 30121190ORDER BY charttime;

"""
ce = pd.read_sql_query(query, conn)
# OPTION 2: load chartevents from a CSV file# ce = pd.read_csv('data/example_chartevents.csv', index_col='HOURSSINCEADMISSION')ce.head()
# ce.label# print(ce.label)

# Select just the heart rate rows using an index

d = ce[ce['label'].str.contains('Heart Rate')]
# d = ce[ce['label'].str.contains('Respiratory Rate')]

# Set x equal to the timesx_hr = d['hours']
# Set y equal to the heart ratesy_hr = d['valuenum']
# Plot time against heart rateplt.figure(figsize=(14, 6))plt.plot(x_hr, y_hr)

plt.xlabel('Time (hours)', fontsize=16)plt.ylabel('Heart rate (bpm)', fontsize=16)plt.title('Heart rate over time from admission to the intensive care unit')# plt.ylabel('Respiratory Rate', fontsize=16)# plt.title('Respiratory Rate over time from admission to the intensive care unit')plt.show()

图片

思考:该患者心率发生了怎样的变化?

三、图 2:绘制该患者随时间变化的呼吸频率

因为我们开始已经用SQL筛选出该患者的住院信息,只需要修改上面python代码

图片

图片

图片

思考:该患者呼吸率有没有问题?

以上python代码关注【科研收录】, 回复 "心率和呼吸率" 获得

四、 图 3:患者的生命体征是否超出任何警报阈值?

  • 重症监护室的警报系统通常基于护理人员定义的高阈值和低阈值

  • 误报通常是一个问题,因此可以任意设置阈值以减少警报。

  • 因此,警报设置携带的信息有限。

修改上面的代码 , 通过label筛选数据

图片

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport psycopg2
schema_name = 'mimic'# 连接到MIMIC-IV数据库conn = psycopg2.connect(dbname='mimiciv', user='postgres', password='mimic',                        host='10.241.148.228', port=5432)query_schema = 'SET search_path to ' + schema_name + ';'
# # # 设置查询语句# # # 我们选择从mimiciv_hosp.admissions表中提取hadm_id等于10006的行。# # # 在写sql代码时,最好先执行“set search_path to mimiciv" 随后的所有操作均不需要指明表格的位置;否则,任何操作都应该在表格名前面加前缀mimiciv# query1 = query_schema + 'SELECT subject_id, hadm_id, admittime, dischtime, admission_type FROM  mimiciv_hosp.admissions'## # 运行查询并将结果分配给变量# admissions_pd = pd.read_sql_query(query1,conn)# admissions_pd.head()# print(admissions_pd.head())
query = """

SELECT de.stay_id  , mimiciv_derived.datetime_diff(de.charttime, ie.intime, 'HOUR' ) AS HOURS  , di.label  , de.value  , de.valuenum  , de.valueuomFROM mimiciv_icu.chartevents deINNER join  mimiciv_icu.d_items diON de.itemid = di.itemidINNER join  mimiciv_icu.icustays ieON de.stay_id = ie.stay_idWHERE de.stay_id = 30121190ORDER BY charttime;

"""
ce = pd.read_sql_query(query, conn)
# OPTION 2: load chartevents from a CSV file# ce = pd.read_csv('data/example_chartevents.csv', index_col='HOURSSINCEADMISSION')ce.head()
# ce.label# print(ce.label)

# Select just the heart rate rows using an index

# d = ce[ce['label'].str.contains('Heart Rate')]
r = ce[ce['label'].str.contains('Respiratory Rate')]h = ce[ce['label'].str.contains('Resp Alarm - High')]l = ce[ce['label'].str.contains('Resp Alarm - Low')]
plt.figure(figsize=(14, 6))plt.plot(r['hours'], r['valuenum'], 'k+', markersize=10, linewidth=4)plt.plot(h['hours'], h['valuenum'], 'm--')plt.plot(l['hours'], l['valuenum'], 'm--')
plt.xlabel('Time(hours)',fontsize=16)plt.ylabel('Respiratory rate(insp/min)',fontsize=16)plt.title('Respiratory rate over time from admission, with upper and lower alarm thresholds')plt.ylim(0,55)plt.show()

图片

思考 :根据数据,该患者30121190 是否会触发警报?

我们换个患者再查询下, 修改SQL, stay_id 换成31959184

图片

图片

以上python代码关注【科研收录】, 回复 "呼吸率阈值" 获得

下一章我们将继续讲解 心脏病案例分析, 尽请期待

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值