前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python连接MIMIC-IV数据库并图表可视化

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

原创
作者头像
科研收录
发布2023-12-12 14:17:46
1800
发布2023-12-12 14:17:46
举报
文章被收录于专栏:mimic数据库mimic数据库

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

这种直接SQL提取方式很直接,但是不是最好的方式也不利于数据的进一步统计分析、可视化和预测分析, 所以我们这里讲解下:

如何用python语言连接我们装好的数据库,并做简单的数据可视化(图表展示)

本文主要是将MIMICIII版本官方代码内的教程升级成mimic-iv版本 , 不同之处在于两点

  • 数据读取方式: MIMICIII教程使用的直接读取csv文档的方式, 我们这里连接数据
  • 数据和代码更新:因mimic-iv数据表更新了很多,所以可视化代码也需要更新
图片
图片

 数据来源:PostgreSQL数据库

前置条件, 学会安装python环境、anconda代码包集成环境、ide编辑器(本期文章)

图片
图片

一、

连接mimic-iv数据库

1.1 安装psycopg2包 

主要三种方式

    Pycharm编辑器

图片
图片
图片
图片
图片
图片
图片
图片
图片
图片

嫌费事的同学也可直接安装Anaconda集成环境

图片
图片

也可用命令行工具pip 安装 (安装python环境后自带)

代码语言:javascript
复制
pip install psconpg2  pandas
图片
图片
1.2  导入包、连接数据库、查看所有表名
代码语言:javascript
复制
import psycopg2

设置数据库连接的基本信息

代码语言:javascript
复制
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数据库

代码语言:javascript
复制
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

代码语言:javascript
复制
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包提供的一种数据类型,日常用于各种数据分析使用)

代码语言:javascript
复制
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自带的函数来进行数据集探索。

代码语言:javascript
复制
patients_df.shape # 行数、列数
图片
图片
图片
图片
代码语言:javascript
复制
patients_df.describe()
图片
图片
图片
图片
代码语言:javascript
复制
patients_df.info()
图片
图片
图片
图片

查看每一列是否有缺失值

代码语言:javascript
复制
patients_df.isna().any()
图片
图片

结果

图片
图片

符合数据表信息

图片
图片

或者查看每一列缺失了多少数据

代码语言:javascript
复制
patients_df.isna().sum()
图片
图片

结果

图片
图片

这个情况在该数据集是正常的,因为dod代表患者死亡时间,死亡患者毕竟是少数

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

该表记录了重症监护病房入院记录的信息,主要是入院和出院时间。

  • subject_id:患者的唯一标识符。
  • hadm_id:入院号,表示患者的住院标识符。
  • stay_id:留观号,指患者在医院中的留观期间的唯一标识符。
  • first_careunit:首次护理单元,表示患者在住院期间所在的第一个护理单元。
  • last_careunit:最后护理单元,表示患者在住院期间所在的最后一个护理单元。
  • intime:入院时间,指患者入院的时间。
  • outtime:出院时间,表示患者出院的时间。
  • los:住院天数,表示患者在医院中的住院天数。

这次,我们利用pandas profiling来查看数据集的详细报告。信息包括

  • 数据集的基本信息,变量类型;
  • 各个特征字段数据的统计分析、相关性分析;
  • 数据集的头和尾的数据样例展示。

是不是很赞!😄

图片
图片
图片
图片

结果:

图片
图片

公众号后台回复【可视化报告代码01】获取写好的代码,

此代码需要修改自己的数据库地址

图片
图片
代码语言:javascript
复制
conn = psycopg2.connect(dbname='', user='', password='',                        host='', port=5432)

二、

数据可视化

现在,我们来用这些数据集创建可视化的图表

代码语言:javascript
复制
import matplotlib.pyplot as plt%matplotlib inline

我们从PostgreSQL数据库读取表mimiciv_hosp.d_icd_diagnoses的数据,

此表包含了国际疾病分类(ICD)的诊断编码资讯,用于记录病患的诊断情况

代码语言:javascript
复制
# # 设置查询语句# # 我们选择从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包

代码语言:javascript
复制
pip install wordcloud
图片
图片
代码语言:javascript
复制
from wordcloud import WordCloud
代码语言:javascript
复制
text = str(a['long_title'].values)len(text) # 有多少疾病名称print(len(text))
图片
图片

运行结果

图片
图片

生成worldcloud对象

代码语言:javascript
复制
wordcloud = WordCloud().generate(text)
图片
图片

绘制词云图

代码语言:javascript
复制
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)。

代码语言:javascript
复制
# # 设置查询语句# # 我们选择从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()
代码语言:javascript
复制
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操作。

代码语言:javascript
复制
# 关联病人住院信息数据集和病人在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)
图片
图片
图片
图片
代码语言:javascript
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  •  数据来源:PostgreSQL数据库
    • 1.2  导入包、连接数据库、查看所有表名
      • 1.3  读取表paitients的内容并探索数据
        • 1.4  读取表icustays的内容并探索数据
          • 2.1. 国际疾病分类内容的词云
            • 2.2. 患者住院类型的住院时间分布
              • 2.3. 患者不同的住院类型在icu平均停留时长
              • 三、 小结
              相关产品与服务
              数据库
              云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档