create a dashboard for tracking production chemicals consumption using only native streamlit chart. Oil and gas context.
To upload files, please first save the app
import streamlit as st
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
# Set page config
st.set_page_config(
page_title="Chemical Consumption Dashboard",
page_icon="🧪",
layout="wide"
)
# Generate sample data
def generate_sample_data(days=90):
dates = [datetime.now() - timedelta(days=x) for x in range(days)]
chemicals = ['Corrosion Inhibitor', 'Scale Inhibitor', 'Biocide', 'Demulsifier']
data = []
for date in dates:
for chemical in chemicals:
# Simulate daily consumption with some randomness and trend
base_consumption = {
'Corrosion Inhibitor': 150,
'Scale Inhibitor': 200,
'Biocide': 75,
'Demulsifier': 100
}
consumption = base_consumption[chemical] * (1 + np.random.normal(0, 0.2))
cost_per_unit = {
'Corrosion Inhibitor': 12,
'Scale Inhibitor': 15,
'Biocide': 20,
'Demulsifier': 18
}
data.append({
'Date': date,
'Chemical': chemical,
'Consumption (L)': consumption,
'Cost per Unit ($)': cost_per_unit[chemical],
'Daily Cost ($)': consumption * cost_per_unit[chemical]
})
return pd.DataFrame(data)
# Generate sample data
df = generate_sample_data()
# Dashboard title
st.title("🧪 Production Chemicals Consumption Dashboard")
st.write("Track and analyze chemical consumption in oil & gas operations")
# Date filter
st.sidebar.header("Filters")
date_range = st.sidebar.date_input(
"Select Date Range",
value=(df['Date'].min(), df['Date'].max()),
min_value=df['Date'].min(),
max_value=df['Date'].max()
)
# Chemical filter
selected_chemicals = st.sidebar.multiselect(
"Select Chemicals",
options=df['Chemical'].unique(),
default=df['Chemical'].unique()
)
# Filter data based on selection
mask = (
(df['Date'].dt.date >= date_range[0]) &
(df['Date'].dt.date <= date_range[1]) &
(df['Chemical'].isin(selected_chemicals))
)
filtered_df = df[mask]
# KPI metrics
col1, col2, col3 = st.columns(3)
with col1:
total_consumption = filtered_df['Consumption (L)'].sum()
st.metric("Total Consumption", f"{total_consumption:,.0f} L")
with col2:
total_cost = filtered_df['Daily Cost ($)'].sum()
st.metric("Total Cost", f"${total_cost:,.0f}")
with col3:
avg_daily_cost = filtered_df.groupby('Date')['Daily Cost ($)'].sum().mean()
st.metric("Average Daily Cost", f"${avg_daily_cost:,.0f}")
# Charts
st.subheader("Daily Consumption by Chemical")
daily_consumption = filtered_df.pivot_table(
index='Date',
columns='Chemical',
values='Consumption (L)',
aggfunc='sum'
)
st.line_chart(daily_consumption)
# Bar chart for total consumption by chemical
st.subheader("Total Consumption by Chemical")
total_by_chemical = filtered_df.groupby('Chemical')['Consumption (L)'].sum()
st.bar_chart(total_by_chemical)
# Create two columns for the next set of charts
col1, col2 = st.columns(2)
with col1:
st.subheader("Daily Cost by Chemical")
daily_cost = filtered_df.pivot_table(
index='Date',
columns='Chemical',
values='Daily Cost ($)',
aggfunc='sum'
)
st.area_chart(daily_cost)
with col2:
st.subheader("Cost Distribution")
cost_distribution = filtered_df.groupby('Chemical')['Daily Cost ($)'].sum()
st.bar_chart(cost_distribution)
# Detailed data table
st.subheader("Detailed Data")
detailed_data = filtered_df.groupby(['Chemical']).agg({
'Consumption (L)': 'sum',
'Daily Cost ($)': 'sum'
}).round(2)
detailed_data.columns = ['Total Consumption (L)', 'Total Cost ($)']
st.dataframe(detailed_data)
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?