créé moi une application qui me permet d'avoir un graphique en barre groupés qui indique le budget consommé par produits chimiques et par site à une date T. Il faut que le cout soit calculé en dollars et qu'il y ait la possibilité de sélectionner plusieurs sites soit REP soit MIOC (et les colonnes seront côte à côte). Les 6 produits chimiques sont : PERDEFLOC K01, PERMEA SCAV, PERCOR INHIB, PERSUPERCLEAN, BIOPER, PERDEFOAM. La légende doit être claires, les couleurs bien distinctes.
To upload files, please first save the app
import streamlit as st
import pandas as pd
import plotly.graph_objects as go
# Configuration de la page
st.set_page_config(page_title="Analyse Budget Produits Chimiques", layout="wide")
# Titre de l'application
st.title("Analyse du Budget des Produits Chimiques par Site")
# Création des données exemple
chemicals = [
"PERDEFLOC K01",
"PERMEA SCAV",
"PERCOR INHIB",
"PERSUPERCLEAN",
"BIOPER",
"PERDEFOAM"
]
# Prix unitaires fictifs en dollars
prices = {
"PERDEFLOC K01": 150,
"PERMEA SCAV": 200,
"PERCOR INHIB": 180,
"PERSUPERCLEAN": 120,
"BIOPER": 250,
"PERDEFOAM": 160
}
# Création d'un DataFrame avec des données exemple
def generate_sample_data():
data = {
'site': ['REP'] * len(chemicals) + ['MIOC'] * len(chemicals),
'chemical': chemicals * 2,
'consumption': [100, 150, 80, 200, 120, 90, 80, 130, 70, 180, 100, 70], # Consommation fictive
'price': [prices[chem] for chem in chemicals * 2]
}
df = pd.DataFrame(data)
df['cost'] = df['consumption'] * df['price']
return df
df = generate_sample_data()
# Sélection des sites
sites = st.multiselect(
"Sélectionnez les sites à afficher",
options=['REP', 'MIOC'],
default=['REP', 'MIOC']
)
if not sites:
st.warning("Veuillez sélectionner au moins un site.")
else:
# Filtrer les données selon les sites sélectionnés
filtered_df = df[df['site'].isin(sites)]
# Création du graphique en barres groupées
fig = go.Figure()
colors = {
'REP': '#1f77b4',
'MIOC': '#ff7f0e'
}
for site in sites:
site_data = filtered_df[filtered_df['site'] == site]
fig.add_trace(go.Bar(
name=site,
x=site_data['chemical'],
y=site_data['cost'],
text=site_data['cost'].apply(lambda x: f'${x:,.0f}'),
textposition='auto',
))
# Mise en forme du graphique
fig.update_layout(
title="Budget Consommé par Produit Chimique et par Site",
xaxis_title="Produits Chimiques",
yaxis_title="Coût (USD)",
barmode='group',
height=600,
showlegend=True,
legend_title="Sites",
font=dict(size=12),
xaxis=dict(tickangle=45)
)
# Affichage du graphique
st.plotly_chart(fig, use_container_width=True)
# Affichage des données en tableau
st.subheader("Données détaillées")
# Formater les coûts en dollars
display_df = filtered_df.copy()
display_df['cost'] = display_df['cost'].apply(lambda x: f'${x:,.2f}')
display_df.columns = ['Site', 'Produit Chimique', 'Consommation', 'Prix Unitaire ($)', 'Coût Total']
st.dataframe(display_df)
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?