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. Ne pas utiliser plotly. Utiliser uniquement des librairies par défaut existantes sur streamlite
To upload files, please first save the app
import streamlit as st
import pandas as pd
import altair as alt
from datetime import datetime, timedelta
st.set_page_config(layout="wide")
st.title("Chemical Treatment Dashboard")
# Initializing the data
data = {
'CHEM_DATE': pd.date_range(start='2023-01-01', periods=100),
'INJECTION_POINT': ['Point A', 'Point B', 'Point C'] * 34,
'CHEM_PRODUCT_NAME': ['Product X', 'Product Y', 'Product Z'] * 34,
'TREATED_FLUID': ['Water', 'Oil', 'Gas'] * 34,
'TREATED_FLOWRATE': [100 + x for x in range(100)],
'TARGET_INJECTION_RATE': [10 + x/2 for x in range(100)],
'TARGET_PPM': [50 + x for x in range(100)],
'IS_FIELD_TEST': [True, False] * 50,
'IS_BATCH': [True, False] * 50,
'BSW_TREATED_FLUID': [x/100 for x in range(100)],
'TEMP_TREATED_FLUID': [60 + x/2 for x in range(100)],
'PRESSURE_TREATED_FLUID': [1000 + x*10 for x in range(100)],
'TDS_TREATED_FLUID': [5000 + x*100 for x in range(100)],
'PH_TREATED_FLUID': [7 + x/100 for x in range(100)],
'SUBSTITUTE_PRODUCT': ['Sub A', 'Sub B', 'None'] * 34
}
df = pd.DataFrame(data)
# Sidebar filters
st.sidebar.header('Filters')
# Date filter
date_min = df['CHEM_DATE'].min()
date_max = df['CHEM_DATE'].max()
selected_dates = st.sidebar.date_input(
"Select Date Range",
value=(date_min, date_max),
min_value=date_min,
max_value=date_max
)
# Product filter
all_products = list(df['CHEM_PRODUCT_NAME'].unique())
selected_products = st.sidebar.multiselect(
'Select Chemical Products',
all_products,
default=all_products
)
# Injection point filter
all_points = list(df['INJECTION_POINT'].unique())
selected_points = st.sidebar.multiselect(
'Select Injection Points',
all_points,
default=all_points
)
# Filter the dataframe
mask = (
(df['CHEM_DATE'].dt.date >= selected_dates[0]) &
(df['CHEM_DATE'].dt.date <= selected_dates[1]) &
(df['CHEM_PRODUCT_NAME'].isin(selected_products)) &
(df['INJECTION_POINT'].isin(selected_points))
)
filtered_df = df[mask]
# Display key metrics
col1, col2, col3 = st.columns(3)
with col1:
st.metric("Total Treatments", len(filtered_df))
with col2:
st.metric("Average Flow Rate", f"{filtered_df['TREATED_FLOWRATE'].mean():.2f}")
with col3:
st.metric("Average Target PPM", f"{filtered_df['TARGET_PPM'].mean():.2f}")
# Charts
st.subheader("Treatment Analysis")
# Create treatment timeline chart
timeline_chart = alt.Chart(filtered_df).mark_circle().encode(
x='CHEM_DATE:T',
y='TARGET_INJECTION_RATE:Q',
color='CHEM_PRODUCT_NAME:N',
tooltip=['CHEM_DATE', 'CHEM_PRODUCT_NAME', 'TARGET_INJECTION_RATE', 'INJECTION_POINT']
).properties(
height=300
).interactive()
st.altair_chart(timeline_chart, use_container_width=True)
# Create distribution by injection point
injection_chart = alt.Chart(filtered_df).mark_bar().encode(
x='INJECTION_POINT:N',
y='count():Q',
color='CHEM_PRODUCT_NAME:N'
).properties(
height=300
).interactive()
st.altair_chart(injection_chart, use_container_width=True)
# Display filtered data table
st.subheader("Detailed Data")
st.dataframe(filtered_df)
# Download button for filtered data
csv = filtered_df.to_csv(index=False).encode('utf-8')
st.download_button(
label="Download filtered data as CSV",
data=csv,
file_name="chemical_treatment_data.csv",
mime="text/csv",
)
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?