import streamlit as st from PIL import Image import pandas as pd import numpy as np import base64 import joblib from sklearn.preprocessing import LabelEncoder, MinMaxScaler import random # Configura o pandas para exibir floats com 2 casas decimais pd.set_option('display.float_format', '{:.2f}'.format) # Page configuration st.set_page_config( page_title="Viabilidade", page_icon="🔎", layout="wide", initial_sidebar_state="expanded" ) def validar_e_transformar_dados(novos_dados: pd.DataFrame): # 1. Carregar encoders se existirem try: label_encoders = joblib.load(f'modelo/label_encoders.joblib') except FileNotFoundError: label_encoders = {} # 2. Carregar preprocessor preprocessor = joblib.load(f'modelo/modelo_preprocessor.joblib') # 3. Obter colunas do treinamento try: colunas_numericas = preprocessor.transformers_[0][2] except: colunas_numericas = [] colunas_categoricas = list(label_encoders.keys()) todas_colunas_esperadas = colunas_numericas + colunas_categoricas # 4. Validar colunas if set(novos_dados.columns) != set(todas_colunas_esperadas): raise ValueError(f"\n❌ Colunas esperadas: {todas_colunas_esperadas}\n🔴 Encontradas: {novos_dados.columns.tolist()}") # 5. Aplicar LabelEncoders for col, encoder in label_encoders.items(): novos_dados[col] = encoder.transform(novos_dados[col]) # 6. Aplicar scaler dados_transformados = preprocessor.transform(novos_dados) print("Transformação de novos dados concluída.") return dados_transformados # Função para codificar a imagem em base64 def encode_image(image_path): with open(image_path, "rb") as image_file: return base64.b64encode(image_file.read()).decode('utf-8') # Interface do Streamlit logo = Image.open('img/logo.png') img = Image.open('img/fundo1.png') image_path="fundo.png" img.save(image_path) # Getting the base64 string base64_image = encode_image(image_path) # Usando HTML para centralizar a imagem st.markdown( f"""
Imagem
""", unsafe_allow_html=True ) st.sidebar.image(logo, caption="", use_container_width=True) html_page_title = """

Estudo de Viabilidade de Projeto

""" st.sidebar.markdown(html_page_title, unsafe_allow_html=True) html_page_mensagem1 = """

Enviar a Planilha CSV com as seguintes informações

""" st.markdown(html_page_mensagem1, unsafe_allow_html=True) html_page_mensagem2 = """

investimento, preco, custo_variavel, demanda_1, demanda_2, demanda_3, demanda_4, demanda_5, selic

""" st.markdown(html_page_mensagem2, unsafe_allow_html=True) uploaded_files = st.file_uploader( "Selecione a planilha", type=["csv"], # Tipos de arquivo permitidos accept_multiple_files=False # Permite upload de vários arquivos ) if uploaded_files is not None: st.write(uploaded_files.name) df = pd.read_csv(uploaded_files) colunas = ['investimento', 'preco', 'custo_variavel', 'demanda_1', 'demanda_2', 'demanda_3', 'demanda_4', 'demanda_5', 'selic'] df = df[colunas] st.table(df.head()) size = df.shape[0] st.write(f"Primeiras 5 linhas de {size}") if st.button("Sortear dados"): indice = random.randint(0, len(df) - 1) st.write(f"Índice sorteado: {indice}") df_teste = df.iloc[indice].to_frame(name='Dados para Teste').T st.table(df_teste) #if st.button("Analisar dados 🔍", type="primary"): with st.spinner("Processando imagens..."): # Processar novos dados para o modelo avaliar preprocessed_data = validar_e_transformar_dados(df_teste) # Carregar o modelo treinado e avaliado best_model = joblib.load('modelo/best_model.joblib') # Agora você pode usar 'preprocessed_data' para fazer previsões: predictions = np.argmax(best_model.predict(preprocessed_data), axis=1) if predictions: # 1 st.subheader(f' 🏅 Pode comprar a champanhe!!!') st.balloons() else: st.subheader(" 😮 Pense melhor nisso.") st.snow() else: st.info("Nenhuma planilha carregada ainda.")