CoolFace
Apppublic

oumi12/streamlit___

sourceHugging Faceupdated 6mo agoView on Hugging Face
0likes
streamlit.py170 linesDownload Raw Back to root
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