avalia.EVO / app.py
DavidSB's picture
Update app.py
9e60391
raw
history blame
10.3 kB
# importando as bibliotecas necessárias
import gradio as gr
import pandas as pd
from datetime import datetime
from gradio.components import Number, Textbox, Dropdown, Button
import warnings
from gradio import Interface # Certifique-se de importar o módulo corretamente
# Suprimir todos os avisos durante a execução do script
warnings.filterwarnings("ignore")
# Calcular a data mais recente do CUB fora da função
df_cub = pd.read_excel('TABELAS.xlsx', sheet_name='CUB')
ultimo_cub = df_cub.columns[-1]
def calcular_valor_imovel(area=100, data_refer_str=None, data_const_str=None, tipo_cub="R 1-N (Res. Unifamiliar)",
data_cub_str=None, percentual_cub=1, BDI=22.5, BDI_tipo ="Arbitrado", fator_local = 1, just_fator_local = "-", tipologia="APARTAMENTOS",
estado="B - entre novo e regular", VR=0.0, valor_terreno=0, est_ter="Grau III de fundamentação no métodocomparativo ou no involutivo",
fc=1, fc_just="Arbitrado"):
# Carregar dados dos arquivos Excel
df_cub = pd.read_excel('TABELAS.xlsx', sheet_name='CUB')
df_vida = pd.read_excel('TABELAS.xlsx', sheet_name='VUTIL')
df_dep = pd.read_excel('TABELAS.xlsx', sheet_name='DEP')
df_estado_cons = pd.read_excel('TABELAS.xlsx', sheet_name='estado_cons')
# Converter datas de entrada
if data_refer_str is None or data_refer_str == "":
data_refer = datetime.now()
else:
data_refer = datetime.strptime(data_refer_str, "%m/%Y")
data_const = datetime.strptime(data_const_str, "%m/%Y")
if data_cub_str is None or data_cub_str == "":
data_cub = datetime.now()
else:
data_cub = datetime.strptime(data_cub_str, "%m/%Y")
# Filtrar por tipo_cub
df_tipo_cub = df_cub[df_cub['CÓDIGO'] == tipo_cub]
# Obter o valor do CUB na coluna correspondente à data
valor_cub_column = data_cub.strftime("%m/%Y")
valor_cub = df_tipo_cub.at[df_tipo_cub.index[0], valor_cub_column]
# Idade
idade = data_refer.toordinal() - data_const.toordinal()
if idade > 1:
idade = idade // 365
else:
idade = 1
# Filtrar por %de Vida
vdu = df_vida.loc[(df_vida['FINAL'] == tipologia)]
# % de vida útil
percentual_vdu = (idade / vdu['VIDAUTIL']) * 100
percentual_vdu = int(round(percentual_vdu, 0))
if percentual_vdu != 1:
percentual_vdu = percentual_vdu
else:
percentual_vdu = 2
print(percentual_vdu,"%")
# Filtrar conforme o % de vida útil
df_conserv = df_dep.loc[df_dep['%deVida'] == percentual_vdu]
# Converter o valor residual de string para número (float)
if VR and VR.strip() != "":
VR = float(VR)
else:
VR = 0.0
# Obter da depreciação
coef_HH = float(df_conserv[estado]/100)
coef_HH = round(coef_HH, 3)
# Valor do "Kd"
kd = VR + (1 - coef_HH) * (1 - VR)
kd = round(kd, 3)
# Cálculos
Valor_sem_deprec = round(area * valor_cub * percentual_cub * (1 + BDI / 100) * fator_local, 2)
Valor_com_deprec = Valor_sem_deprec * kd
Valor_com_deprec = round(Valor_com_deprec, 2)
valor_imovel = round((valor_terreno + Valor_com_deprec) * float(fc), 2)
# Atributo da coluna "cons" pelo qual você deseja fazer a correspondência
atributo_desejado = estado
# Encontrar o valor da coluna "obs" com base no atributo da coluna "cons"
valor_obs = df_estado_cons.loc[df_estado_cons['cons'] == atributo_desejado, 'obs'].iloc[0]
valor_inicial = f"""
Área construída (m²): {area}
Data de referência: {data_refer.strftime("%m/%Y")}
Data da construção: {data_const_str}
Data do CUB: {data_cub.strftime("%m/%Y")}
Tipo de CUB: {tipo_cub}
Percentual para adequação do CUB (%): {percentual_cub}
BDI (%): {BDI}
Maneira como o BDI foi elaborado: {BDI_tipo}
Valor CUB: {round(valor_cub, 2)}
Fator local: {fator_local}
Fator local (justificativa): {just_fator_local}
Valor sem depreciação: {Valor_sem_deprec}
"""
deprec = f"""
Tipologia: {tipologia}
Vida útil da tipologia: {int(vdu['VIDAUTIL'])}
Estado de conservação: {estado}
Estado de conservação - descrição: {valor_obs}
% de Vida Útil: {percentual_vdu}
Coeficiente de Depreciação: {coef_HH}
Valor residual (0, 0.1 ou 0.2): {VR}
Kd: {kd}
Valor final construção: {Valor_com_deprec}
"""
valor_ter = f"""
Valor do Terreno: {valor_terreno}
Observação sobre o grau de fundamentação: {est_ter}
"""
valor_final = f"""
FC (Fator de Comercialização): {fc}
Observação sobre o FC: {fc_just}
Valor do Imóvel: {valor_imovel}
"""
return valor_inicial, deprec, valor_ter, valor_final
entradas = [
gr.Number(label="Área construída (m²)", value=100),
gr.Textbox(label="Data de referência (mm/aaaa)", value=ultimo_cub, info="Data do fato gerador da demanda"),
gr.Textbox(label="Data da construção (mm/aaaa)", value=ultimo_cub, info="Data de construção do imóvel"),
gr.Dropdown(label="Tipo de CUB", choices=["R 1-B (Res. Unifamiliar)",
"R 1-N (Res. Unifamiliar)",
"R 1-A (Res. Unifamiliar)",
"PP 4-B (Prédio Popular)",
"PP 4-N (Prédio Popular)",
"R 8-B (Res. Multifamiliar)",
"R 8-N (Res. Multifamiliar)",
"R 8-A (Res. Multifamiliar)",
"R 16-N (Res. Multifamiliar)",
"R 16-A (Res. Multifamiliar)",
"PIS (Projeto Inter. Social)",
"RP1Q (Residência Popular)",
"CAL 8-N (Com. Andar Livres)",
"CAL 8-A (Com. Andar Livres)",
"CSL 8-N (Com.Salas e Lojas)",
"CSL 8-A (Com.Salas e Lojas)",
"CSL 16-N (Com.Salas e Lojas)",
"CSL 16-A (Com.Salas e Lojas)",
"GI (Galpão Industrial)"],
value="R 1-N (Res. Unifamiliar)"),
gr.Textbox(label="Data do CUB (mm/aaaa)", value=ultimo_cub, info="Data do CUB deverá coincidir com a data de referência do laudo"),
gr.Number(label="Percentual para adequação do CUB (%)", value=1, info="Adapatação do CUB para uma situação atípica ou para contemplar insumos/serviços que não constam na composição do CUB"),
gr.Number(label="BDI (%)", value=22.5),
gr.Radio(["Justificado", "Arbitrado"], label="Tipo de BDI", info="Estipule como foi elaborado o % de BDI", value="-"),
gr.Slider(0.5, 1.5, value=1, label="Fator local", info="Escolha um coeficiente de valorização local baseado no seu conhecimento de mercado", step = 0.1),
gr.Textbox(label="Justificativa para o Fator Local", value="-", info="Justifique tecnicamente a utilização deste fator"),
gr.Dropdown(label="Tipologia", choices=["APARTAMENTOS", "BANCOS", "CASAS DE ALVENARIA",
"CASAS DE MADEIRA", "HOTÉIS", "LOJAS", "TEATROS",
"ARMAZÉNS", "FÁBRICAS", "CONST. RURAIS", "GARAGENS",
"EDIFÍCIOS DE ESCRITÓRIOS", "GALPÕES (DEPÓSITOS)", "SILOS"],
value="CASAS DE ALVENARIA"),
gr.Dropdown(label="Estado de conservação", choices=["A - novo", "B - entre novo e regular",
"C - regular", "D - entre regular e reparos simples",
"E - reparos simples", "F - entre reparos simples e importantes",
"G - reparos importantes", "H - entre reparos importantes e sem valor"],
value="A - novo"),
gr.Dropdown(label="Valor residual (0, 0.1 ou 0.2)", choices=["0", "0.1", "0.2"], value="0"),
gr.Number(label="Valor do Terreno", value=0),
gr.Radio(["Grau III de fundamentação no método comparativo ou no involutivo",
"Grau II de fundamentação no método comparativo ou no involutivo",
"Grau I de fundamentação no método comparativo ou no involutivo"],
info="Escolha o Grau de Fundamentação alcançado pelo avaliação do terreno", label=""),
gr.Slider(0.1, 2.0, value=1.0, label="FC (Fator de Comercialização)", info="O Fator de Comercialização, também chamado de Terceiro Componente ou Vantagem da Coisa Feita, é definido no item 3.20 da NBR 14653-1:2001: “Fator de comercialização: Razão entre o valor de mercado de um bem e o seu custo de reedição ou de substituição, que pode ser maior ou menor que 1", step = 0.1),
gr.Radio(["Inferido em mercado semelhante", "Justificado", "Arbitrado"], label="Tipo de BDI", info="Estipule como foi elaborado o % de BDI"),
]
saida = [
gr.Textbox(label = "Valor Inicial da Contrução"),
gr.Textbox(label = "Cálculo da Depreciação"),
gr.Textbox(label = "Valor estimado para o terreno"),
gr.Textbox(label = "Valor final do imóvel")
]
interface = gr.Interface(fn=calcular_valor_imovel, inputs=entradas, outputs=saida, title="<span style='color: gray; font-size: 52px;'>aval</span><span style='color: black; font-size: 52px;'>ia</span><span style='color: gray; font-size: 56px;'>.EVO</span>",
description=f"""
<p style="text-align: left;"><b><span style='color: gray; font-size: 40px;'>aval</span><span style='color: black; font-size: 40px;'>ia</span><span style='color: gray; font-size: 40px;'>.se</b></p>
""",
theme=gr.themes.Monochrome()
)
interface.launch()