Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import pandas as pd | |
| import numpy as np | |
| import seaborn as sns | |
| import matplotlib.pyplot as plt | |
| from sklearn.ensemble import RandomForestClassifier | |
| from sklearn.preprocessing import StandardScaler | |
| import time | |
| # Configuration de la page : cette commande doit être exécutée en premier | |
| st.set_page_config(page_title="PowerPump Dashboard", layout="wide") | |
| # Fonction pour charger un modèle existant (à adapter selon ton besoin) | |
| def load_model(): | |
| # Création d'un modèle simple pour la démonstration. | |
| model = RandomForestClassifier(n_estimators=100, random_state=42) | |
| return model | |
| # Fonction de pré-traitement des données | |
| def preprocess_data(temperature, humidity, water_level, N, P, K): | |
| data = np.array([[temperature, humidity, water_level, N, P, K]]) | |
| scaler = StandardScaler() | |
| scaled_data = scaler.fit_transform(data) | |
| return scaled_data | |
| # Prédiction avec le modèle | |
| def make_prediction(model, data): | |
| prediction = model.predict(data) | |
| return prediction[0] | |
| # Charger un dataset fictif | |
| def load_dataset(): | |
| data = pd.DataFrame({ | |
| "Temperature": np.random.randint(20, 50, 200), | |
| "Humidity": np.random.randint(30, 80, 200), | |
| "Water_Level": np.random.randint(50, 100, 200), | |
| "N": np.random.randint(50, 300, 200), | |
| "P": np.random.randint(50, 300, 200), | |
| "K": np.random.randint(50, 300, 200), | |
| "Fan_Actuator_OFF": np.random.choice([0, 1], 200), | |
| "Watering_Plant_Pump_ON": np.random.choice([0, 1], 200), | |
| "WaterPumpActuator_OFF": np.random.choice([0, 1], 200), | |
| }) | |
| return data | |
| # Charger le dataset | |
| dataset = load_dataset() | |
| # Sidebar pour la navigation | |
| st.sidebar.title("Navigation") | |
| menu = st.sidebar.radio("Choisissez une section :", ["Dashboard", "PowerPump Classification"]) | |
| # Partie 1 : Dashboard | |
| if menu == "Dashboard": | |
| st.title("🌟 Dashboard - Analyse des Données 🌟") | |
| st.subheader("Aperçu du Dataset") | |
| st.dataframe(dataset.head()) | |
| st.subheader("Visualisations") | |
| # Graphiques de base | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| st.write("### Distribution des Températures") | |
| fig, ax = plt.subplots() | |
| sns.histplot(dataset["Temperature"], kde=True, color="blue", ax=ax) | |
| ax.set_title("Distribution des Températures") | |
| st.pyplot(fig) | |
| with col2: | |
| st.write("### Distribution de l'Humidité") | |
| fig, ax = plt.subplots() | |
| sns.histplot(dataset["Humidity"], kde=True, color="green", ax=ax) | |
| ax.set_title("Distribution de l'Humidité") | |
| st.pyplot(fig) | |
| # Graphiques supplémentaires | |
| col3, col4 = st.columns(2) | |
| with col3: | |
| st.write("### Niveau d'Eau selon la Température") | |
| fig, ax = plt.subplots() | |
| sns.scatterplot(x=dataset["Temperature"], y=dataset["Water_Level"], hue=dataset["WaterPumpActuator_OFF"], palette="coolwarm", ax=ax) | |
| ax.set_title("Niveau d'Eau vs Température") | |
| st.pyplot(fig) | |
| with col4: | |
| st.write("### Corrélation des Paramètres") | |
| fig, ax = plt.subplots(figsize=(10, 6)) | |
| sns.heatmap(dataset.corr(), annot=True, cmap="coolwarm", ax=ax) | |
| st.pyplot(fig) | |
| # Graphiques avancés | |
| st.write("### Graphiques Avancés") | |
| col5, col6 = st.columns(2) | |
| with col5: | |
| st.write("### Boxplot des Concentrations (N, P, K)") | |
| fig, ax = plt.subplots() | |
| sns.boxplot(data=dataset[["N", "P", "K"]], ax=ax) | |
| ax.set_title("Répartition des Nutriments") | |
| st.pyplot(fig) | |
| with col6: | |
| st.write("### Répartition des États de l'Actuator") | |
| actuator_counts = dataset["WaterPumpActuator_OFF"].value_counts() | |
| fig, ax = plt.subplots() | |
| actuator_counts.plot(kind="pie", labels=["OFF", "ON"], autopct="%1.1f%%", colors=["orange", "purple"], ax=ax) | |
| ax.set_title("Proportion des États de l'Actuator") | |
| ax.set_ylabel("") | |
| st.pyplot(fig) | |
| # Graphique linéaire | |
| st.write("### Evolution de la Température et de l'Humidité") | |
| fig, ax = plt.subplots(figsize=(12, 6)) | |
| ax.plot(dataset["Temperature"][:50], label="Température", marker="o", linestyle="-", color="red") | |
| ax.plot(dataset["Humidity"][:50], label="Humidité", marker="x", linestyle="--", color="blue") | |
| ax.set_title("Evolution Température vs Humidité (échantillon)") | |
| ax.set_xlabel("Index") | |
| ax.set_ylabel("Valeurs") | |
| ax.legend() | |
| st.pyplot(fig) | |
| # Observations | |
| st.write("### Insights Clés") | |
| st.markdown(""" | |
| - La **température** suit une distribution normale autour de 35°C. | |
| - Les niveaux d'eau semblent varier en fonction de la température avec une tendance visible. | |
| - Les boxplots des nutriments montrent une concentration souvent autour de la moyenne. | |
| - Le heatmap montre une forte corrélation entre certains paramètres, utiles pour le modèle prédictif. | |
| """) | |
| # Partie 2 : PowerPump Classification | |
| elif menu == "PowerPump Classification": | |
| st.title("🤖 PowerPump Classification - Prédiction 🤖") | |
| st.write("Remplissez les informations ci-dessous pour prédire si la pompe doit être désactivée.") | |
| # Utilisation de colonnes pour organiser les champs de saisie | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| temperature = st.number_input("Température (°C)", min_value=-50, max_value=50, value=25, step=1) | |
| humidity = st.number_input("Humidité (%)", min_value=0, max_value=100, value=50, step=1) | |
| water_level = st.number_input("Niveau d'eau (%)", min_value=0, max_value=100, value=50, step=1) | |
| with col2: | |
| N = st.number_input("Concentration en Azote (N)", min_value=0, max_value=500, value=100, step=1) | |
| P = st.number_input("Concentration en Phosphore (P)", min_value=0, max_value=500, value=100, step=1) | |
| K = st.number_input("Concentration en Potassium (K)", min_value=0, max_value=500, value=100, step=1) | |
| fan_actuator_off = st.number_input("Fan Actuator OFF", min_value=0, max_value=1, value=0) | |
| water_plant_pump_on = st.number_input("Water Plant Pump ON", min_value=0, max_value=1, value=1) | |
| # Ajouter un bouton de prédiction avec animation | |
| if st.button('Faire la prédiction', use_container_width=True): | |
| with st.spinner('Traitement en cours...'): | |
| time.sleep(2) | |
| try: | |
| # Prétraitement des données | |
| data = preprocess_data(temperature, humidity, water_level, N, P, K) | |
| # Charger le modèle (ici un modèle fictif pour la démo) | |
| model = load_model() | |
| # Entraîner le modèle avec des données fictives | |
| X_train = np.random.rand(100, 6) # 100 exemples de données aléatoires | |
| y_train = np.random.choice([0, 1], 100) # Cible binaire | |
| model.fit(X_train, y_train) | |
| # Faire la prédiction | |
| prediction = make_prediction(model, data) | |
| # Affichage de la prédiction | |
| if prediction == 1: | |
| st.success("La pompe **doit être désactivée**.") | |
| else: | |
| st.warning("La pompe **doit être activée**.") | |
| # Animation des ballons après la prédiction | |
| st.balloons() | |
| except Exception as e: | |
| st.error(f"Erreur pendant la prédiction : {e}") | |
| # Section "Exemple de données" | |
| st.markdown(""" | |
| ### Exemple de données | |
| - **Température** : 25°C | |
| - **Humidité** : 50% | |
| - **Niveau d'eau** : 50% | |
| - **Azote (N)** : 100 mg/L | |
| - **Phosphore (P)** : 100 mg/L | |
| - **Potassium (K)** : 100 mg/L | |
| - **Fan Actuator OFF** : 0 | |
| - **Water Plant Pump ON** : 1 | |
| """) | |
| # Ajouter un peu de style pour rendre l'interface plus jolie | |
| st.markdown(""" | |
| <style> | |
| .css-1aumxhk { | |
| text-align: center; | |
| color: #2e7d32; | |
| font-size: 22px; | |
| font-weight: bold; | |
| } | |
| .stButton>button { | |
| background-color: #43a047; | |
| color: white; | |
| font-size: 18px; | |
| padding: 15px 30px; | |
| border-radius: 8px; | |
| } | |
| .stButton>button:hover { | |
| background-color: #388e3c; | |
| } | |
| </style> | |
| """, unsafe_allow_html=True) | |
| # Explication de l'objectif du projet | |
| st.markdown(""" | |
| ### Objectif du Projet | |
| L'objectif de ce projet est de prédire l'état de la pompe à eau dans un système automatisé de gestion de l'irrigation. | |
| En utilisant des informations telles que la température, l'humidité, le niveau d'eau, et d'autres paramètres environnementaux et opérationnels, | |
| nous pouvons déterminer si la pompe doit être activée ou désactivée pour optimiser l'usage des ressources. | |
| """) |