File size: 9,567 Bytes
7d02cf0
8af5fab
6e991d4
 
 
 
 
 
 
 
 
 
807c355
21106dc
 
d11d507
 
21106dc
52cdc07
 
cf9b184
52cdc07
c21f511
 
 
 
6e991d4
 
 
 
 
 
 
 
 
 
ee552c6
 
6e991d4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ee552c6
 
 
123d646
 
6e991d4
123d646
ee552c6
6e991d4
5f69383
72467fc
6e991d4
 
 
 
13eb262
6e991d4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80b39bb
 
 
6e991d4
 
 
 
 
 
 
 
 
7197416
80b39bb
 
f237326
80b39bb
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# pip install pycaret
from pandas.api.types import CategoricalDtype
import pandas as pd
import jinja2

from pycaret.classification import *
import imblearn as im
import sklearn

import gradio as gr
import numpy as np

import io
import pickle
import requests
import urllib.request
import shutil

# url = 'https://raw.githubusercontent.com/fmegahed/tavr_paper/main/data/example_data2.csv'
# download = requests.get(url).content

ex_data =pd.read_csv('example_data2.csv')
ex_data = ex_data.to_numpy()
ex_data = ex_data.tolist()


def predict(age, female, race, elective, aweekend, zipinc_qrtl, hosp_region, hosp_division, hosp_locteach,
            hosp_bedsize, h_contrl, pay, anemia, atrial_fibrillation, 
            cancer, cardiac_arrhythmias, carotid_artery_disease, 
            chronic_kidney_disease, chronic_pulmonary_disease, coagulopathy,
            depression, diabetes_mellitus, drug_abuse, dyslipidemia, endocarditis,
            family_history, fluid_and_electrolyte_disorder, heart_failure,
            hypertension, known_cad, liver_disease, obesity, peripheral_vascular_disease,
            prior_cabg, prior_icd, prior_mi, prior_pci, prior_ppm, prior_tia_stroke,
            pulmonary_circulation_disorder, smoker, valvular_disease, weight_loss,
            endovascular_tavr, transapical_tavr):
  
 

  df = pd.DataFrame.from_dict({
      'age': [age], 'female': [female], 'race': [race], 'elective': elective,
       'aweekend': [aweekend], 'zipinc_qrtl': [zipinc_qrtl], 
       'hosp_region': [hosp_region], 'hosp_division': [hosp_division],
       'hosp_locteach': [hosp_locteach], 'hosp_bedsize': [hosp_bedsize],
       'h_contrl': [h_contrl], 'pay': [pay], 'anemia': [anemia], 
       'atrial_fibrillation': [atrial_fibrillation], 'cancer': [cancer],
       'cardiac_arrhythmias': [cardiac_arrhythmias], 
       'carotid_artery_disease': [carotid_artery_disease], 
       'chronic_kidney_disease': [chronic_kidney_disease], 
       'chronic_pulmonary_disease': [chronic_pulmonary_disease], 
       'coagulopathy': [coagulopathy], 'depression': [depression],
       'diabetes_mellitus': [diabetes_mellitus], 'drug_abuse': [drug_abuse], 
       'dyslipidemia': [dyslipidemia], 'endocarditis': [endocarditis],
       'family_history': [family_history], 'fluid_and_electrolyte_disorder': [fluid_and_electrolyte_disorder],
       'heart_failure': [heart_failure], 'hypertension': [hypertension],
       'known_cad': [known_cad], 'liver_disease': [liver_disease],
       'obesity': [obesity], 'peripheral_vascular_disease': [peripheral_vascular_disease],
       'prior_cabg': [prior_cabg], 'prior_icd': [prior_icd], 'prior_mi': [prior_mi],
       'prior_pci': [prior_pci], 'prior_ppm': [prior_ppm], 'prior_tia_stroke': [prior_tia_stroke],
       'pulmonary_circulation_disorder': [pulmonary_circulation_disorder], 
       'smoker': [smoker], 'valvular_disease': [valvular_disease],
       'weight_loss': [weight_loss], 'endovascular_tavr': [endovascular_tavr],
       'transapical_tavr': [transapical_tavr]
  })
  
  df.loc[:, df.dtypes == 'object'] =\
    df.select_dtypes(['object'])\
    .apply(lambda x: x.astype('category'))

  # converting ordinal column to ordinal
  ordinal_cat = CategoricalDtype(categories = ['FirstQ', 'SecondQ', 'ThirdQ', 'FourthQ'], ordered = True)
  df.zipinc_qrtl = df.zipinc_qrtl.astype(ordinal_cat)

  with urllib.request.urlopen('https://github.com/fmegahed/tavr_paper/blob/main/data/final_model.pkl?raw=true') as response, open('final_model.pkl', 'wb') as out_file:
    shutil.copyfileobj(response, out_file)

  model = load_model('final_model')

  pred = predict_model(model, df, raw_score=True)
  
  return {'Death %': round(100*pred['Score_Yes'][0], 2),
       'Survival %': round(100*pred['Score_No'][0], 2),
       'Predicting Death Outcome:': pred['Label'][0]}

