cameraanalytics / app.py
SHELLAPANDIANGANHUNGING's picture
Create app.py
c463e01 verified
raw
history blame
1.97 kB
import streamlit as st
import pandas as pd
import plotly.express as px
st.set_page_config(page_title="Fatigue Dashboard", layout="wide")
# Load Data
df = pd.read_excel("manual fatique.xlsx")
# Normalize timestamp
timestamp_col = [col for col in df.columns if "GMT" in col or "timestamp" in col.lower()][0]
df["Timestamp"] = pd.to_datetime(df[timestamp_col])
st.title("⛑️ Fatigue Monitoring Dashboard")
# Sidebar Filters
shift_filter = st.sidebar.multiselect("Filter Shift", df['Shift'].unique())
unit_filter = st.sidebar.multiselect("Filter Unit", df['Fleet Number'].unique())
filtered = df.copy()
if shift_filter:
filtered = filtered[filtered['Shift'].isin(shift_filter)]
if unit_filter:
filtered = filtered[filtered['Fleet Number'].isin(unit_filter)]
# KPI Metrics
col1, col2 = st.columns(2)
col1.metric("Total Fatigue Alerts", len(filtered))
col2.metric("Unique Operators", filtered['Operator Name'].nunique())
# Trend per day
trend = filtered.groupby(filtered["Timestamp"].dt.date).size().reset_index(name="Count")
fig = px.line(trend, x="Timestamp", y="Count", title="πŸ“ˆ Trend Fatigue Alerts Per Hari")
st.plotly_chart(fig, use_container_width=True)
# Shift comparison
fig2 = px.bar(filtered, x="Shift", title="⚠️ Distribusi Alert per Shift", color="Shift")
st.plotly_chart(fig2, use_container_width=True)
# Top Units
unit = filtered.groupby("Fleet Number").size().reset_index(name="Count").sort_values("Count", ascending=False)
fig3 = px.bar(unit.head(10), x="Fleet Number", y="Count", title="πŸš› Top 10 Unit dengan Alert Tertinggi")
st.plotly_chart(fig3, use_container_width=True)
# Heatmap jam kejadian
filtered['Hour'] = filtered['Timestamp'].dt.hour
hourly = filtered.groupby('Hour').size().reset_index(name="Count")
fig4 = px.bar(hourly, x='Hour', y='Count', title="πŸ•’ Peak Hour Fatigue Alerts")
st.plotly_chart(fig4, use_container_width=True)
st.caption("Created for Safety Improvement & Predictive Behavior Monitoring")