之前我们讲解了如何提取MIMIC-IV数据数据:
这种直接SQL提取方式很直接,但是不是最好的方式也不利于数据的进一步统计分析、可视化和预测分析, 所以我们这里讲解下:
如何用python语言连接我们装好的数据库,并做简单的数据可视化(图表展示)
本文主要是将MIMICIII版本官方代码内的教程升级成mimic-iv版本 , 不同之处在于两点
前置条件, 学会安装python环境、anconda代码包集成环境、ide编辑器(本期文章)
一、
连接mimic-iv数据库
1.1 安装psycopg2
包
主要三种方式
Pycharm编辑器
嫌费事的同学也可直接安装Anaconda集成环境
也可用命令行工具pip 安装 (安装python环境后自带)
pip install psconpg2 pandas
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
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
:性别我们可以使用pandas包自带的总结信息函数来查看数据集的统计信息,也可以使用pandas profiling来直接生成升级版的报告查看。 这里我们先用pandas自带的函数来进行数据集探索。
patients_df.shape # 行数、列数
patients_df.describe()
patients_df.info()
查看每一列是否有缺失值
patients_df.isna().any()
结果
符合数据表信息
或者查看每一列缺失了多少数据
patients_df.isna().sum()
结果
这个情况在该数据集是正常的,因为dod代表患者死亡时间,死亡患者毕竟是少数
icustays
的内容并探索数据该表记录了重症监护病房入院记录的信息,主要是入院和出院时间。
这次,我们利用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())
结果
准备可视化要用的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)高频出现。
我们再从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%%')
不同住院类型在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进行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应用讲解。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。