stroke / app.py
lenz237's picture
Create app.py
620a2f3 verified
raw
history blame contribute delete
No virus
10.7 kB
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 #importation des principaux modules
st.set_option('deprecation.showPyplotGlobalUse', False)
@st.cache_data
def load_data(dataset):
df = pd.read_csv(dataset)
return df # fonction permettant de charger un dataset
st.set_page_config(page_title="Cardio",
layout="wide",
page_icon="💗") # titre et icon de la page
# image du sidebar ci-dessous
st.markdown("<h1 style='text-align:center;color:#e74c3c;'>APPLICATION DE PREDICTION DES ARRETS CARDIAQUES</h1>",unsafe_allow_html=True)
# titre
st.sidebar.image('https://media.tenor.com/PWenw46fhbAAAAAj/stethoscope-heart.gif',caption="")
theme_plotly = None
#image d'entête
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: # Nous avons ci-dessous tous les champs qui permettrons à l'utilisateur d'entrer des données pour faire des prédictions
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 = ''
# creating a button for Prediction
a =st.button('Prédire') #Boutton permettant d'afficher le resultat
if smoke10 and bmi9 and gluco8 and age2: # le code s'execute en dessous de se bloque si tous les champs sont renseignés
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]) # la varaible d est transformé en datafram et sera utile pour les prédictions
# user_input = [float(x) for x in user_input]
prediction = model.predict(features) # prediction
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}' # afficher le resultat des prédictions
csv['Stroke'] = prediction[0] #la variable csv sera utiliser ^pour exporter les données du processus de prédiction
st.success(resp) # une reponse est affiché contenant le resultat de la prédiction
csv = pd.DataFrame(csv,index=[0]) # création du dataset
csv.to_csv('./prediction_results.csv', index=False)
st.write("Table:")
st.write(csv) #visualisation des données et du resultat sur un tableau avec possibilité de télécharger le reultat
# en csv pour une utilisation ultérieure
# Create a download button
else:
if a:
st.error("Some fields are empty") # se message s'affiche dans le cas ou tous les champs ne sont pas renseignés
slider_labels = [
("Size (cm)", "Size (cm)"),
]
def Home():
df = load_data('brain_stroke.csv') # importation du dataset
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) # visualisation des données
#compute top analytics
meanage = float(pd.Series(df['age']).mean())
meanbmi = float(pd.Series(df['bmi']).mean())
meanavg = float(pd.Series(df['avg_glucose_level']).mean())
# cacul des moyennes de age, bmi et avg-glucose level
total1,total3,total4=st.columns(3,gap='large') # trois colonnes affichants les moyennes
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")
#variable distribution Histogram
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') # on upload le dataset
st.write(data.head(5))# visualisation du dataset
if st.checkbox('Summary'):
st.write(data.describe().head()) # Analyse sommaire
elif st.checkbox('Correlation'):
plt.figure(figsize=(15,15)) # Matrice de corrélation
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":
#st.subheader(f"Page: {selected}")
Home()
if selected=="Visualisation":
#st.subheader(f"Page: {selected}")
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'), # Show y-axis grid and set its color
paper_bgcolor='rgba(0, 0, 0, 0)', # Set paper background color to transparent
xaxis=dict(showgrid=True, gridcolor='#cecdcd'), # Show x-axis grid and set its color
)
#simple line graph investment by state
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:
#pie chart
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 the file was imported as a module, the code would not run.
if __name__ == '__main__':
sideBar()