ChapzZz/IU-Informatica-Urbana
0
1import os, pathlib2 3# Garante que o Streamlit usa uma HOME válida e cria a pasta4os.environ.setdefault("HOME", "/home/user")5os.environ.setdefault("STREAMLIT_HOME", "/home/user/.streamlit")6 7# Se não vier do ambiente, usa /app/.streamlit8streamlit_home = os.environ.get("STREAMLIT_HOME", "/app/.streamlit")9pathlib.Path(streamlit_home).mkdir(parents=True, exist_ok=True)10 11# (opcional) escrever/garantir um config básico12cfg = os.path.join(streamlit_home, "config.toml")13if not os.path.exists(cfg):14 with open(cfg, "w", encoding="utf-8") as f:15 f.write(16 "[server]\nheadless = true\nenableCORS = false\n"17 'address = "0.0.0.0"\nport = 8501\n\n'18 "[browser]\ngatherUsageStats = false\n"19 )20 21 22# Evita tentativa de escrita de métricas em local sem permissões23os.environ["STREAMLIT_BROWSER_GATHERUSAGESTATS"] = "false"24 25import streamlit as st26import pandas as pd27import joblib28import folium29from folium.plugins import MarkerCluster30from streamlit_folium import st_folium31 32# --- Configuração da página ---33st.set_page_config(page_title="Previsão de Trânsito", page_icon="🚦", layout="wide")34 35st.title("🚦 Previsão de Trânsito")36st.markdown("---")37 38# --- Carregar modelos ---39@st.cache_resource40def load_models():41 modelo = joblib.load("modelo_rf.joblib")42 le = joblib.load("label_encoder.joblib")43 eixos = joblib.load("lista_eixos.joblib")44 return modelo, le, eixos45 46try:47 modelo, le, eixos = load_models()48except Exception as e:49 st.error("Erro ao carregar os modelos: {}".format(e))50 st.stop()51 52# --- Interface de input ---53col1, col2 = st.columns(2)54with col1:55 dia_semana = st.selectbox("📅 Dia da semana:", le.classes_ if hasattr(le, "classes_") else ["Segunda","Terça","Quarta","Quinta","Sexta"])56with col2:57 hora = st.slider("⏰ Hora do dia:", 0, 23, 8)58 59# --- Botão de previsão ---60if st.button("🔮 Prever Trânsito"):61 try:62 weekday_code = le.transform([dia_semana])[0] if hasattr(le, "transform") else 063 64 entrada = pd.DataFrame({65 "Day": [15],66 "Weekday": [weekday_code],67 "Hour": [hora],68 "CarCount": [50],69 "BikeCount": [5],70 "BusCount": [3],71 "TruckCount": [10]72 })73 74 pred = modelo.predict(entrada)75 situacao = pred[0]76 77 cor_texto = {78 "low": "green",79 "normal": "blue",80 "high": "orange",81 "very high": "red"82 }.get(str(situacao).lower(), "black")83 84 st.markdown(f"<h2 style='color:{cor_texto};text-align:center'>Previsão: {situacao}</h2>", unsafe_allow_html=True)85 86 except Exception as e:87 st.error(f"Erro durante a previsão: {e}")88 89st.markdown("---")90st.subheader("🗺️ Mapa de Eixos Viários")91 92# Criar mapa simples com Folium93mapa = folium.Map(location=[38.7169, -9.139], zoom_start=12)94marker_cluster = MarkerCluster().add_to(mapa)95 96# Adicionar pontos fictícios se não houver eixos97if eixos:98 for eixo in eixos[:50]:99 lat, lon = eixo.get("lat", 38.7169), eixo.get("lon", -9.139)100 folium.Marker([lat, lon], popup=f"Eixo: {eixo}").add_to(marker_cluster)101else:102 folium.Marker([38.7169, -9.139], popup="Exemplo de Eixo").add_to(marker_cluster)103 104# Renderizar mapa105st_data = st_folium(mapa, width=700, height=500)106 