数据来源:PostgreSQL数据库
我们首先需要导入一些用于在 Python 中处理数据的工具。
-
NumPy : 用于处理数字
-
Pandas: 用于分析数据
-
MatPlotLib:用于制作绘图
-
psconpg2: 用于连接到数据库
安装
pip install psycopg2 pandas matplotlib numpy
连接数据库
我们可以使用 psycopg2 库连接到 MIMIC 数据库一旦建立连接,我们将运行一个简单的 SQL 查询
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import 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" 随后的所有操作均不需要指明表格的位置;否则,任何操作都应该在表格名前面加前缀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())
一、查询出患者住院信息(随时间变化)
我们之前 【重要】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 np
import pandas as pd
import matplotlib.pyplot as plt
import 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.valueuom
FROM mimiciv_icu.chartevents de
INNER join mimiciv_icu.d_items di
ON de.itemid = di.itemid
INNER join mimiciv_icu.icustays ie
ON de.stay_id = ie.stay_id
WHERE de.stay_id = 30121190
ORDER 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 times
x_hr = d['hours']
# Set y equal to the heart rates
y_hr = d['valuenum']
# Plot time against heart rate
plt.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 np
import pandas as pd
import matplotlib.pyplot as plt
import 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.valueuom
FROM mimiciv_icu.chartevents de
INNER join mimiciv_icu.d_items di
ON de.itemid = di.itemid
INNER join mimiciv_icu.icustays ie
ON de.stay_id = ie.stay_id
WHERE de.stay_id = 30121190
ORDER 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代码关注【科研收录】, 回复 "呼吸率阈值" 获得
下一章我们将继续讲解 心脏病案例分析, 尽请期待