|
import shap |
|
import streamlit as st |
|
import streamlit.components.v1 as components |
|
|
|
import numpy as np |
|
import pickle |
|
import pandas as pd |
|
import time |
|
|
|
def impute_missing_values(df_,dict_impute): |
|
return df_.fillna(dict_impute) |
|
|
|
to_rescale_ = ['diff_MS','MS_d','pr_pre_tavi', |
|
'surface_systole','MS_s','age', |
|
'ncc_calcif_n','calc_risque_n'] |
|
|
|
to_encode_ = ['syncope_Oui', 'lcc_calc_1.0', 'bloc_branche_pre_bbd'] |
|
|
|
st.title("Prédiction du risque d'IPM post TAVI, Pre Opération") |
|
|
|
cols = ['diff_MS','MS_d','pr_pre_tavi', |
|
'surface_systole','MS_s','age', |
|
'ncc_calcif_n','calc_risque_n', |
|
'syncope_Oui', 'lcc_calc_1.0', 'bloc_branche_pre_bbd'] |
|
|
|
|
|
def st_shap(plot, height=None): |
|
shap_html = f"<head>{shap.getjs()}</head><body>{plot.html()}</body>" |
|
components.html(shap_html, height=height) |
|
|
|
|
|
with st.form(key='cols_form'): |
|
c1,c2,c3 = st.columns(3) |
|
c4,c5,c6 = st.columns(3) |
|
c7,c8,c9 = st.columns(3) |
|
c10,c11 = st.columns(2) |
|
|
|
with c1: |
|
diff_MS = st.number_input('Différence SM (mm)',value=1.218) |
|
with c2: |
|
MS_d = st.number_input('Mesure diastolique SM (mm)',value=5.3) |
|
with c3: |
|
pr_pre_tavi = st.number_input('PR Pre TAVI (ms)',value=240) |
|
with c4: |
|
surface_systole = st.number_input("Surface systolique de l'anneau (mm²) ",value=518) |
|
with c5: |
|
MS_s = st.number_input('Mesure systolique SM (mm)',value=4.082) |
|
with c6: |
|
age = st.number_input('Age (année)',value=85.775) |
|
with c7: |
|
ncc_calcif_n = st.number_input('Degré calcification CNC',value=2) |
|
with c8: |
|
calc_risque_n = st.number_input('Degré calcificaton zone à risque',value=4) |
|
with c9: |
|
syncope_Oui = st.number_input('Syncope',value=0) |
|
with c10: |
|
lcc_calc_1 = st.number_input('Calcification CCG',value=1) |
|
with c11: |
|
bloc_branche_pre_bbd = st.number_input('Présence bloc de branche droit pre tavi ',value=0) |
|
submitButton = st.form_submit_button(label = 'Predict') |
|
|
|
|
|
|
|
|
|
|
|
|
|
@st.cache_resource() |
|
def load_model(): |
|
with open(r"svm_pre.pkl", "rb") as input_file: |
|
model = pickle.load(input_file) |
|
return model |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def load_scaler(): |
|
with open(r"scaler_pre.pkl", "rb") as input_file: |
|
scaler = pickle.load(input_file) |
|
return scaler |
|
|
|
@st.cache_resource() |
|
def load_impute(): |
|
with open(r"dict_impute_pre.pkl", "rb") as input_file: |
|
dict_impute = pickle.load(input_file) |
|
return dict_impute |
|
|
|
with st.spinner("Loading Model...."): |
|
model = load_model() |
|
dict_impute = load_impute() |
|
scaler = load_scaler() |
|
|
|
|
|
|
|
|
|
|
|
|
|
with st.spinner("Prediction..."): |
|
age = age*365 |
|
pred_arr = np.array([[diff_MS,MS_d,pr_pre_tavi, |
|
surface_systole,MS_s,age, |
|
ncc_calcif_n,calc_risque_n, |
|
syncope_Oui, lcc_calc_1, bloc_branche_pre_bbd]]) |
|
|
|
pred_df = pd.DataFrame(pred_arr,columns=cols) |
|
|
|
df_scaled_ = scaler.transform(pred_df[to_rescale_]) |
|
df_scaled = pd.DataFrame(columns=to_rescale_,data=df_scaled_) |
|
pred_df = pd.concat([df_scaled,pred_df[to_encode_]],axis=1) |
|
pred=round(model.predict_proba(pred_df)[0][1]*100,2) |
|
print(model.feature_names_in_) |
|
print(pred_df.columns) |
|
print(pred_df.iloc[0]) |
|
print(pred) |
|
|
|
|
|
st.write("Probabilité de risque d'IPM :",pred,' %') |
|
|
|
|
|
|
|
|
|
|
|
|