créer moi une application qui permet de créer un dashboard à partir d'un tableau existant qui est tiré d'une table appelée CHEM_TEST.LOGBOOK_TEST et qui possède plusieurs colonnes : CHEM_DATE, INJECTION_POINT, CHEM_PRODUCT_NAME, TREATED_FLUID, TREATED_FLOWRATE, TARGET_INJECTION_RATE, TARGET_PPM, IS_FIELD_TEST, IS_BATCH, BSW_TREATED_FLUID, TEMP_TREATED_FLUID, PRESSURE_TREATED_FLUID, TDS_TREATED_FLUID, PH_TREATED_FLUID, SUBSTITUTE_PRODUCT en utilisant uniquement les librairies disponible par défaut sur streamlit
To upload files, please first save the app
import streamlit as st
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
from datetime import datetime
# Configuration de la page
st.set_page_config(page_title="Chemical Dashboard", layout="wide")
# Titre de l'application
st.title("Chemical Treatment Dashboard")
# Création des données exemple (à remplacer par votre connexion à la base de données réelle)
@st.cache_data
def load_data():
# Simuler les données de CHEM_TEST.LOGBOOK_TEST
data = pd.DataFrame({
'CHEM_DATE': pd.date_range(start='2023-01-01', periods=100),
'INJECTION_POINT': ['Point-' + str(i%5) for i in range(100)],
'CHEM_PRODUCT_NAME': ['Product-' + str(i%3) for i in range(100)],
'TREATED_FLUID': ['Fluid-' + str(i%4) for i in range(100)],
'TREATED_FLOWRATE': [float(i) for i in range(100)],
'TARGET_INJECTION_RATE': [float(i/2) for i in range(100)],
'TARGET_PPM': [float(i*10) for i in range(100)],
'IS_FIELD_TEST': [i%2 == 0 for i in range(100)],
'IS_BATCH': [i%3 == 0 for i in range(100)],
'BSW_TREATED_FLUID': [float(i%100) for i in range(100)],
'TEMP_TREATED_FLUID': [float(i+20) for i in range(100)],
'PRESSURE_TREATED_FLUID': [float(i*2) for i in range(100)],
'TDS_TREATED_FLUID': [float(i*100) for i in range(100)],
'PH_TREATED_FLUID': [float(i%14) for i in range(100)],
'SUBSTITUTE_PRODUCT': ['Sub-' + str(i%3) for i in range(100)]
})
return data
# Chargement des données
df = load_data()
# Création des filtres dans la sidebar
st.sidebar.header('Filtres')
# Filtre de date
date_range = st.sidebar.date_input(
"Sélectionner la période",
[df['CHEM_DATE'].min(), df['CHEM_DATE'].max()]
)
# Filtres pour les colonnes catégorielles
injection_point = st.sidebar.multiselect(
'Point d\'injection',
options=df['INJECTION_POINT'].unique(),
default=df['INJECTION_POINT'].unique()
)
product_name = st.sidebar.multiselect(
'Nom du produit chimique',
options=df['CHEM_PRODUCT_NAME'].unique(),
default=df['CHEM_PRODUCT_NAME'].unique()
)
# Application des filtres
mask = (
(df['CHEM_DATE'].dt.date >= date_range[0]) &
(df['CHEM_DATE'].dt.date <= date_range[1]) &
(df['INJECTION_POINT'].isin(injection_point)) &
(df['CHEM_PRODUCT_NAME'].isin(product_name))
)
filtered_df = df.loc[mask]
# Layout du dashboard en colonnes
col1, col2 = st.columns(2)
with col1:
# Graphique d'évolution temporelle des taux d'injection
fig_injection = px.line(
filtered_df,
x='CHEM_DATE',
y='TARGET_INJECTION_RATE',
color='INJECTION_POINT',
title='Évolution du taux d\'injection par point'
)
st.plotly_chart(fig_injection, use_container_width=True)
# Graphique de distribution des PPM
fig_ppm = px.box(
filtered_df,
x='CHEM_PRODUCT_NAME',
y='TARGET_PPM',
title='Distribution des PPM par produit'
)
st.plotly_chart(fig_ppm, use_container_width=True)
with col2:
# Graphique de corrélation température/pression
fig_corr = px.scatter(
filtered_df,
x='TEMP_TREATED_FLUID',
y='PRESSURE_TREATED_FLUID',
color='TREATED_FLUID',
title='Corrélation Température/Pression par fluide traité'
)
st.plotly_chart(fig_corr, use_container_width=True)
# Graphique pH
fig_ph = px.histogram(
filtered_df,
x='PH_TREATED_FLUID',
title='Distribution du pH des fluides traités'
)
st.plotly_chart(fig_ph, use_container_width=True)
# Métriques clés
col1, col2, col3, col4 = st.columns(4)
with col1:
st.metric(
"Nombre total d'injections",
len(filtered_df)
)
with col2:
st.metric(
"Moyenne PPM",
f"{filtered_df['TARGET_PPM'].mean():.2f}"
)
with col3:
st.metric(
"Température moyenne",
f"{filtered_df['TEMP_TREATED_FLUID'].mean():.1f}°C"
)
with col4:
st.metric(
"pH moyen",
f"{filtered_df['PH_TREATED_FLUID'].mean():.1f}"
)
# Table des données filtrées
st.subheader("Données détaillées")
st.dataframe(filtered_df)
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?