#1 입력 데이터 생성

#1 입력 데이터 생성 #

#2025-06-23


1. Load package #

%load_ext autoreload
%autoreload 2

import sys
import pandas as pd
import numpy as np
import os
import pickle
import ast

sys.path.append('/data3/projects/2025_Antibiotics/YSH/bin')
from sc import *

os.chdir('/data3/projects/2025_Antibiotics/YSH')

2. Check data #

datadir = '/data3/projects/2025_Antibiotics/PreprocessedData/TimecourseData'
outdir = 'res'

pids =[d for d in os.listdir(datadir) if os.path.isdir(os.path.join(datadir, d))]
len(pids)
4589

4589명 환자의 의료 데이터.

cur_pid = pids[0]
sev = pd.read_csv(f"{datadir}/{cur_pid}/SeverityScore.csv")
lab = pd.read_csv(f"{datadir}/{cur_pid}/Laboratory_processed.csv")
med = pd.read_csv(f"{datadir}/{cur_pid}/Medication.csv")

print(cur_pid)
print(len(sev.columns.tolist()), sev.columns.tolist())
print(len(lab.columns.tolist()), lab.columns.tolist())
print(med)
74374
6 ['Date', 'NEWS', 'WHO', 'SOFA', 'PBS', 'qPitt']
23 ['Date', 'ALT (U/L)', 'AST (U/L)', 'BUN (mg/dL)', 'Creatinine (mg/dL)', 'D-Dimer (ug/mL )', 'Ferritin (ng/mL)', 'HCO3 (mmol/L)', 'Hemoglobin (g/dL)', 'LDH (U/L)', 'Lymphocytes (%)', 'MDRD eGFR (mL/min/BSA)', 'Neutrophils (%)', 'O2 saturation (%)', 'PCO2 (mmHg)', 'PO2 (mmHg)', 'Platelet count (10^3/uL)', 'Potassium (mmol/L)', 'Sodium (mmol/L)', 'WBC count (10^3/uL)', 'hs-CRP (mg/dL)', 'pH ()', 'total CO2, calculated (mmol/L)']
 Date antimicrobials antimicrobials_dose antimicrobials_2  \
0  2020-10-30        Trizele           500.0mg/2       Cefotaxime   
1  2020-10-31        Trizele           500.0mg/3       Cefotaxime   
2  2020-11-01       Pospenem              1.0g/1         Pospenem   
3  2020-11-02       Pospenem              1.0g/1          Meropen   
4  2020-11-03      Vanco Kit              1.0g/1          Meropen   
5  2020-11-04      Vanco Kit              1.0g/1          Meropen   
6  2020-11-05            NaN                 NaN              NaN   

  antimicrobials_2_dose antimicrobials_3 antimicrobials_3_dose  
0               2.0mg/2              NaN                   NaN  
1               2.0mg/3              NaN                   NaN  
2                1.0g/2              NaN                   NaN  
3             500.0mg/2        Vanco Kit                1.0g/1  
4             500.0mg/3              NaN                   NaN  
5             500.0mg/3              NaN                   NaN  
6                   NaN              NaN                   NaN  

환자 ‘74374’를 확인해보면

  • SeverityScore는 날짜별 5개의 중증도 점수
  • Laboratory는 22개 임상 정보
  • Medication은 날짜별 투여 항생제 및 투여용량
    • 정보이다.

3. Merge data #

input_dict = make_input(datadir, pids)
len(list(input_dict.keys()))
4516

Severity, Laboratory, Medication 정보가 모두 있는 환자(4516명)만 사용해서

  • 의료 데이터 딕셔너리 input_dict를 생성했다
input_dict = add_strain_info(input_dict)

print(cur_pid)
print(input_dict[cur_pid])
        Date  NEWS  WHO  SOFA  PBS  qPitt  ALT (U/L)  AST (U/L)  BUN (mg/dL)  \
0 2020-10-30     4    5     0    0      0       43.0       79.0         16.9   
1 2020-10-31     4    5     1    0      0       71.0      149.0         21.5   
2 2020-11-01    12    5     5    1      2       83.0      149.0         30.8   
3 2020-11-02     9    5     6    1      2       83.0      149.0         19.2   
4 2020-11-03    12    5     5    1      1       83.0      149.0         20.2   
5 2020-11-04     8    5     6    2      1       83.0      149.0         22.5   
6 2020-11-05     9    5     7    4      2       83.0      149.0         22.5   

   Creatinine (mg/dL)  ...  Platelet count (10^3/uL)  Potassium (mmol/L)  \
0                0.68  ...                     395.0                 3.6   
1                1.22  ...                     340.0                 3.0   
2                1.42  ...                     272.0                 4.2   
3                0.93  ...                      83.0                 4.7   
4                0.77  ...                      61.0                 4.7   
5                0.84  ...                      67.0                 5.2   
6                0.84  ...                      67.0                 5.2    

   total CO2, calculated (mmol/L)  med_cnt                    med_list  \
