|
import streamlit as st |
|
import pandas as pd |
|
import matplotlib.pyplot as plt |
|
import seaborn as sns |
|
import base64 |
|
import plotly.express as px |
|
from streamlit_option_menu import option_menu |
|
from numerize.numerize import numerize |
|
from streamlit_extras.metric_cards import style_metric_cards |
|
import time |
|
from pycaret.classification import load_model |
|
|
|
st.set_option('deprecation.showPyplotGlobalUse', False) |
|
@st.cache_data |
|
|
|
|
|
def load_data(dataset): |
|
df = pd.read_csv(dataset) |
|
return df |
|
st.set_page_config(page_title="Cardio", |
|
layout="wide", |
|
|
|
page_icon="💗") |
|
|
|
|
|
st.markdown("<h1 style='text-align:center;color:#e74c3c;'>APPLICATION DE PREDICTION DES ARRETS CARDIAQUES</h1>",unsafe_allow_html=True) |
|
|
|
st.sidebar.image('https://media.tenor.com/PWenw46fhbAAAAAj/stethoscope-heart.gif',caption="") |
|
theme_plotly = None |
|
|
|
|
|
def prediction(): |
|
data = load_data("brain_stroke.csv") |
|
model = load_model("strokemodel") |
|
col1, col2, col3 = st.columns(3) |
|
col4,col5=st.columns(2) |
|
with col1: |
|
gender1 = st.selectbox('Selectionner le genre',data["gender"].unique()) |
|
with col2: |
|
age2 = st.text_input('Age') |
|
with col3: |
|
hyper3 = st.selectbox('Hypertendu?',["Oui","Non"]) |
|
with col1: |
|
heart4 = st.selectbox('heart_disease?',["Oui","Non"]) |
|
with col2: |
|
married5 = st.selectbox('ever_married?',["Oui","Non"]) |
|
with col3: |
|
work6 = st.selectbox('type de travail?',data["work_type"].unique()) |
|
with col4: |
|
place7 = st.selectbox('type de résidence?',data["Residence_type"].unique()) |
|
with col5: |
|
gluco8 = st.text_input('Moyenne Glucose') |
|
|
|
with col4: |
|
bmi9 = st.text_input('Bmi') |
|
with col5: |
|
smoke10 = st.selectbox('fume?',data["smoking_status"].unique()) |
|
|
|
a = '' |
|
|
|
|
|
a =st.button('Prédire') |
|
if smoke10 and bmi9 and gluco8 and age2: |
|
if a: |
|
hyperf = 0 |
|
if hyper3 == "oui": |
|
hyperf = 1 |
|
else: |
|
hyperf = 0 |
|
heartf = 0 |
|
if heart4 == "oui": |
|
heartf = 1 |
|
else: |
|
heartf = 0 |
|
marriedf = 0 |
|
if married5 == "oui": |
|
marriedf = 1 |
|
else: |
|
marriedf = 0 |
|
|
|
d = {'gender':gender1,'age':age2,'hypertension':hyperf,'heart_disease':heartf,'ever_married':marriedf,'work_type':work6,'Residence_type':place7,'avg_glucose_level':gluco8,'bmi':bmi9,'smoking_status':smoke10} |
|
csv = {'gender':gender1,'age':age2,'hypertension':hyperf,'heart_disease':heartf,'ever_married':marriedf,'work_type':work6,'Residence_type':place7,'avg_glucose_level':gluco8,'bmi':bmi9,'smoking_status':smoke10} |
|
features = pd.DataFrame(d,index=[0]) |
|
|
|
prediction = model.predict(features) |
|
msg = "" |
|
if prediction[0] == 1: |
|
msg = "Nous avons un risque de d'arrêt cardiaque" |
|
else: |
|
msg = "Nous n'avons pas de risque d'arrêt cardiaque" |
|
|
|
|
|
resp = f'{msg}' |
|
csv['Stroke'] = prediction[0] |
|
st.success(resp) |
|
csv = pd.DataFrame(csv,index=[0]) |
|
csv.to_csv('./prediction_results.csv', index=False) |
|
st.write("Table:") |
|
st.write(csv) |
|
|
|
|
|
|
|
|
|
|
|
else: |
|
if a: |
|
st.error("Some fields are empty") |
|
|
|
|
|
slider_labels = [ |
|
("Size (cm)", "Size (cm)"), |
|
|
|
] |
|
|
|
|
|
|
|
def Home(): |
|
df = load_data('brain_stroke.csv') |
|
with st.expander("VISUALISATION DES DONNEES"): |
|
showData=st.multiselect('Filter: ',df.columns,default=["age","hypertension","ever_married","bmi"]) |
|
st.dataframe(df[showData],use_container_width=True) |
|
|
|
meanage = float(pd.Series(df['age']).mean()) |
|
meanbmi = float(pd.Series(df['bmi']).mean()) |
|
meanavg = float(pd.Series(df['avg_glucose_level']).mean()) |
|
|
|
|
|
|
|
total1,total3,total4=st.columns(3,gap='large') |
|
with total1: |
|
st.info('Age',icon="🧔") |
|
st.metric(label="Moyenne",value=f"{meanage:,.0f}") |
|
|
|
with total3: |
|
st.info('Bmi',icon="❤️") |
|
st.metric(label="Moyenne",value=f"{meanbmi:,.0f}") |
|
|
|
with total4: |
|
st.info('Glucose',icon="🍬") |
|
st.metric(label="Moyenne",value=f"{meanavg:,.0f}") |
|
|
|
style_metric_cards(background_color="#6c5ce7", border_left_color="#e74c3c",border_color="#000000",box_shadow="#F71938") |
|
|
|
|
|
with st.expander("DISTRIBUTIONS PAR FREQUENCE"): |
|
df.hist(figsize=(16,8),color='#898784', zorder=2, rwidth=0.9,legend = ['Investment']) |
|
st.pyplot() |
|
st.video("https://videos.pexels.com/video-files/8460293/8460293-sd_640_360_24fps.mp4", format="video/mp4", start_time=0,autoplay = True, loop=True) |
|
st.write("Une crise cardiaque, également appelée infarctus du myocarde, est une urgence médicale grave qui survient lorsque l'apport de sang riche en oxygène à une partie du muscle cardiaque est soudainement bloqué. Voici quelques informations clés sur les crises cardiaques Causes : La cause la plus fréquente est l'obstruction d'une artère coronaire par un caillot sanguin qui empêche le sang d'irriguer correctement une partie du cœur.Symptômes : Les principaux symptômes d'une crise cardiaque sont une douleur ou un inconfort dans la poitrine, pouvant s'étendre au bras, au cou ou à la mâchoire, ainsi que des difficultés à respirer, des sueurs froides et des nausées. Gravité : Une crise cardiaque est une urgence médicale potentiellement mortelle si elle n'est pas prise en charge rapidement. Elle peut entraîner des lésions irréversibles du muscle cardiaque. Traitement : Le traitement rapide par des médicaments et/ou une intervention chirurgicale (angioplastie, pontage) est essentiel pour limiter les dommages au cœur et prévenir les complications. Prévention : Les facteurs de risque comme le tabagisme, l'hypertension, le diabète ou l'obésité doivent être pris en charge pour prévenir les crises cardiaques.") |
|
def visualisation(): |
|
graphs() |
|
data = load_data('brain_stroke.csv') |
|
st.write(data.head(5)) |
|
if st.checkbox('Summary'): |
|
st.write(data.describe().head()) |
|
elif st.checkbox('Correlation'): |
|
plt.figure(figsize=(15,15)) |
|
st.write(sns.heatmap(data.drop(["gender","ever_married","work_type","Residence_type","smoking_status"],axis=1).corr(),annot=True)) |
|
st.pyplot() |
|
|
|
|
|
def sideBar(): |
|
|
|
with st.sidebar: |
|
|
|
selected=option_menu( |
|
menu_title="Main Menu", |
|
options=["Accueil","Visualisation","Predictions","Contribution"], |
|
icons=["house","eye","clipboard-data","people"], |
|
menu_icon="cast", |
|
default_index=0 |
|
) |
|
|
|
|
|
if selected=="Accueil": |
|
|
|
Home() |
|
if selected=="Visualisation": |
|
|
|
visualisation() |
|
if selected == "Predictions": |
|
prediction() |
|
if selected == "Contribution": |
|
st.markdown("<h1 style='text-align:center;color: white;'>YOUNDA NANDJOU LENZ</h1>",unsafe_allow_html=True) |
|
st.image("https://media.istockphoto.com/id/1324905417/fr/photo/%C3%A9quipe-de-r%C3%A9flexion.jpg?b=1&s=612x612&w=0&k=20&c=eAhgTO-E0Ro1yAQ9IfNJsWpcoZYP1Pf3A_hwYhW2BLI=",width=900) |
|
st.balloons() |
|
|
|
def graphs(): |
|
|
|
df = load_data('brain_stroke.csv') |
|
investment_by_business_type=( |
|
df.groupby(by=["gender"]).count()[["avg_glucose_level"]] |
|
) |
|
fig_investment=px.bar( |
|
investment_by_business_type, |
|
x="avg_glucose_level", |
|
y=investment_by_business_type.index, |
|
orientation="h", |
|
title="<b>avg_glucose_level en fonction du genre</b>", |
|
color_discrete_sequence=["#0083B8"]*len(investment_by_business_type), |
|
template="plotly_white", |
|
) |
|
fig_investment.update_layout( |
|
plot_bgcolor="rgba(0,0,0,0)", |
|
font=dict(color="black"), |
|
yaxis=dict(showgrid=True, gridcolor='#cecdcd'), |
|
paper_bgcolor='rgba(0, 0, 0, 0)', |
|
xaxis=dict(showgrid=True, gridcolor='#cecdcd'), |
|
) |
|
|
|
|
|
investment_state=df.groupby(by=["work_type"]).count()[["age"]] |
|
fig_state=px.line( |
|
investment_state, |
|
x=investment_state.index, |
|
y="age", |
|
orientation="v", |
|
title="<b> Age en fonction du travail</b>", |
|
color_discrete_sequence=["#0083b8"]*len(investment_state), |
|
template="plotly_white", |
|
) |
|
fig_state.update_layout( |
|
xaxis=dict(tickmode="linear"), |
|
plot_bgcolor="rgba(0,0,0,0)", |
|
yaxis=(dict(showgrid=False)) |
|
) |
|
|
|
left,right,center=st.columns(3) |
|
left.plotly_chart(fig_state,use_container_width=True) |
|
right.plotly_chart(fig_investment,use_container_width=True) |
|
|
|
with center: |
|
|
|
fig = px.pie(df, values='age', names='smoking_status', title='Age && Smoking status') |
|
fig.update_layout(legend_title="Regions", legend_y=0.9) |
|
fig.update_traces(textinfo='percent+label', textposition='inside') |
|
st.plotly_chart(fig, use_container_width=True, theme=theme_plotly) |
|
|
|
|
|
if __name__ == '__main__': |
|
sideBar() |
|
|
|
|
|
|
|
|
|
|
|
|