Python连接MIMIC-IV数据库并图表可视化

数据来源:PostgreSQL数据库

一、连接mimic-iv数据库

1.1 安装psycopg2包 

1.2  导入包、连接数据库、查看所有表名

1.3  读取表paitients的内容并探索数据

1.4  读取表icustays的内容并探索数据

二、数据可视化

2.1. 国际疾病分类内容的词云

2.2. 患者住院类型的住院时间分布

2.3. 患者不同的住院类型在icu平均停留时长

三、小结


之前我们讲解了如何提取MIMIC-IV数据数据:

MIMIC数据库提取教程-提取某种疾病下的实验室指标

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" # 主机地址, 本地安装的一般是localhostport = 5432            # 端口, pg默认端口是5432user_name ='postgres'      # 用户名, 用你自己创建的用户名, 一般默认是rootpassword = "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:与表icustaysadmissions关联的键

  • 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" 随后的所有操作均不需要指明表格的位置;否则,任何操作都应该在表格名前面加前缀mimicivquery1 = 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" 随后的所有操作均不需要指明表格的位置;否则,任何操作都应该在表格名前面加前缀mimicivquery1 = 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_idhadm_id进行merge操作。

# 关联病人住院信息数据集和病人在icu的停留时间数据集# on: 两个数据集merge = pd.merge(a, b, on=['subject_id','hadm_id'])
# 基于列subject_id、hadm_id进行mergeadmission_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_typey = 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应用讲解。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值