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")