xValentim's picture
Fix: 100 head
4d81db2
import pandas as pd
import numpy as np
import streamlit as st
import tensorflow as tf
from sklearn.preprocessing import LabelEncoder, StandardScaler
from sklearn.model_selection import train_test_split
from tensorflow.keras.layers import Input, Embedding, Flatten, Concatenate, Dense, BatchNormalization, Dropout
from tensorflow.keras.models import Model
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import LogisticRegression
# app.py
# Função de Preprocessamento
def preprocess_data(base_final):
# Convertendo indenização e tempo para numéricos
base_final['indenizacao_num'] = pd.to_numeric(base_final['indenizacao'], errors='coerce')
base_final['tempo_num'] = pd.to_numeric(base_final['tempo_meses'], errors='coerce')
# Identificar variáveis categóricas e numéricas
categorical_cols = ['classe', 'comarca', 'danos', 'resultado']
numerical_cols = base_final.select_dtypes(include=['float64', 'int64']).columns
# Imputação para variáveis categóricas
from sklearn.impute import SimpleImputer
imputer_cat = SimpleImputer(strategy='most_frequent')
base_final[categorical_cols] = imputer_cat.fit_transform(base_final[categorical_cols])
# Imputação para variáveis numéricas
imputer_num = SimpleImputer(strategy='mean')
base_final[numerical_cols] = imputer_num.fit_transform(base_final[numerical_cols])
# Criar dummies para todas as variáveis categóricas
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder(drop='first', sparse_output=False)
dummies = pd.DataFrame(
encoder.fit_transform(base_final[categorical_cols]),
columns=encoder.get_feature_names_out(categorical_cols),
index=base_final.index
)
# Combinar variáveis contínuas com dummies
base_final_preprocessed = pd.concat([base_final, dummies], axis=1)
base_final_preprocessed.drop(columns=categorical_cols, inplace=True)
base_final_preprocessed = base_final_preprocessed.select_dtypes(include=[np.number])
return base_final_preprocessed
# Função de Modelagem para Indenização
def model_indenizacao(base_final_preprocessed):
X = base_final_preprocessed.drop(columns=['tempo_num', 'indenizacao_num'], errors='ignore')
y_indenizacao = base_final_preprocessed['indenizacao_num']
# Divisão entre treino e teste
X_train, X_test, y_train_indenizacao, y_test_indenizacao = train_test_split(X, y_indenizacao, test_size=0.3, random_state=42)
rf_model_indenizacao = RandomForestRegressor(n_estimators=100, random_state=42)
rf_model_indenizacao.fit(X_train, y_train_indenizacao)
y_pred_indenizacao = rf_model_indenizacao.predict(X_test)
rmse_indenizacao = np.sqrt(mean_squared_error(y_test_indenizacao, y_pred_indenizacao))
return rf_model_indenizacao, rmse_indenizacao
# Função de Modelagem para Tempo
def model_tempo(base_final_preprocessed):
X = base_final_preprocessed.drop(columns=['tempo_num', 'indenizacao_num'], errors='ignore')
y_tempo = base_final_preprocessed['tempo_num']
# Divisão entre treino e teste
X_train, X_test, y_train_tempo, y_test_tempo = train_test_split(X, y_tempo, test_size=0.3, random_state=42)
rf_model_tempo = RandomForestRegressor(n_estimators=100, random_state=42)
rf_model_tempo.fit(X_train, y_train_tempo)
y_pred_tempo = rf_model_tempo.predict(X_test)
rmse_tempo = np.sqrt(mean_squared_error(y_test_tempo, y_pred_tempo))
return rf_model_tempo, rmse_tempo
# Função de Classificação de Risco
def model_risco(base_final, X_test, rf_model_indenizacao, rf_model_tempo):
logistic_model = LogisticRegression(max_iter=500)
logistic_model.fit(X_test, (base_final['resultado'] == 'Procedente').astype(int))
y_pred_proba = logistic_model.predict_proba(X_test)[:, 1]
y_pred_indenizacao = logistic_model.predict(X_test)
provisionamento_esperado = (y_pred_indenizacao * y_pred_proba).sum()
# Classificação de Risco
X_test_df = base_final.loc[X_test.index].copy()
X_test_df['prob_perda'] = y_pred_proba
X_test_df['risco'] = np.select(
[X_test_df['prob_perda'] < 0.3,
(X_test_df['prob_perda'] >= 0.3) & (X_test_df['prob_perda'] < 0.7),
X_test_df['prob_perda'] >= 0.7],
['Remoto', 'Possível', 'Provável'],
default='Desconhecido'
)
return provisionamento_esperado, X_test_df
# Título do App
st.title("Sistema Jurídico - Modelagem de Indenização e Tempo de Processo")
# Upload de arquivo
uploaded_file = st.file_uploader("Faça o upload do arquivo Excel", type=["xlsx"])
if uploaded_file:
# Carregar os dados
base_final = pd.read_excel(uploaded_file)
st.subheader("Passo 1: Preprocessamento")
base_final_preprocessed = preprocess_data(base_final)
st.write("Dados preprocessados:", base_final_preprocessed.head(100))
st.subheader("Passo 2: Modelos Preditivos")
rf_model_indenizacao, rmse_indenizacao = model_indenizacao(base_final_preprocessed)
st.write(f"RMSE (Indenização): {rmse_indenizacao:.2f}")
rf_model_tempo, rmse_tempo = model_tempo(base_final_preprocessed)
st.write(f"RMSE (Tempo do Processo): {rmse_tempo:.2f}")
st.subheader("Passo 3: Provisionamento e Classificação de Risco")
provisionamento_esperado, X_test_df = model_risco(base_final, base_final_preprocessed, rf_model_indenizacao, rf_model_tempo)
st.write(f"Provisionamento esperado: R$ {provisionamento_esperado:.2f}")
st.write("Classificação de Risco:", X_test_df[['risco', 'indenizacao_num']].head(100))
# st.subheader("Passo 4: Classificação de Tempo do Processo")
# X_test_df['tempo_estimado'] = rf_model_tempo.predict(X_test_df)
# X_test_df['categoria_tempo'] = np.select(
# [X_test_df['tempo_estimado'] < 6,
# (X_test_df['tempo_estimado'] >= 6) & (X_test_df['tempo_estimado'] < 12),
# X_test_df['tempo_estimado'] >= 12],
# ['Curto', 'Moderado', 'Longo'],
# default='Desconhecido'
# )
# st.write("Classificação de Tempo:", X_test_df[['categoria_tempo', 'tempo_meses']].head(100))
# Gráficos opcionais
st.subheader("Distribuição de Previsões")
st.bar_chart(X_test_df['risco'].value_counts())