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("
APPLICATION DE PREDICTION DES ARRETS CARDIAQUES
",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("YOUNDA NANDJOU LENZ
",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="avg_glucose_level en fonction du genre",
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=" Age en fonction du travail",
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()