# Defining the containers for each input
age = gr.inputs.Slider(minimum=18, maximum=100, default=60, label="Age")
female = gr.inputs.Dropdown(choices=["Female", "Male"],label = 'Sex')
race = gr.inputs.Dropdown(choices=['Asian or Pacific Islander', 'Black', 'Hispanic', 'Native American', 'White',  'Other'], label = 'Race')
elective = gr.inputs.Radio(choices=['Elective', 'NonElective'], label = 'Elective')
aweekend = gr.inputs.Radio(choices=["No", "Yes"], label = 'Weekend')
zipinc_qrtl = gr.inputs.Radio(choices=['FirstQ', 'SecondQ', 'ThirdQ', 'FourthQ'], label = 'Zip Income Quartile')
hosp_region = gr.inputs.Radio(choices=['Midwest', 'Northeast', 'South', 'West'], label = 'Hospital Region')
hosp_division = gr.inputs.Radio(choices=['New England', 'Middle Atlantic', 'East North Central', 'West North Central', 'South Atlantic', 'East South Central', 'West South Central', 'Mountain', 'Pacific'], label = 'Hospital Division')
hosp_locteach = gr.inputs.Radio(choices=['Urban teaching', 'Urban nonteaching', 'Rural'], label= 'Hospital Location/Teaching')
hosp_bedsize = gr.inputs.Radio(choices=['Small', 'Medium', 'Large'], label= 'Hospital Bedsize')
h_contrl = gr.inputs.Radio(choices= ['Government_nonfederal', 'Private_invest_own', 'Private_not_profit'], label = 'Hospital Control')
pay = gr.inputs.Dropdown(choices= ['Private insurance', 'Medicare', 'Medicaid',  'Self-pay', 'No charge', 'Other'], label = 'Payee')
anemia = gr.inputs.Radio(choices=["No", "Yes"], label = 'Anemia')
atrial_fibrillation = gr.inputs.Radio(choices=["No", "Yes"], label = 'Atrial Fibrillation')
cancer = gr.inputs.Radio(choices=["No", "Yes"], label = 'Cancer')
cardiac_arrhythmias = gr.inputs.Radio(choices=["No", "Yes"], label = 'Cardiac Arrhythmias')
carotid_artery_disease = gr.inputs.Radio(choices=["No", "Yes"], label = 'Carotid Artery Disease') 
chronic_kidney_disease = gr.inputs.Radio(choices=["No", "Yes"], label = 'Chronic Kidney Disease')
chronic_pulmonary_disease = gr.inputs.Radio(choices=["No", "Yes"], label = 'Chronic Pulmonary Disease') 
coagulopathy =  gr.inputs.Radio(choices=["No", "Yes"], label = 'Coagulopathy')
depression = gr.inputs.Radio(choices=["No", "Yes"], label = 'Depression')
diabetes_mellitus = gr.inputs.Radio(choices=["No", "Yes"], label = 'Diabetes Mellitus')
drug_abuse = gr.inputs.Radio(choices=["No", "Yes"], label = 'Drug Abuse')
dyslipidemia = gr.inputs.Radio(choices=["No", "Yes"], label = 'Dyslipidemia')
endocarditis = gr.inputs.Radio(choices=["No", "Yes"], label = 'Endocarditis')
family_history = gr.inputs.Radio(choices=["No", "Yes"], label = 'Family History')
fluid_and_electrolyte_disorder = gr.inputs.Radio(choices=["No", "Yes"], label = 'Fluid and Electrolyte Disorder')
heart_failure = gr.inputs.Radio(choices=["No", "Yes"], label = 'Heart Failure')
hypertension = gr.inputs.Radio(choices=["No", "Yes"], label = 'Hypertension')
known_cad = gr.inputs.Radio(choices=["No", "Yes"], label = 'Known CAD')
liver_disease = gr.inputs.Radio(choices=["No", "Yes"], label = 'Liver Disease')
obesity = gr.inputs.Radio(choices=["No", "Yes"], label = 'Obesity')
peripheral_vascular_disease = gr.inputs.Radio(choices=["No", "Yes"], label = 'Peripheral Vascular Disease')
prior_cabg = gr.inputs.Radio(choices=["No", "Yes"], label = 'Prior CABG')
prior_icd = gr.inputs.Radio(choices=["No", "Yes"], label = 'Prior ICD')
prior_mi = gr.inputs.Radio(choices=["No", "Yes"], label = 'Prior MI')
prior_pci = gr.inputs.Radio(choices=["No", "Yes"], label = 'Prior PCI') 
prior_ppm = gr.inputs.Radio(choices=["No", "Yes"], label = 'Prior PPM')
prior_tia_stroke = gr.inputs.Radio(choices=["No", "Yes"], label = 'Prior TIA Stroke')
pulmonary_circulation_disorder = gr.inputs.Radio(choices=["No", "Yes"], label = 'Pulmonary Circulation Disorder') 
smoker = gr.inputs.Radio(choices=["No", "Yes"], label = 'Smoker')
valvular_disease = gr.inputs.Radio(choices=["No", "Yes"], label = 'Valvular Disease') 
weight_loss = gr.inputs.Radio(choices=["No", "Yes"], label = 'Weight Loss')
endovascular_tavr = gr.inputs.Radio(choices=["No", "Yes"], label = 'Endovascular TAVR')
transapical_tavr = gr.inputs.Radio(choices=["No", "Yes"], label = 'Transapical TAVR', default= 'Yes')


