胡皓皓 胡昌盛
DOI:10.16660/j.cnki.1674-098X.2011-5640-8970
摘? 要:隨著醫(yī)療大數(shù)據(jù)時(shí)代的到來(lái),從大量原始數(shù)據(jù)中挖掘出相關(guān)有用的信息,對(duì)治病防病及醫(yī)療決策進(jìn)行有效輔助,起到非常好的作用。本文基于MongoDB數(shù)據(jù)庫(kù),利用Python編程語(yǔ)言,編寫數(shù)據(jù)處理程序,通過將原始的多個(gè)數(shù)據(jù)表入庫(kù)轉(zhuǎn)換,找出已治愈患者,在此基礎(chǔ)上找出復(fù)燃、復(fù)發(fā)患者并篩選出沒有重復(fù)的數(shù)據(jù);通過多進(jìn)程提高處理速度。最后結(jié)果達(dá)到了預(yù)期,為相關(guān)醫(yī)務(wù)人員提供了診斷及決策依據(jù)。
關(guān)鍵詞:Python? MongoDB數(shù)據(jù)庫(kù)? 大數(shù)據(jù)? 數(shù)據(jù)挖掘
中圖分類號(hào):TP311? ? ? ? ? ? ? ? ? ? ? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A? ? ? ? ? ? ? ? ? ? 文章編號(hào):1674-098X(2021)01(c)-0108-03
A Case Study of Clinical Medical Big Data Mining Based on MongoDB Database
HU Haohao1? HU Changsheng2*
(1.South China Institute of Software Engineering, Guangzhou University, Guangzhou, Guangdong? Province, 510990 China; 2.Guangzhou University of Chinese Medicine, Guangzhou, Guangdong? ?Province, 510006 China)
Abstract: With the advent of the era of medical big data, mining relevant useful information from a large number of original data plays a very good role in effectively assisting the treatment and prevention of diseases and medical decision-making. In this paper, based on MongoDB database, using Python programming language, we write a data processing program. Through putting the original data tables into the database and transforming, we find out the cured patients. On this basis, we find out the recurrent patients, and screen out the data without duplication. We improve the processing speed through multi-processing. Finally, the results achieved the expected results, and provided the basis for diagnosis and decision-making for relevant medical staff.
Key Words: Python; MongoDB database; Big data; Data mining
醫(yī)療機(jī)構(gòu)作為醫(yī)療行業(yè)的重要載體,保存大量的患者的原始數(shù)據(jù)。早期,大部分醫(yī)院原始數(shù)據(jù)的記錄大都保存在Excel電子表格中,表格多,數(shù)據(jù)量大,少則十多萬(wàn)條,多則幾百萬(wàn)條。單獨(dú)通過電子表格進(jìn)行數(shù)據(jù)統(tǒng)計(jì)功能非常有限,而且處理速度慢,對(duì)深度數(shù)據(jù)挖掘沒有什么作用。本文筆者通過Python編寫語(yǔ)言,結(jié)合MongoDB數(shù)據(jù)庫(kù)編寫程序,把原始數(shù)據(jù)中的多表進(jìn)行關(guān)聯(lián)并進(jìn)行條件篩選,通過多次優(yōu)化進(jìn)程,挖掘出相應(yīng)結(jié)果。具體編程處理流程分多步進(jìn)行。
1? 設(shè)計(jì)具體流程
設(shè)計(jì)具體流程如圖1所示。
2? 數(shù)據(jù)轉(zhuǎn)換及導(dǎo)入
MongoDB是一種NoSQL數(shù)據(jù)庫(kù),MongoDB可以實(shí)現(xiàn)多類數(shù)據(jù)的一體化存儲(chǔ)、統(tǒng)一規(guī)則訪問及多樣性查詢、關(guān)聯(lián)檢索等功能。將xls格式的2011~2019年某省某某病患者數(shù)據(jù)文件全部導(dǎo)入到MongoDB中。通過將病案基本信息表關(guān)聯(lián)其他四個(gè)表(痰涂片檢查、痰培養(yǎng)檢查、X線和治療信息)的信息,匹配的條件是病案ID和登記號(hào),得到集成病案信息表。
這一步獲得五個(gè)大表和一個(gè)總表,如表1。
3? 找出已治愈的患者
從第一步得到的病案基本信息表里面篩選出已治愈的患者記錄(包含221357條記錄)并導(dǎo)入治愈患者信息表,其中主要偽代碼如下:
輸入:病案基本信息表
輸出:治愈患者信息表
對(duì)病案基本信息表的每條記錄R:{
如果 (R[“診斷結(jié)果”]∈[“涂片陽(yáng)性”,“僅陪陽(yáng)”,“僅分子生物學(xué)陽(yáng)性”] 或
R[“分子檢出結(jié)果”]==“檢出”) 且 R[“停止原因”]∈[“完成療程”,“治愈”]:{
將R加入治愈患者信息表}}
篩選條件是:“診斷結(jié)果”是“涂片陽(yáng)性”、“僅陪陽(yáng)”或者是“僅分子生物學(xué)陽(yáng)性”,或者“分子檢出結(jié)果”是“檢出”。除此之外,“停止原因”是“完成療程”或“治愈”。
然后再進(jìn)行去重(即找出不重復(fù)的患者)并輸出一個(gè)csv格式的文件。去重的條件是有相同的患者姓名、出生日期和性別,或者有相同的身份證號(hào),或者有相同的患者姓名、出生日期和患者聯(lián)系電話。去重去掉的是治愈患者第一次治愈記錄之后的全部治愈記錄。去重之后治愈患者信息表中還有217885條記錄。
4? 找出復(fù)燃、得發(fā)患者
遍歷上一步得到的治愈患者信息表csv文件,在病案基本信息表中找出復(fù)燃、復(fù)發(fā)患者的所有初次治愈(包含初次治愈記錄)后的記錄:
對(duì)csv中的每一條記錄:果身份證號(hào)不為空,用身份證號(hào)查詢病案,看看是否有出現(xiàn)在該記錄“停止時(shí)間”相同或之后的病原學(xué)陽(yáng)性發(fā)病記錄:
輸入:治愈患者信息表csv
對(duì)治愈患者信息表csv的每條記錄R:{
獨(dú)特病案ID序列:=[]
獨(dú)特病案記錄序列:=[]
如果 R[“身份證號(hào)”] ≠ ””:{
身份證號(hào)查詢結(jié)果 := 查詢集成病案信息表 ((記錄[“診斷結(jié)果”]∈[“涂片陽(yáng)性”,“僅陪陽(yáng)”,“僅分子生物學(xué)陽(yáng)性”] 或 記錄[“分子檢出結(jié)果”]==“檢出”) 且 (記錄[“停止時(shí)間”] ≥R[“停止時(shí)間”] 且 記錄[“停止原因”] ≠“診斷變更” 且 記錄[“身份證號(hào)”] ==R[“身份證號(hào)”])
如果 身份證號(hào)查詢結(jié)果記錄的數(shù)目>1:{
對(duì)身份證號(hào)查詢結(jié)果的每條記錄D:{
如果 D[“病案ID”]獨(dú)特病案ID序列:{
往 獨(dú)特病案ID序列 加入D[“病案ID”]
往 獨(dú)特病案記錄序列 加入D
往 復(fù)發(fā)患者信息表-身份證號(hào)匹配 加入D? ?}} }}
姓名出生日期查詢結(jié)果 := 查詢集成病案信息表 ((記錄[“診斷結(jié)果”]∈[“涂片陽(yáng)性”,“僅陪陽(yáng)”,“僅分子生物學(xué)陽(yáng)性”] 或 記錄[“分子檢出結(jié)果”]==“檢出”) 且 (記錄[“停止時(shí)間”] ≥R[“停止時(shí)間”] 且 記錄[“停止原因”]≠“診斷變更” 且 記錄[“患者姓名”] ==R[“患者姓名”]且 記錄[“出生日期”] ==R[“出生日期”])
如果 姓名出生日期查詢結(jié)果記錄的數(shù)目>1:{
對(duì)姓名出生日期查詢結(jié)果的每條記錄D:{
如果 D[“病案ID”]獨(dú)特病案ID序列:{
往 獨(dú)特病案ID序列 加入D[“病案ID”]
往 獨(dú)特病案記錄序列 加入D? }} }}
“停止原因”不能是“診斷變更”,因?yàn)椤霸\斷變更”意味著并沒有發(fā)病,診斷有誤。
如果查詢出來(lái)的記錄數(shù)大于一,再對(duì)查詢到的記錄根據(jù)“病案ID”去重(每個(gè)病案ID對(duì)應(yīng)一次發(fā)病記錄),再將去重后的記錄加入臨時(shí)獨(dú)特的記錄序列和用身份證號(hào)匹配的復(fù)發(fā)患者信息表(中間結(jié)果),其“病案ID”加入臨時(shí)獨(dú)特的病案ID序列。
用姓名、出生日期查詢病案,看看是否有出現(xiàn)在該記錄“停止時(shí)間”相同或之后的發(fā)病記錄:
如果查詢出來(lái)的記錄數(shù)大于1,再對(duì)查詢到的記錄根據(jù)“病案ID”去重,再將去重后的記錄加入臨時(shí)獨(dú)特的記錄序列,其“病案ID”加入臨時(shí)獨(dú)特的病案ID序列。去重后的記錄如果不符合其他匹配條件就加入用患者姓名和出生日期匹配的復(fù)發(fā)患者信息表(中間結(jié)果),如果性別相同就加入用患者姓名、性別和出生日期匹配的復(fù)發(fā)患者信息表(中間結(jié)果),如果性別相同、戶籍地址相同就加入用患者姓名、性別、出生日期和戶籍地址匹配的復(fù)發(fā)患者信息表(中間結(jié)果),如果性別相同、現(xiàn)地址相同就加入用患者姓名、性別、出生日期和現(xiàn)地址匹配的復(fù)發(fā)患者信息表(中間結(jié)果),代碼如圖2所示。
如果上一步得到的臨時(shí)獨(dú)特的病案ID序列的元素個(gè)數(shù)大于1,將臨時(shí)獨(dú)特的記錄序列中的記錄按停止時(shí)間排序(升序)。然后對(duì)序列中的記錄增加一個(gè)“第幾次發(fā)病”字段值,再存入復(fù)發(fā)患者信息表。
5? 去除復(fù)燃、復(fù)發(fā)某某病患者信息表中含有重復(fù)的病案ID的記錄
由于第二步得到的去重之后的治愈患者信息表中仍然有可能有重復(fù)的患者,最后根據(jù)病案ID把重復(fù)的記錄刪去?;颊逫D是每個(gè)患者唯一的,可以通過患者ID找到某患者的全部發(fā)病記錄。經(jīng)過整理(包括合并同一個(gè)患者的兩個(gè)患者ID的記錄和刪除不合適的數(shù)據(jù)),表中還剩下8757條記錄。部分代碼片段如圖3。
圖3? 部分代碼片段
第四步完成后,刪去的重復(fù)記錄是5條,得到的復(fù)發(fā)患者信息表有8757條記錄。
6? 結(jié)語(yǔ)
醫(yī)療系統(tǒng)包括各種各樣的醫(yī)療信息,其中早期使用最廣泛的數(shù)據(jù)表格主要是電子表格Excel,如何把相關(guān)表格導(dǎo)入到結(jié)構(gòu)化數(shù)據(jù)庫(kù)中,表之間的關(guān)系如何,在用戶調(diào)研過程中要清楚,編程人員要找出表之間的關(guān)系,根據(jù)用戶需求,通過選擇不同的編程語(yǔ)言及數(shù)據(jù)庫(kù),同時(shí)優(yōu)化數(shù)據(jù)庫(kù)服務(wù)器,提高數(shù)據(jù)運(yùn)行處理速度。還要注意算法的優(yōu)化,比如在這個(gè)項(xiàng)目中同時(shí)用到了多個(gè)數(shù)據(jù)庫(kù)查詢,利用查詢之間的關(guān)系優(yōu)化算法,使得多條查詢可以簡(jiǎn)化為一條查詢。
參考文獻(xiàn)
[1] 周羿陽(yáng). 基于Hadoop的醫(yī)療輔助診斷系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].上海:東華大學(xué),2016.
[2] 梁曉杰. 基于Hana的醫(yī)療大數(shù)據(jù)多維度挖掘[D].上海:東華大學(xué),2016.
[3] 王培勛,李沖,劉曉歡.基于醫(yī)院信息數(shù)據(jù)挖掘的信息化臨床路徑在臨床醫(yī)療費(fèi)用監(jiān)控中的應(yīng)用[J].中國(guó)醫(yī)學(xué)裝備,2019,16(4):110-113.
[4] 梁小玲.探討醫(yī)療大數(shù)據(jù)環(huán)境背景下健康信息的分析方法[J].信息技術(shù)與信息化,2018(6):87-88,91.
[5] 李偉,劉光明,張真發(fā).基于MongoDB數(shù)據(jù)庫(kù)的臨床醫(yī)療大數(shù)據(jù)存儲(chǔ)方案設(shè)計(jì)與優(yōu)化[J].工業(yè)控制計(jì)算機(jī),2016,29(1):121-123.
[6] 阮彤,高炬,馮東雷,等.基于電子病歷的臨床醫(yī)療大數(shù)據(jù)挖掘流程與方法[J].大數(shù)據(jù),2017,3(5):83-98.