之前我们讲解了如何提取MIMIC-IV数据数据:
MIMIC数据库提取教程-提取某种疾病下的患者人口统计学指标
这种直接SQL提取方式很直接,但是不是最好的方式也不利于数据的进一步统计分析、可视化和预测分析, 所以我们这里讲解下:
如何用python语言连接我们装好的数据库,并做简单的数据可视化(图表展示)
本文主要是将MIMICIII版本官方代码内的教程升级成mimic-iv版本 , 不同之处在于两点
-
数据读取方式: MIMICIII教程使用的直接读取csv文档的方式, 我们这里连接数据
-
数据和代码更新:因mimic-iv数据表更新了很多,所以可视化代码也需要更新
数据来源:PostgreSQL数据库
前置条件, 学会安装python环境、anconda代码包集成环境、ide编辑器(本期文章)
一、连接mimic-iv数据库
1.1 安装psycopg2
包
主要三种方式
Pycharm编辑器
嫌费事的同学也可直接安装Anaconda集成环境
也可用命令行工具pip 安装 (安装python环境后自带)
pip install psconpg2 pandas
1.2 导入包、连接数据库、查看所有表名
import psycopg2
设置数据库连接的基本信息
database_name ='mimic' # 数据库名
schema_name ='mimiciv' # schema名
host = "localhost" # 主机地址, 本地安装的一般是localhost
port = 5432 # 端口, pg默认端口是5432
user_name ='postgres' # 用户名, 用你自己创建的用户名, 一般默认是root
password = "mimic"# 密码,用你自己创建的密码
query_schema = 'set search_path to '+schema_name+';'
连接PostgreSQL的mimic数据库
pg_conn = psycopg2.connect(host= host, port=port, dbname=database_name, user=user_name, password=password)
cur = pg_conn.cursor()
cur.execute(query_schema)
列出mimic
数据库schema为mimiciv
下所有的表的表名
mimiciv_icu
cur.execute("""
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'mimiciv_icu'
""")
for i,table in enumerate(cur.fetchall()):
print('表',i,':',table[0])
mimiciv_hosp
1.3 读取表paitients
的内容并探索数据
该表记录了患者的个人基本信息。
首先,我们定义查询语句,然后读取查询并将结果存成dataframe类型。(panda包提供的一种数据类型,日常用于各种数据分析使用)
query = query_schema + """
SELECT * FROM mimiciv_hosp.patients;
"""
patients_df = pd.read_sql_query(query,pg_conn)
patients_df.head()
结果
可以看出该patients表包含了患者以下的信息:
-
SUBJECT_id
:与表icustays
、admissions
关联的键 -
Gender
:性别 -
anchor_age:是anchor_year 中患者的年龄。如果患者的anchor_age在anchor_year中超过89岁,那么他们的anchor_age将设置为91,无论他们的实际年龄有多大。
-
anchor_year:是患者的转移年份。
-
anchor_year_group:是一个年份范围 - 患者的anchor_year发生在此范围内。
-
dod:社会保障数据库中记录的死亡日期
我们可以使用pandas包自带的总结信息函数来查看数据集的统计信息,也可以使用pandas profiling来直接生成升级版的报告查看。
这里我们先用pandas自带的函数来进行数据集探索。
patients_df.shape # 行数、列数
patients_df.describe()
patients_df.info()
查看每一列是否有缺失值
patients_df.isna().any()
结果
符合数据表信息
或者查看每一列缺失了多少数据
patients_df.isna().sum()
结果
这个情况在该数据集是正常的,因为dod代表患者死亡时间,死亡患者毕竟是少数
1.4 读取表icustays
的内容并探索数据
该表记录了重症监护病房入院记录的信息,主要是入院和出院时间。
-
subject_id:患者的唯一标识符。
-
hadm_id:入院号,表示患者的住院标识符。
-
stay_id:留观号,指患者在医院中的留观期间的唯一标识符。
-
first_careunit:首次护理单元,表示患者在住院期间所在的第一个护理单元。
-
last_careunit:最后护理单元,表示患者在住院期间所在的最后一个护理单元。
-
intime:入院时间,指患者入院的时间。
-
outtime:出院时间,表示患者出院的时间。
-
los:住院天数,表示患者在医院中的住院天数。
这次,我们利用pandas profiling来查看数据集的详细报告。信息包括
-
数据集的基本信息,变量类型;
-
各个特征字段数据的统计分析、相关性分析;
-
数据集的头和尾的数据样例展示。
是不是很赞!😄
结果:
公众号后台回复【可视化报告代码01】获取写好的代码,
此代码需要修改自己的数据库地址
conn = psycopg2.connect(dbname='', user='', password='',
host='', port=5432)
二、数据可视化
现在,我们来用这些数据集创建可视化的图表
import matplotlib.pyplot as plt
%matplotlib inline
我们从PostgreSQL数据库读取表mimiciv_hosp.d_icd_diagnoses的数据,
此表包含了国际疾病分类(ICD)的诊断编码资讯,用于记录病患的诊断情况
# #设置查询语句
# # 我们选择从mimiciv_hosp.admissions表中提取hadm_id等于10006的行。
# # 在写sql代码时,最好先执行“set search_path to mimiciv" 随后的所有操作均不需要指明表格的位置;否则,任何操作都应该在表格名前面加前缀mimiciv
query1 = query_schema + 'SELECT icd_code, long_title FROM mimiciv_hosp.d_icd_diagnoses'
# # 病患住院记录表数据可视化
# # 执行查询语句
a = pd.read_sql_query(query1, conn)
a.head()
print(a.head())
结果
2.1. 国际疾病分类内容的词云
准备可视化要用的text字符串列表, 安装并引入worldcloud包
pip install wordcloud
from wordcloud import WordCloud
text = str(a['long_title'].values)
len(text) # 有多少疾病名称
print(len(text))
运行结果
生成worldcloud对象
wordcloud = WordCloud().generate(text)
绘制词云图
plt.figure(figsize = (8,8))
plt.imshow(wordcloud, interpolation = 'bilinear')
plt.axis("off")
plt.show()
可以看到疾病标题内容中,弧菌(vibriodue)、霍乱cholera)高频出现。
2.2. 患者住院类型的住院时间分布
我们再从PostgreSQL数据库读取表mimiciv_hosp.admissions的数据
患者在住院的时候患者的婚姻状况:离异(divorced)、已婚(married)、single(单身)、丧偶(widowed)。
# # 设置查询语句
# # 我们选择从mimiciv_hosp.admissions表中提取hadm_id等于10006的行。
# # 在写sql代码时,最好先执行“set search_path to mimiciv" 随后的所有操作均不需要指明表格的位置;否则,任何操作都应该在表格名前面加前缀mimiciv
query1 = query_schema + 'SELECT marital_status, hadm_id FROM mimiciv_hosp.admissions'
# query2 = query_schema + 'SELECT * FROM mimiciv_hosp.patients LIMIT 100'
# # 病患住院记录表数据可视化
# # 执行查询语句
a = pd.read_sql_query(query1, conn)
a.columns = map(str.lower, a.columns)
print(a.groupby(['marital_status']).count())
# df.groupby(['marital_status']).count()相当于统计marital_status出现的次数
# 相当于获得了一个marital_status出现了多少次,返回一个series
# 注意mimiciii里面这里用的row_id, 表示唯一行标识符, mimiciv里面没有,但是可以用hadm_id替代, 因为是hadm_id患者每次住院的身份识别号,每住一次都有个新的,真好对应上数据记录. (所以其实时间也可以,因为精确到秒,基本可以看做唯一)
# 绘制病状图, 看marital_status的分布
a.groupby(['marital_status']).count()['hadm_id'].plot(kind='pie', autopct='%.1f%%')
plt.show()
a.columns = map(str.lower, a.columns)
a.groupby(['marital_status']).count()
a.groupby(['marital_status']).count()['hadm_id'].plot(kind='pie', autopct='%.1f%%')
2.3. 患者不同的住院类型在icu平均停留时长
不同住院类型在admission表的admission_type表示
icu停留时间(icu住院天数)
你可以选择在read_sql_query()阶段就将两表进行关联,也可以选择在分别读取表之后利用pandas数据集的操作对两个dataframe进行关联操作。
这里我们就用之前已经读取好的a(admission表dataframe数据)和p(icustay表dataframe数据)数据集,基于列subject_id
、hadm_id
进行merge操作。
# 关联病人住院信息数据集和病人在icu的停留时间数据集
# on: 两个数据集
merge = pd.merge(a, b, on=['subject_id','hadm_id'])
# 基于列subject_id、hadm_id进行merge
admission_type_with_icu_stay = merge.groupby(by=['admission_type']).agg({'los':'mean'}).reset_index()
print(admission_type_with_icu_stay)
x = admission_type_with_icu_stay.admission_type
y = admission_type_with_icu_stay.los
plt.figure(figsize=(6,4))
plt.bar(x,y)
plt.xlabel('Admission Type')
plt.ylabel('Average ICU Stay Length (day)')
plt.title('Average ICU Stay Length of Differenct Admission Type')
plt.show()
公众号后台回复【不同住院类型住院天数02】获取患者不同的住院类型在icu平均停留时长完整代码,此代码需要修改自己的数据库地址
三、小结
在这篇项目中,我们使用python连接数据库方式来获取MIMIC数据库的数据,给出了一些SQL查询的应用例子,以及数据集的探索尝试;
然后基于获取到的数据集,我们利用pandas函数来对数据集进行操作,并用Matplotlib
绘制了词云、饼图、条形图。除了这些,还有堆叠、折线图、箱图等等各种有趣的图表,你可以查阅官方文档来了解:
https://matplotlib.org/stable/plot_types/index.html
好啦,介绍到这里,相信你已经可以自己尝试探索更多的MIMIC表数据啦~ 下一期我们将基于实际paper应用讲解。