0                            18.3        2          Trizele;Cefotaxime   
1                            18.3        2          Trizele;Cefotaxime   
2                            15.7        2         Pospenem;Pospenem_2   
3                            15.7        3  Pospenem;Meropen;Vanco Kit   
4                            31.0        2           Vanco Kit;Meropen   
5                            31.0        2           Vanco Kit;Meropen   
6                            31.0        0                               

                               strain  
0                                  []  
1                                  []  
2                                  []  
3  [Enterobacter cloacae ssp cloacae]  
4  [Enterobacter cloacae ssp cloacae]  
5  [Enterobacter cloacae ssp cloacae]  
6  [Enterobacter cloacae ssp cloacae]  

[7 rows x 31 columns]

환자별 균주 정보를 넣어주고

  • 환자 ‘74374’를 확인해보면
  • 날짜별 중증도(5), 임상 정보(22), 항생제 정보(2), 균주 리스트(1)까지 총 30개 feature가 통합 정리된 딕셔너리가 생성됐다.
with open(f"{outdir}/Input.pkl", 'wb') as f:
    pickle.dump(input_dict, f)

만든건 저장하기.

4. Sequence 생성 #

indir = 'res'

with open(f"{indir}/Input.pkl", 'rb') as f:
        input_dict = pickle.load(f)

pids = input_dict.keys().tolist()
cur_pid = pids[0]

print(cur_pid)
print(input_dict[cur_pid])
        Date  NEWS  WHO  SOFA  PBS  qPitt  ALT (U/L)  AST (U/L)  BUN (mg/dL)  \
0 2020-10-30     4    5     0    0      0       43.0       79.0         16.9   
1 2020-10-31     4    5     1    0      0       71.0      149.0         21.5   
2 2020-11-01    12    5     5    1      2       83.0      149.0         30.8   
3 2020-11-02     9    5     6    1      2       83.0      149.0         19.2   
4 2020-11-03    12    5     5    1      1       83.0      149.0         20.2   
5 2020-11-04     8    5     6    2      1       83.0      149.0         22.5   
6 2020-11-05     9    5     7    4      2       83.0      149.0         22.5   

   Creatinine (mg/dL)  ...  Platelet count (10^3/uL)  Potassium (mmol/L)  \
0                0.68  ...                     395.0                 3.6   
1                1.22  ...                     340.0                 3.0   
2                1.42  ...                     272.0                 4.2   
3                0.93  ...                      83.0                 4.7   
4                0.77  ...                      61.0                 4.7   
5                0.84  ...                      67.0                 5.2   
6                0.84  ...                      67.0                 5.2    

   total CO2, calculated (mmol/L)  med_cnt                    med_list  \
0                            18.3        2          Trizele;Cefotaxime   
1                            18.3        2          Trizele;Cefotaxime   
2                            15.7        2         Pospenem;Pospenem_2   
3                            15.7        3  Pospenem;Meropen;Vanco Kit   
4                            31.0        2           Vanco Kit;Meropen   
5                            31.0        2           Vanco Kit;Meropen   
6                            31.0        0                               

                               strain  
0                                  []  
1                                  []  
2                                  []  
3  [Enterobacter cloacae ssp cloacae]  
4  [Enterobacter cloacae ssp cloacae]  
5  [Enterobacter cloacae ssp cloacae]  
6  [Enterobacter cloacae ssp cloacae]  

[7 rows x 31 columns]

환자별 임상 정보는 최소 5 / 최대 1202일 길이의 데이터인데

  • 이를 항생제 투여일 기준 D-3~D+6만 남겨서
  • 길이 10의 sequence로 만들어준다.
indir = 'res'
outdir = 'data/res_dict'

make_sequence(med, indir, outdir)

res_list = os.listdir(outdir)
print(len(res_list))
169

169개의 input sequence가 생성되었고

  • outdir에 저장되었다.
with open(f'{outdir}/Dexamethasone.pkl', 'rb') as f:
    dexamethasone = pickle.load(f)

cur_ids = cur_ids = list(dexamethasone.keys())
print(len(cur_ids))
print(cur_ids[0])
print(dexamethasone[cur_ids[0]])
783
543865_0
         Date  NEWS  med_cnt                        strain
4  2017-08-18     4        0  [Staphylococcus epidermidis]
5  2017-08-19     4        0  [Staphylococcus epidermidis]
6  2017-08-20     4        0  [Staphylococcus epidermidis]
7  2017-08-21     4        1  [Staphylococcus epidermidis]
8  2017-08-22     3        1  [Staphylococcus epidermidis]
9  2017-08-23     4        1  [Staphylococcus epidermidis]
10 2017-08-24     4        1      [Pseudomonas aeruginosa]
11 2017-08-25     7        1      [Pseudomonas aeruginosa]
12 2017-08-26     4        1      [Pseudomonas aeruginosa]
13 2017-08-27     4        1      [Pseudomonas aeruginosa]

항생제 ‘dexamethasone’에 대해 생성된 sequence를 확인해보면

  • 783개 sequence가 생성되었고
  • 환자 543865의 첫번째 시퀀스 ‘543865_0’를 확인해보면
    • D-3~D+6인 것을 확인 가능하다!