import streamlit as st import plotly.express as px import matplotlib.pyplot as plt import seaborn as sns import pandas as pd from sqlalchemy import text from utils.db import engine from sklearn.metrics import silhouette_score def show_scorecard(df): col1, col2, col3, col4 = st.columns(4) # Jumlah lokasi = banyak baris col1.metric("Jumlah Lokasi", len(df)) # Jumlah total pasar dari seluruh baris total_pasar = int(df["JumlahPasar"].sum()) col2.metric("Total Jumlah Pasar", total_pasar) # Rata-rata harga rata_rata_harga = round(df['RataRataHarga'].mean(), 2) col3.metric("Rata-rata Harga Jawa Timur", f"Rp {rata_rata_harga:,.2f}") # Harga pasar tertinggi if not df.empty: max_row = df.loc[df['RataRataHargaTertinggiDiPasar'].idxmax()] nama_pasar = max_row['PasarDenganRataRataHargaTertinggi'] nama_lokasi = max_row['Lokasi'] harga_tertinggi = max_row['RataRataHargaTertinggiDiPasar'] col4.metric( label="Harga Tertinggi di Pasar", value=f"Rp {harga_tertinggi:,.2f}", delta=f"{nama_pasar} - {nama_lokasi}" ) else: col4.metric("Harga Tertinggi di Pasar", "Data tidak tersedia", "") def show_clustermap(df): st.subheader("πΊοΈ Wilayah Dengan Cluster Tingkat Harga di Jawa Timur") required_columns = {"cluster", "Latitude", "Longitude", "Lokasi", "RataRataHarga"} if not required_columns.issubset(df.columns): missing_cols = required_columns - set(df.columns) st.error(f"β Kolom yang hilang: {missing_cols}") st.info(f"β Kolom yang tersedia: {list(df.columns)}") return try: df_map = df.copy() df_map['cluster'] = df_map['cluster'].astype(int) df_map['Latitude'] = pd.to_numeric(df_map['Latitude'], errors='coerce') df_map['Longitude'] = pd.to_numeric(df_map['Longitude'], errors='coerce') df_map['RataRataHarga'] = pd.to_numeric(df_map['RataRataHarga'], errors='coerce') df_map = df_map.dropna(subset=['Latitude', 'Longitude', 'RataRataHarga']) if len(df_map) == 0: st.error("β Tidak ada data valid untuk ditampilkan") return default_labels = {0: "Tinggi", 1: "Sedang", 2: "Rendah"} cluster_labels = st.session_state.get("cluster_labels", default_labels) color_map = {"Tinggi": "#4CAF50", "Rendah": "#F44336", "Sedang": "#FFC107"} size_map = {"Tinggi": 20, "Sedang": 10, "Rendah": 5} df_map['cluster_label'] = df_map['cluster'].map(cluster_labels) df_map['size'] = df_map['cluster_label'].map(size_map).fillna(8) fig = px.scatter_mapbox( df_map, lat="Latitude", lon="Longitude", color="cluster_label", size="size", hover_name="Lokasi", hover_data={"RataRataHarga": True, "Latitude": False, "Longitude": False}, zoom=7, height=550, color_discrete_map=color_map, size_max=30 ) fig.update_layout( mapbox_style="open-street-map", mapbox_center={"lat": -7.5, "lon": 112.5}, margin={"r": 0, "t": 0, "l": 0, "b": 0} ) st.plotly_chart(fig, use_container_width=True) except Exception as e: st.error(f"β Error saat membuat peta: {str(e)}") st.write("Debug info:") st.write(f"Data shape: {df.shape}") st.write(f"Columns: {list(df.columns)}") if len(df) > 0: st.write("Sample data:") st.dataframe(df.head(3)) def show_top_bottom_locations(df): st.subheader("π 5 Lokasi dengan Harga Tertinggi dan Terendah") if "Lokasi" not in df.columns or "RataRataHarga" not in df.columns: st.error("Data tidak mengandung kolom 'Lokasi' atau 'RataRataHarga'") return df_grouped = df.groupby("Lokasi")["RataRataHarga"].mean().reset_index() df_top5 = df_grouped.sort_values(by="RataRataHarga", ascending=False).head(5) df_bottom5 = df_grouped.sort_values(by="RataRataHarga", ascending=True).head(5) col1, col2 = st.columns([1, 1]) with col1: st.markdown("