create a dashboard to follow chemical production consumation in an oil and gas context.
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
import numpy as np
from datetime import datetime, timedelta
# Set page config
st.set_page_config(
page_title="Chemical Production Dashboard",
page_icon="🏭",
layout="wide"
)
# Generate sample data
@st.cache_data
def generate_sample_data():
dates = pd.date_range(start='2023-01-01', end='2023-12-31', freq='D')
chemicals = ['Corrosion Inhibitor', 'Scale Inhibitor', 'Biocide', 'Demulsifier']
data = []
for chemical in chemicals:
base_consumption = np.random.uniform(100, 500)
for date in dates:
# Add some randomness and seasonal variation
seasonal_factor = 1 + 0.2 * np.sin(2 * np.pi * date.dayofyear / 365)
daily_consumption = base_consumption * seasonal_factor * np.random.uniform(0.8, 1.2)
data.append({
'Date': date,
'Chemical': chemical,
'Consumption (L)': daily_consumption,
'Stock Level (L)': base_consumption * 30 * np.random.uniform(0.5, 0.9),
'Cost ($)': daily_consumption * np.random.uniform(2, 5)
})
return pd.DataFrame(data)
# Main layout
st.title("⚗️ Chemical Production Dashboard")
# Load data
df = generate_sample_data()
# Sidebar filters
st.sidebar.header("Filters")
# Date range selector
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 selector
selected_chemicals = st.sidebar.multiselect(
"Select Chemicals",
options=df['Chemical'].unique(),
default=df['Chemical'].unique()
)
# Filter data based on selections
mask = (df['Date'].dt.date >= date_range[0]) & (df['Date'].dt.date <= date_range[1])
filtered_df = df[mask & df['Chemical'].isin(selected_chemicals)]
# Create three columns for KPIs
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['Cost ($)'].sum()
st.metric("Total Cost", f"${total_cost:,.2f}")
with col3:
avg_daily_consumption = filtered_df.groupby('Date')['Consumption (L)'].sum().mean()
st.metric("Avg Daily Consumption", f"{avg_daily_consumption:,.0f} L")
# Create two columns for charts
col1, col2 = st.columns(2)
with col1:
st.subheader("Daily Consumption by Chemical")
fig_consumption = px.line(
filtered_df,
x='Date',
y='Consumption (L)',
color='Chemical',
title='Daily Chemical Consumption'
)
st.plotly_chart(fig_consumption, use_container_width=True)
with col2:
st.subheader("Current Stock Levels")
current_stock = filtered_df.groupby('Chemical')['Stock Level (L)'].last().reset_index()
fig_stock = px.bar(
current_stock,
x='Chemical',
y='Stock Level (L)',
title='Current Stock Levels'
)
st.plotly_chart(fig_stock, use_container_width=True)
# Cost analysis
st.subheader("Cost Analysis")
cost_by_chemical = filtered_df.groupby('Chemical')['Cost ($)'].sum().reset_index()
fig_cost = px.pie(
cost_by_chemical,
values='Cost ($)',
names='Chemical',
title='Cost Distribution by Chemical'
)
st.plotly_chart(fig_cost, use_container_width=True)
# Detailed data table
st.subheader("Detailed Data")
st.dataframe(
filtered_df.sort_values('Date', ascending=False)
.round(2)
.style.format({
'Consumption (L)': '{:,.0f}',
'Stock Level (L)': '{:,.0f}',
'Cost ($)': '${:,.2f}'
})
)
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?