oumi12/streamlit___
0
1import streamlit as st2import pandas as pd3import plotly.express as px4 5#config6st.set_page_config(7 page_title="Covid Analytics Dashboard",8 page_icon="",9 layout="wide"10)11 12 13st.title("Covid Tracker ")14st.markdown("""15Dashboard 16""")17 18st.divider()19 20 21@st.cache_data # Streamlit met les données en cache 22 23def load_data():24 df = pd.read_csv("data/data.csv") 25 df["dateRep"] = pd.to_datetime(df["dateRep"], format="%d/%m/%Y")26 df = df.sort_values("dateRep")27 28 return df29 30df = load_data()31 32 33with st.expander("Aperçu des données brutes"):34 st.dataframe(df.head(20))35 st.write(f"**Dimensions :** {df.shape[0]} lignes × {df.shape[1]} colonnes")36 37st.divider()38 39#filtres40 41st.sidebar.header("Filtres")42 43# liste des pays disponibles44countries = sorted(df["countriesAndTerritories"].unique().tolist())45 46# sélection du/des pays47selected_countries = st.sidebar.multiselect(48 "Sélectionner des pays",49 options=countries,50 default=["France","Germany"] 51)52 53# metric54metric = st.sidebar.selectbox(55 "Métrique à afficher",56 options=["cases", "deaths"],57 format_func=lambda x: "Cas confirmés" if x == "cases" else "Décès"58)59 60# Filtre sur la plage de dates61min_date = df["dateRep"].min()62max_date = df["dateRep"].max()63 64date_range = st.sidebar.date_input(65 "Plage de dates",66 value=[min_date, max_date],67 min_value=min_date,68 max_value=max_date69)70 71 72 73 74if len(selected_countries) == 0:75 st.warning("Veuillez sélectionner au moins un pays")76 st.stop()77 78if len(date_range) == 2:79 start_date, end_date = date_range80 mask = (81 (df["countriesAndTerritories"].isin(selected_countries)) &82 (df["dateRep"] >= pd.Timestamp(start_date)) &83 (df["dateRep"] <= pd.Timestamp(end_date))84 )85 filtered_df = df[mask]86else:87 filtered_df = df[df["countriesAndTerritories"].isin(selected_countries)]88 89 90 91#kpis92st.subheader("KPIs")93 94col1, col2, col3 = st.columns(3)95 96total_cases = filtered_df["cases"].sum()97total_deaths = filtered_df["deaths"].sum()98mortality_rate = (total_deaths / total_cases * 100) if total_cases > 0 else 099 100col1.metric("Total cas confirmés", f"{total_cases:,.0f}")101col2.metric("Total décès", f"{total_deaths:,.0f}")102col3.metric("Taux de mortalité", f"{mortality_rate:.2f}%")103 104 105st.divider()106 107 108st.subheader(f"Évolution des {'cas' if metric == 'cases' else 'décès'} dans le temps")109 110fig_line = px.line(111 filtered_df,112 x="dateRep",113 y=metric,114 color="countriesAndTerritories",115 labels={116 "dateRep": "Date",117 metric: "Cas confirmés" if metric == "cases" else "Décès",118 "countriesAndTerritories": "Pays"119 },120 title=f"{'Cas confirmés' if metric == 'cases' else 'Décès'} par pays",121 template="plotly_dark"122)123 124st.plotly_chart(fig_line, use_container_width=True)125 126 127st.subheader(f" Comparaison totale par pays")128 129total_by_country = (130 filtered_df131 .groupby("countriesAndTerritories")[metric]132 .sum()133 .reset_index()134 .sort_values(metric, ascending=False)135)136 137fig_bar = px.bar(138 total_by_country,139 x="countriesAndTerritories",140 y=metric,141 color="countriesAndTerritories",142 labels={143 "countriesAndTerritories": "Pays",144 metric: "Cas confirmés" if metric == "cases" else "Décès"145 },146 title=f"Total {'cas' if metric == 'cases' else 'décès'} par pays",147 template="plotly_dark"148)149 150st.plotly_chart(fig_bar, use_container_width=True)151 152 153st.divider()154 155world_df = df.groupby("dateRep")[["cases", "deaths"]].sum().reset_index()156world_df["cumulated_cases"] = world_df["cases"].cumsum()157 158st.subheader("Positive cases")159fig_cases = px.line(160 world_df,161 x="dateRep",162 y=["cases", "cumulated_cases"],163 labels={"dateRep": "", "value": "", "variable": ""},164 template="plotly_white"165)166 167st.plotly_chart(fig_cases, use_container_width=True)168 169 170 