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. | |
""") |