viabilidade / app.py
SilvioLima's picture
Update app.py
ec10bb0 verified
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.")