Spaces:
Sleeping
Sleeping
| 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""" | |
| <div style="display: flex; justify-content: center;"> | |
| <img src="data:image/png;base64,{base64_image}" alt="Imagem" style="width: 50%; height: auto;"> | |
| </div> | |
| """, | |
| unsafe_allow_html=True | |
| ) | |
| st.sidebar.image(logo, caption="", use_container_width=True) | |
| html_page_title = """ | |
| <div style="background-color:black;padding=60px"> | |
| <p style='text-align:center;font-size:50px;font-weight:bold; color:white'>Estudo de Viabilidade de Projeto</p> | |
| </div> | |
| """ | |
| st.sidebar.markdown(html_page_title, unsafe_allow_html=True) | |
| html_page_mensagem1 = """ | |
| <div style="background-color:black;padding=20px"> | |
| <p style='text-align:center;font-size:20px;font-weight:bold; color:white'>Enviar a Planilha CSV com as seguintes informações</p> | |
| </div> | |
| """ | |
| st.markdown(html_page_mensagem1, unsafe_allow_html=True) | |
| html_page_mensagem2 = """ | |
| <div style="background-color:black;padding=20px"> | |
| <p style='text-align:center;font-size:18px;font-weight:bold; color:white'>investimento, preco, custo_variavel, demanda_1, demanda_2, demanda_3, demanda_4, demanda_5, selic</p> | |
| </div> | |
| """ | |
| 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.") | |