créer une app qui me permet d'afficher un dashboard à parti d'une table existante que l'on appelle comme suite : CHEM_TEST.LOGBOOK_TEST et qui contient les colonnes suivantes : 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 il faut que l'on puisse trier par produit chimique, par date ou par point d'injection.
Drop files here
or click to upload
import streamlit as st
import pandas as pd
import plotly.express as px
from datetime import datetime, timedelta
# Configuration de la page
st.set_page_config(page_title="Chemical Logbook Dashboard", layout="wide")
# Titre de l'application
st.title("Chemical Logbook Dashboard")
# Création d'un DataFrame exemple (à remplacer par votre vraie connexion à la base de données)
@st.cache_data
def load_data():
# Simuler les données - À remplacer par votre requête SQL réelle
data = pd.DataFrame({
'CHEM_DATE': pd.date_range(start='2023-01-01', end='2023-12-31', freq='D'),
'INJECTION_POINT': ['Point A', 'Point B', 'Point C'] * 122,
'CHEM_PRODUCT_NAME': ['Product X', 'Product Y', 'Product Z'] * 122,
'TREATED_FLUID': ['Water', 'Oil', 'Gas'] * 122,
'TREATED_FLOWRATE': [100 + i for i in range(366)],
'TARGET_INJECTION_RATE': [10 + i/10 for i in range(366)],
'TARGET_PPM': [50 + i/5 for i in range(366)],
'IS_FIELD_TEST': [i % 2 == 0 for i in range(366)],
'IS_BATCH': [i % 3 == 0 for i in range(366)],
'BSW_TREATED_FLUID': [i/10 for i in range(366)],
'TEMP_TREATED_FLUID': [25 + i/10 for i in range(366)],
'PRESSURE_TREATED_FLUID': [100 + i for i in range(366)],
'TDS_TREATED_FLUID': [1000 + i*2 for i in range(366)],
'PH_TREATED_FLUID': [7 + (i/100) for i in range(366)],
'SUBSTITUTE_PRODUCT': ['Sub A', 'Sub B', 'None'] * 122
})
return data
data = load_data()
# Filtres dans la barre latérale
st.sidebar.header("Filtres")
# Filtre de date
date_range = st.sidebar.date_input(
"Sélectionnez la période",
[data['CHEM_DATE'].min(), data['CHEM_DATE'].max()],
)
# Filtre de produit chimique
all_products = ['Tous'] + sorted(data['CHEM_PRODUCT_NAME'].unique().tolist())
selected_product = st.sidebar.selectbox('Sélectionnez le produit chimique', all_products)
# Filtre de point d'injection
all_points = ['Tous'] + sorted(data['INJECTION_POINT'].unique().tolist())
selected_point = st.sidebar.selectbox("Sélectionnez le point d'injection", all_points)
# Application des filtres
filtered_data = data.copy()
# Filtre de date
filtered_data = filtered_data[
(filtered_data['CHEM_DATE'].dt.date >= date_range[0]) &
(filtered_data['CHEM_DATE'].dt.date <= date_range[1])
]
# Filtre de produit
if selected_product != 'Tous':
filtered_data = filtered_data[filtered_data['CHEM_PRODUCT_NAME'] == selected_product]
# Filtre de point d'injection
if selected_point != 'Tous':
filtered_data = filtered_data[filtered_data['INJECTION_POINT'] == selected_point]
# Affichage des métriques clés
col1, col2, col3, col4 = st.columns(4)
with col1:
st.metric("Nombre total d'injections", len(filtered_data))
with col2:
st.metric("Nombre de produits utilisés", filtered_data['CHEM_PRODUCT_NAME'].nunique())
with col3:
st.metric("Points d'injection actifs", filtered_data['INJECTION_POINT'].nunique())
with col4:
st.metric("Tests terrain", filtered_data['IS_FIELD_TEST'].sum())
# Graphiques
col1, col2 = st.columns(2)
with col1:
# Graphique des taux d'injection par produit
fig1 = px.box(filtered_data, x='CHEM_PRODUCT_NAME', y='TARGET_INJECTION_RATE',
title="Distribution des taux d'injection par produit")
st.plotly_chart(fig1, use_container_width=True)
with col2:
# Graphique de l'évolution temporelle
fig2 = px.line(filtered_data, x='CHEM_DATE', y='TARGET_PPM',
color='CHEM_PRODUCT_NAME',
title="Évolution des PPM ciblés dans le temps")
st.plotly_chart(fig2, use_container_width=True)
# Tableau de données filtré
st.subheader("Données détaillées")
st.dataframe(filtered_data.sort_values('CHEM_DATE', ascending=False))
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?