Callmebowoo-22's picture
Update app.py
140a9fa verified
import streamlit as st
import pandas as pd
import matplotlib.pyplot as plt
from utils.preprocessing import clean_data
from utils.models import predict_umkm
# Konfigurasi tampilan
st.set_page_config(page_title="AI Supply Chain UMKM", layout="wide")
st.title("πŸ›’ AI Manajemen Inventori UMKM")
# Sidebar untuk parameter
with st.sidebar:
st.header("βš™οΈ Pengaturan")
hari_prediksi = st.slider("Jumlah Hari Prediksi", 1, 14, 7)
stok_aman = st.number_input("Stok Pengaman (Safety Stock)", min_value=0, value=10)
# Upload data
uploaded_file = st.file_uploader(
"Upload Data Historis (Format CSV)",
type="csv",
help="Contoh format: tanggal, demand, supply"
)
if uploaded_file:
try:
# ===== 1. Preprocessing =====
df = clean_data(uploaded_file)
# Validasi kolom
if not all(col in df.columns for col in ['tanggal', 'demand', 'supply']):
raise ValueError("Format kolom harus: tanggal, demand, supply")
# ===== 2. Visualisasi Data =====
st.subheader("πŸ“ˆ Tren Historis")
fig, ax = plt.subplots(figsize=(12, 6))
ax.plot(df['tanggal'], df['demand'], label='Permintaan', color='#1f77b4', marker='o')
ax.plot(df['tanggal'], df['supply'], label='Persediaan', color='#ff7f0e', marker='s')
ax.fill_between(
df['tanggal'],
df['demand'],
df['supply'],
where=(df['supply'] > df['demand']),
color='#2ca02c', alpha=0.3, label='Surplus'
)
ax.fill_between(
df['tanggal'],
df['demand'],
df['supply'],
where=(df['supply'] < df['demand']),
color='#d62728', alpha=0.3, label='Defisit'
)
ax.set_xlabel("Tanggal")
ax.set_ylabel("Jumlah Unit")
ax.legend()
ax.grid(True)
st.pyplot(fig)
# ===== 3. Prediksi & Rekomendasi =====
st.subheader("πŸ€– Rekomendasi AI")
with st.spinner("Menganalisis data..."):
hasil = predict_umkm(
data=df,
prediction_length=hari_prediksi,
safety_stock=stok_aman
)
st.success(f"**Rekomendasi:** {hasil['rekomendasi']}")
with st.expander("πŸ“Š Detail Analisis"):
st.write(f"**Prediksi {hari_prediksi} Hari:**")
st.line_chart(pd.Series(hasil['prediksi'], name='Prediksi'))
st.json({
"ROI Estimasi": f"{hasil['roi']}%",
"Stok Optimal": hasil['stok_optimal'],
"Anomali Terdeteksi": hasil['anomali']
})
except Exception as e:
st.error(f"⚠️ Error: {str(e)}")
st.info("Pastikan file CSV sesuai format contoh di bawah")
else:
st.info("""
**Contoh Data CSV:**
```csv
tanggal,demand,supply
2024-01-01,100,120
2024-01-02,150,130
2024-01-03,200,180
```
""")