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. Utiliser uniquement des librairies par défaut existantes sur streamlite/snowflake
Drop files here
or click to upload
import streamlit as st
import pandas as pd
import plotly.express as px
import snowflake.connector
from datetime import datetime, timedelta
# Configuration de la page
st.set_page_config(page_title="Chemical Treatment Dashboard", layout="wide")
st.title("Chemical Treatment Dashboard")
# Connexion Snowflake - À configurer avec vos credentials
# Note: Dans un environnement de production, ces informations devraient être stockées de manière sécurisée
@st.cache_resource
def init_snowflake_connection():
return snowflake.connector.connect(
user=st.secrets["snowflake"]["user"],
password=st.secrets["snowflake"]["password"],
account=st.secrets["snowflake"]["account"],
warehouse=st.secrets["snowflake"]["warehouse"],
database=st.secrets["snowflake"]["database"],
schema=st.secrets["snowflake"]["schema"]
)
# Fonction pour charger les données
@st.cache_data
def load_data():
conn = init_snowflake_connection()
query = """
SELECT * FROM CHEM_TEST.LOGBOOK_TEST
ORDER BY CHEM_DATE DESC
"""
df = pd.read_sql(query, conn)
conn.close()
return df
try:
# Chargement des données
df = load_data()
# Filtres dans la barre latérale
st.sidebar.header("Filtres")
# Filtre par date
date_range = st.sidebar.date_input(
"Sélectionner la période",
value=(df['CHEM_DATE'].min(), df['CHEM_DATE'].max()),
key='date_range'
)
# Filtre par produit chimique
selected_products = st.sidebar.multiselect(
"Sélectionner les produits chimiques",
options=sorted(df['CHEM_PRODUCT_NAME'].unique()),
default=[]
)
# Filtre par point d'injection
selected_injection_points = st.sidebar.multiselect(
"Sélectionner les points d'injection",
options=sorted(df['INJECTION_POINT'].unique()),
default=[]
)
# Application des filtres
filtered_df = df.copy()
if len(date_range) == 2:
filtered_df = filtered_df[
(filtered_df['CHEM_DATE'].dt.date >= date_range[0]) &
(filtered_df['CHEM_DATE'].dt.date <= date_range[1])
]
if selected_products:
filtered_df = filtered_df[filtered_df['CHEM_PRODUCT_NAME'].isin(selected_products)]
if selected_injection_points:
filtered_df = filtered_df[filtered_df['INJECTION_POINT'].isin(selected_injection_points)]
# Affichage des métriques clés
col1, col2, col3 = st.columns(3)
with col1:
st.metric("Nombre total de traitements", len(filtered_df))
with col2:
st.metric("Nombre de produits utilisés", filtered_df['CHEM_PRODUCT_NAME'].nunique())
with col3:
st.metric("Points d'injection actifs", filtered_df['INJECTION_POINT'].nunique())
# Graphiques
st.subheader("Analyse des traitements chimiques")
# Graphique 1: Evolution temporelle des traitements
fig1 = px.line(
filtered_df,
x='CHEM_DATE',
y='TARGET_PPM',
color='CHEM_PRODUCT_NAME',
title="Evolution des doses de traitement dans le temps"
)
st.plotly_chart(fig1, use_container_width=True)
# Graphique 2: Distribution par point d'injection
col1, col2 = st.columns(2)
with col1:
fig2 = px.pie(
filtered_df,
names='INJECTION_POINT',
title="Distribution par point d'injection"
)
st.plotly_chart(fig2)
with col2:
fig3 = px.box(
filtered_df,
x='CHEM_PRODUCT_NAME',
y='TARGET_PPM',
title="Distribution des doses par produit"
)
st.plotly_chart(fig3)
# Tableau détaillé
st.subheader("Données détaillées")
st.dataframe(
filtered_df.sort_values('CHEM_DATE', ascending=False),
use_container_width=True
)
except Exception as e:
st.error(f"Une erreur s'est produite lors du chargement des données: {str(e)}")
st.info("Veuillez vérifier votre connexion Snowflake et réessayer.")
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?