# Defining and launching the interface
iface = gr.Interface(
    fn = predict, 
    inputs = [age, female, race, elective, aweekend, zipinc_qrtl, hosp_region, hosp_division, hosp_locteach,
            hosp_bedsize, h_contrl, pay, anemia, atrial_fibrillation, 
            cancer, cardiac_arrhythmias, carotid_artery_disease, 
            chronic_kidney_disease, chronic_pulmonary_disease, coagulopathy,
            depression, diabetes_mellitus, drug_abuse, dyslipidemia, endocarditis,
            family_history, fluid_and_electrolyte_disorder, heart_failure,
            hypertension, known_cad, liver_disease, obesity, peripheral_vascular_disease,
            prior_cabg, prior_icd, prior_mi, prior_pci, prior_ppm, prior_tia_stroke,
            pulmonary_circulation_disorder, smoker, valvular_disease, weight_loss,
            endovascular_tavr, transapical_tavr], 
    outputs = 'text',
    live=True,
    title = "Predicting In-Hospital Mortality After TAVR Using Preoperative Variables and Penalized Logistic Regression",
    description = "<font size='4'>The app below utilizes the <b>finalized logistic regression model with an l2 penalty based on the manuscript by Alhwiti, Aldrugh, and Megahed</b>. The manuscript is under review at Scientific Reports. The data used for model building is all TAVR procedures between 2012 and 2019, as reported in the HCUP NIS database. <br><br> The app's purpose is to provide evidence-based clinical support for interventional cardiology.</font>",
    css = 'https://bootswatch.com/5/journal/bootstrap.css')

iface.launch()