import os
import warnings
# --- TİTREMEYİ VE GEREKSİZ LOGLARI ENGELLE ---
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
os.environ['TF_ENABLE_ONEDNN_OPTS'] = '0'
warnings.filterwarnings('ignore')
import streamlit as st
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import pickle
from tensorflow.keras.models import load_model
# Sayfa Yapılandırması
st.set_page_config(page_title="Hotel AI Decision Support", layout="wide")
@st.cache_resource
def load_assets():
model_file = "hotel_model.keras"
scaler_file = "scaler.pkl"
if not os.path.exists(model_file) or not os.path.exists(scaler_file):
st.error("❌ Dosyalar bulunamadı! Lütfen Hugging Face klasörünüzü kontrol edin.")
st.stop()
model = load_model(model_file)
with open(scaler_file, "rb") as f:
sc = pickle.load(f)
return model, sc
try:
model, sc = load_assets()
except Exception as e:
st.error(f"⚠️ Yükleme Hatası: {e}")
st.stop()
# ==========================================
# SIDEBAR / SOL PANEL (TÜM BİLGİLER BURADA)
# ==========================================
with st.sidebar:
st.markdown("
📖 User Guide / Rehber
", unsafe_allow_html=True)
# 1. NASIL YÜKLENMELİ?
st.markdown("### 📥 How to Upload? / Nasıl Yüklenmeli?")
st.info("""
**Format:** Sütun adı **'bookings'** olan bir CSV yükleyin.
| bookings |
| :--- |
| 120 |
| 155 |
""")
# 2. ANALİZİ BAŞLAT (İstediğin yer: Rehberin hemen altı)
st.markdown("### 🚀 Start Analysis / Analizi Başlat")
file = st.file_uploader("Upload CSV / CSV Yükle", type=["csv"])
st.markdown("---")
# 3. BOOKINGS NEDİR?
st.markdown("### ❓ What is 'Bookings'? / 'Bookings' Nedir?")
st.write("""
**EN:** Total daily reservations. (Example: 150 means 150 rooms sold)
**TR:** Günlük toplam rezervasyon. (Örn: 150 değeri o gün 150 oda satıldığını gösterir)
""")
st.markdown("---")
# 4. YOĞUNLUK MANTIĞI
st.markdown("### 📊 Thresholds / Yoğunluk")
st.warning("**High (Yoğun):** > Ortalamadan %20 fazla")
st.success("**Stable (Stabil):** Normal aralıkta")
# ==========================================
# MAIN CONTENT / ANA SAYFA
# ==========================================
st.markdown("🏨 Hotel Demand Forecasting / Otel Talep Tahmini
", unsafe_allow_html=True)
if file is not None:
df = pd.read_csv(file)
# AI TAHMİN SÜRECİ
raw_data = df[["bookings"]].values
data_scaled = sc.transform(raw_data)
predictions_scaled = model.predict(data_scaled, verbose=0)
predictions = sc.inverse_transform(predictions_scaled).flatten().astype(int)
avg_val = int(predictions.mean())
busy_limit = int(avg_val * 1.2)
current_max = int(predictions.max())
# 1. METRİKLER (EN ÜSTTE)
st.markdown("---")
c1, c2, c3 = st.columns(3)
with c1: st.markdown(f"Avg Forecast / Ort. Tahmin
{avg_val}
", unsafe_allow_html=True)
with c2: st.markdown(f"Busy Threshold / Yoğunluk Sınırı
{busy_limit}
", unsafe_allow_html=True)
with c3:
status_color = "#e67e22" if current_max >= busy_limit else "#27ae60"
status_text = "HIGH / YOĞUN" if current_max >= busy_limit else "STABLE / STABİL"
st.markdown(f"Status / Durum
{status_text}
", unsafe_allow_html=True)
# 2. YÖNETİM TAVSİYESİ (ÜSTTE)
st.markdown("---")
st.markdown("👔 Management Advice / Yönetim Tavsiyesi
", unsafe_allow_html=True)
adv_en, adv_tr = st.columns(2)
with adv_en:
if current_max >= busy_limit: st.warning("**High Demand Advice:** Peak days detected. Increase staff.")
else: st.success("**Stable Demand Advice:** Demand is normal. Focus on maintenance.")
with adv_tr:
if current_max >= busy_limit: st.warning("**Yoğun Talep Tavsiyesi:** Zirve günler tespit edildi. Personel artırın.")
else: st.success("**Stabil Talep Tavsiyesi:** Talep normal. Bakım işlerine odaklanılabilir.")
# 3. SONUÇ TABLOSU (GRAFİK ÜSTÜNDE)
st.markdown("---")
st.subheader("📋 Results Table / Sonuç Tablosu")
res_df = pd.DataFrame({"Actual / Gerçek": raw_data.flatten(), "Predicted / Tahmin": predictions})
st.dataframe(res_df, width=1200, height=250)
st.download_button("📥 Download Results", res_df.to_csv(index=False).encode('utf-8'), "hotel_results.csv", "text/csv")
# 4. GRAFİK
st.markdown("---")
st.subheader("📈 Prediction Graph / Tahmin Grafiği")
plt.clf()
fig, ax = plt.subplots(figsize=(10, 3.5))
ax.plot(raw_data, label="Actual / Gerçek", color="#bdc3c7", alpha=0.6, linestyle='--')
ax.plot(predictions, label="AI Forecast / YZ Tahmini", color="#2980b9", linewidth=2)
ax.axhline(y=busy_limit, color='#e74c3c', linestyle=':', label="Limit")
ax.legend(prop={'size': 8})
st.pyplot(fig, clear_figure=True)
# 5. VERİ ÖN İZLEME (EN ALTTA)
st.markdown("---")
st.subheader("📊 Data Preview / Veri Ön İzleme")
st.dataframe(df, width=1200, height=150)
else:
st.warning("👈 Please upload a CSV file from the left panel. / Lütfen sol panelden bir CSV dosyası yükleyin.")