Spaces:
Running
Running
Upload 14 files
Browse files- DAI.png +0 -0
- MOD_V_AP_Z1_019A.py +205 -0
- MOD_V_AP_Z1_Z2_001.py +206 -0
- MOD_V_AP_Z1_Z2_001A.py +212 -0
- MOD_V_SALA_Z1_002C.py +93 -0
- MOD_V_SALA_Z1_002D_A.py +103 -0
- MOD_V_SALA_Z1_002E.py +108 -0
- apartamentos.py +57 -0
- app.py +87 -0
- aptos_2024.py +153 -0
- aptos_2025.py +154 -0
- salas.py +63 -0
- salas_2024.py +149 -0
- salas_2025.py +149 -0
DAI.png
ADDED
|
MOD_V_AP_Z1_019A.py
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import openpyxl
|
| 2 |
+
import gradio as gr
|
| 3 |
+
import joblib
|
| 4 |
+
import pandas as pd
|
| 5 |
+
import numpy as np
|
| 6 |
+
import seaborn as sns
|
| 7 |
+
import statsmodels.api as sm
|
| 8 |
+
import matplotlib.pyplot as plt
|
| 9 |
+
import io
|
| 10 |
+
from sklearn.preprocessing import MinMaxScaler
|
| 11 |
+
from reportlab.lib import colors
|
| 12 |
+
from reportlab.lib.units import inch
|
| 13 |
+
from reportlab.lib.pagesizes import A4, landscape
|
| 14 |
+
from reportlab.lib.styles import getSampleStyleSheet
|
| 15 |
+
from reportlab.pdfgen.canvas import Canvas
|
| 16 |
+
from reportlab.platypus import SimpleDocTemplate, Spacer, Image, Frame, PageTemplate, BaseDocTemplate, Table, Paragraph, NextPageTemplate, PageBreak
|
| 17 |
+
|
| 18 |
+
df = pd.read_excel('dados/MOD_V_AP_Z1_019A/BD_MOD_V_AP_Z1_019A.xlsx', 'laudo')
|
| 19 |
+
df.rename(columns={2020: 'ANO_2020', 2021: 'ANO_2021', 2022: 'ANO_2022', 'IDADE+1': 'IDADE', 'AP/AT': 'AP_AT'}, inplace=True)
|
| 20 |
+
df[['RH', 'APRIV', 'VUAPRIV']] = np.log(df[['RH', 'APRIV', 'VUAPRIV']])
|
| 21 |
+
|
| 22 |
+
# Separar as variáveis independentes (X) e dependente (y)
|
| 23 |
+
X = df[['ANO_2020', 'ANO_2021', 'ANO_2022', 'RH', 'COB', 'APRIV', 'AP_AT', 'PAVTO', 'MEDIO', 'FINO', 'IDADE']]
|
| 24 |
+
y = df['VUAPRIV']
|
| 25 |
+
|
| 26 |
+
|
| 27 |
+
def get_report(ANO_2020, ANO_2021, ANO_2022, RH, COB, APRIV, AP_AT, PAVTO, MEDIO, FINO, IDADE, pred, lower_bound, per_low, upper_bound, per_up, scatterplot_image):
|
| 28 |
+
# Define the page size
|
| 29 |
+
pagesize = A4 # You can adjust the page size as needed
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
def on_page(canvas, doc):
|
| 33 |
+
page_num = canvas.getPageNumber()
|
| 34 |
+
canvas.drawCentredString(pagesize[0] / 2, 50, str(page_num))
|
| 35 |
+
|
| 36 |
+
def on_page_landscape(canvas, doc):
|
| 37 |
+
return on_page(canvas, doc, pagesize=landscape(A4))
|
| 38 |
+
|
| 39 |
+
padding = dict(
|
| 40 |
+
leftPadding=72,
|
| 41 |
+
rightPadding=72,
|
| 42 |
+
topPadding=72,
|
| 43 |
+
bottomPadding=18)
|
| 44 |
+
|
| 45 |
+
portrait_frame = Frame(0, 0, *A4, **padding)
|
| 46 |
+
landscape_frame = Frame(0, 0, *landscape(A4), **padding)
|
| 47 |
+
|
| 48 |
+
portrait_template = PageTemplate(id='portrait',
|
| 49 |
+
frames=portrait_frame,
|
| 50 |
+
onPage=on_page,
|
| 51 |
+
pagesize=A4)
|
| 52 |
+
|
| 53 |
+
landscape_template = PageTemplate(id='landscape',
|
| 54 |
+
frames=landscape_frame,
|
| 55 |
+
onPage=on_page_landscape,
|
| 56 |
+
pagesize=landscape(A4))
|
| 57 |
+
|
| 58 |
+
doc = BaseDocTemplate('report.pdf',
|
| 59 |
+
pageTemplates=[portrait_template,landscape_template])
|
| 60 |
+
|
| 61 |
+
|
| 62 |
+
def fig2image(image_path):
|
| 63 |
+
return Image(image_path, 6 * inch, 2 * inch) # Adjust the width and height as needed
|
| 64 |
+
|
| 65 |
+
|
| 66 |
+
def df2table(df):
|
| 67 |
+
return Table([[Paragraph(col) for col in df.columns]] + df.values.tolist(),
|
| 68 |
+
style=[('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
|
| 69 |
+
('LINEBELOW',(0,0), (-1,0), 1, colors.black),
|
| 70 |
+
('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
|
| 71 |
+
('BOX', (0,0), (-1,-1), 1, colors.black),
|
| 72 |
+
('ROWBACKGROUNDS', (0,0), (-1,-1), [colors.lightgrey, colors.white])],
|
| 73 |
+
hAlign = 'LEFT')
|
| 74 |
+
|
| 75 |
+
scatterplot_image = "scatterplot.png" # Provide the correct path to your saved scatterplot image
|
| 76 |
+
|
| 77 |
+
styles = getSampleStyleSheet()
|
| 78 |
+
|
| 79 |
+
story = [
|
| 80 |
+
Image('DAI.png', width=6.4 * inch, height=1.28 * inch),
|
| 81 |
+
Spacer(1, 36),
|
| 82 |
+
Paragraph('MOD_V_AP_Z1_019A', styles['Heading1']),
|
| 83 |
+
Paragraph('Parâmetros do cálculo', styles['Heading2']),
|
| 84 |
+
Paragraph(f"Ano 2020 - Exercício Fiscal 2021: {ANO_2020}", styles['Normal']),
|
| 85 |
+
Paragraph(f"Ano 2021 - Exercício Fiscal 2022: {ANO_2021}", styles['Normal']),
|
| 86 |
+
Paragraph(f"Ano 2022 - Exercício Fiscal 2023: {ANO_2022}", styles['Normal']),
|
| 87 |
+
Paragraph(f"Região Homogênea: {RH}", styles['Normal']),
|
| 88 |
+
Paragraph(f"Apartamento de Cobertura: {COB}", styles['Normal']),
|
| 89 |
+
Paragraph(f"Área Privativa: {APRIV}", styles['Normal']),
|
| 90 |
+
Paragraph(f"Relação entre Área Privativa e Área Total: {AP_AT}", styles['Normal']),
|
| 91 |
+
Paragraph(f"Pavimento: {PAVTO}", styles['Normal']),
|
| 92 |
+
Paragraph(f"Padrão Médio: {MEDIO}", styles['Normal']),
|
| 93 |
+
Paragraph(f"Padrão Fino: {FINO}", styles['Normal']),
|
| 94 |
+
Paragraph(f"Idade: {IDADE}", styles['Normal']),
|
| 95 |
+
PageBreak(),
|
| 96 |
+
Image('DAI.png', width=6.4 * inch, height=1.28 * inch),
|
| 97 |
+
Spacer(1, 36),
|
| 98 |
+
Paragraph('Resultados', styles['Heading1']),
|
| 99 |
+
Paragraph('Valor do imóvel (R$/m²)', styles['Heading2']),
|
| 100 |
+
Paragraph(f"R$ {round(pred[0], 2)}", styles['Normal']),
|
| 101 |
+
Paragraph('Limite Inferior do Intervalo de Confiança', styles['Heading2']),
|
| 102 |
+
Paragraph(f"R$ {round(lower_bound, 2)}", styles['Normal']),
|
| 103 |
+
Paragraph('Percentual Limite Inferior do IC', styles['Heading2']),
|
| 104 |
+
Paragraph(f"{round(per_low[0]*100, 2)}%", styles['Normal']),
|
| 105 |
+
Paragraph('Limite Superior do Intervalo de Confiança', styles['Heading2']),
|
| 106 |
+
Paragraph(f"R$ {round(upper_bound, 2)}", styles['Normal']),
|
| 107 |
+
Paragraph('Percentual Limite Superior do IC', styles['Heading2']),
|
| 108 |
+
Paragraph(f"{round(per_up[0]*100, 2)}%", styles['Normal']),
|
| 109 |
+
Paragraph('Gráfico - Previstos X Observados', styles['Heading2']),
|
| 110 |
+
fig2image(scatterplot_image),
|
| 111 |
+
]
|
| 112 |
+
|
| 113 |
+
doc.build(story)
|
| 114 |
+
|
| 115 |
+
|
| 116 |
+
|
| 117 |
+
def execute(ANO_2020, ANO_2021, ANO_2022, RH, COB, APRIV, AP_AT, PAVTO, MEDIO, FINO, IDADE):
|
| 118 |
+
df = pd.DataFrame.from_dict({'ANO_2020': int(ANO_2020),
|
| 119 |
+
'ANO_2021': int(ANO_2021),
|
| 120 |
+
'ANO_2022': int(ANO_2022),
|
| 121 |
+
'RH': np.log([RH]),
|
| 122 |
+
'COB': int(COB),
|
| 123 |
+
'APRIV': np.log([APRIV]),
|
| 124 |
+
'AP_AT': float(AP_AT),
|
| 125 |
+
'PAVTO': int(PAVTO),
|
| 126 |
+
'MEDIO': int(MEDIO),
|
| 127 |
+
'FINO': int(FINO),
|
| 128 |
+
'IDADE': int(IDADE)}
|
| 129 |
+
)
|
| 130 |
+
|
| 131 |
+
|
| 132 |
+
X_with_constant = sm.add_constant(X)
|
| 133 |
+
model = sm.OLS(y, X_with_constant)
|
| 134 |
+
results = model.fit()
|
| 135 |
+
X_new = np.array(df).reshape(1, -1)
|
| 136 |
+
X_new_with_constant = np.insert(X_new, 0, 1)
|
| 137 |
+
y_pred = results.predict(X_new_with_constant)
|
| 138 |
+
ci = results.get_prediction(X_new_with_constant).conf_int()
|
| 139 |
+
lower_bound = np.exp(ci[0][0])
|
| 140 |
+
per_low = (np.exp(y_pred)-np.exp(ci[0][0]))/np.exp(y_pred)
|
| 141 |
+
upper_bound = np.exp(ci[0][1])
|
| 142 |
+
per_up = (np.exp(ci[0][1])-np.exp(y_pred))/np.exp(y_pred)
|
| 143 |
+
pred = np.exp(y_pred)
|
| 144 |
+
|
| 145 |
+
X_plot = np.linspace(2000, 14000, 100)
|
| 146 |
+
Y_plot = X_plot
|
| 147 |
+
X_pred = np.array(X)
|
| 148 |
+
X_pred_cons = np.insert(X_pred, 0, 1, axis=1)
|
| 149 |
+
x_, y_ = pd.Series(np.array(np.exp(y)), name="Observado"), pd.Series(np.exp(results.predict(X_pred_cons)), name="Previsto")
|
| 150 |
+
|
| 151 |
+
plt.figure(figsize=(18, 6))
|
| 152 |
+
sns.scatterplot(x=x_, y=y_)
|
| 153 |
+
plt.xlabel("Observados")
|
| 154 |
+
plt.ylabel("Previstos")
|
| 155 |
+
plt.tight_layout()
|
| 156 |
+
plt.plot(X_plot, Y_plot, color='r')
|
| 157 |
+
plt.savefig("scatterplot.png")
|
| 158 |
+
plt.close()
|
| 159 |
+
|
| 160 |
+
texto_1 = f"R$ {round(pred[0], 2)}"
|
| 161 |
+
texto_2 = f"R$ {round(lower_bound, 2)}"
|
| 162 |
+
texto_3 = f"{round(per_low[0]*100, 2)}%"
|
| 163 |
+
texto_4 = f"R$ {round(upper_bound, 2)}"
|
| 164 |
+
texto_5 = f"{round(per_up[0]*100, 2)}%"
|
| 165 |
+
get_report(ANO_2020, ANO_2021, ANO_2022, RH, COB, APRIV, AP_AT, PAVTO, MEDIO, FINO, IDADE, pred, lower_bound, per_low, upper_bound, per_up, "scatterplot.png")
|
| 166 |
+
return texto_1, texto_2, texto_3, texto_4, texto_5, "scatterplot.png", 'report.pdf'
|
| 167 |
+
|
| 168 |
+
|
| 169 |
+
|
| 170 |
+
|
| 171 |
+
def load_inputs():
|
| 172 |
+
APRIV = gr.inputs.Number(default = 80., label='Área Privativa')
|
| 173 |
+
RH = gr.inputs.Number(default = 250, label='Região Homogênea')
|
| 174 |
+
PAVTO = gr.inputs.Number(default = 5, label='Pavimento')
|
| 175 |
+
COB = gr.inputs.Checkbox(default=False, label='É apartamento de cobertura?')
|
| 176 |
+
IDADE = gr.inputs.Number(default = 5, label='Idade')
|
| 177 |
+
AP_AT = gr.inputs.Number(default = .7, label='Razão entre Área privativa e Área total')
|
| 178 |
+
MEDIO = gr.inputs.Checkbox(default=False, label='Padrão Médio')
|
| 179 |
+
FINO = gr.inputs.Checkbox(default=True, label='Padrão Fino')
|
| 180 |
+
ANO_2020 = gr.inputs.Checkbox(default=False, label='Ano 2020 - Carga Geral 2021')
|
| 181 |
+
ANO_2021 = gr.inputs.Checkbox(default=False, label='Ano 2021 - Carga Geral 2022')
|
| 182 |
+
ANO_2022 = gr.inputs.Checkbox(default=True, label='Ano 2022 - Carga Geral 2023')
|
| 183 |
+
return [ANO_2020, ANO_2021, ANO_2022, RH, COB, APRIV, AP_AT, PAVTO, MEDIO, FINO, IDADE]
|
| 184 |
+
|
| 185 |
+
title = 'MOD_V_AP_Z1_019A (Apartamentos)'
|
| 186 |
+
|
| 187 |
+
#description = "656 dados de 2019 a 2023 | Para informações do modelo, você pode baixar <a href='https://git-colocation.procempa.com.br/calculadora/calc-venda-salas-comerciais/-/raw/main/dados/MOD_V_SALA_Z1_002C/MOD_V_SALA_Z1_002C.pdf' download='MOD_V_SALA_Z1_002C.pdf'>aqui</a>."
|
| 188 |
+
|
| 189 |
+
|
| 190 |
+
description = f"""
|
| 191 |
+
# <p style="text-align: center; color: #789987;"> 📊 <span style='color: #123123;'>MOD_V_AP_Z1_019A</span> 📊 </p>
|
| 192 |
+
<p style="text-align: center;">736 dados de 2019 a 2022 | Para informações do modelo, você pode baixar <a href='https://huggingface.co/spaces/fschwartzer/teste_tabs_gradio/resolve/main/dados/MOD_V_SALA_Z1_002C/MOD_V_SALA_Z1_002C.pdf' download='MOD_V_SALA_Z1_002C.pdf'>aqui</a></p>
|
| 193 |
+
<hr style="color: #333; background-color: #333; height: 1px; border: none;">
|
| 194 |
+
<p style="text-align: center;"> <b>RH</b> | Menor: 100 - Maior: 380 </p>
|
| 195 |
+
<p style="text-align: center;"> <b>Área Privativa</b> | Menor: 61.08 - Maior: 450.45 </p>
|
| 196 |
+
<p style="text-align: center;"> <b>Razão entre Área privativa e Área total</b> | Menor: 0.52 - Maior: 0.89 </p>
|
| 197 |
+
<p style="text-align: center;"> <b>Pavimento</b> | Menor: 1 - Maior: 19 </p>
|
| 198 |
+
<p style="text-align: center;"> <b>Idade</b> | Menor: 1 - Maior: 65 </p>
|
| 199 |
+
<hr style="color: #333; background-color: #333; height: 1px; border: none;">
|
| 200 |
+
<p style="text-align: center;"> <b>BAIRROS:</b> Auxiliadora, Bela Vista, Boa Vista, Higienópolis e Mont Serrat </p>
|
| 201 |
+
<hr style="color: #333; background-color: #333; height: 1px; border: none;">
|
| 202 |
+
<p style="text-align: center;"> <b>Observações:</b> </p>
|
| 203 |
+
<p style="text-align: center;"> <b>1)</b> Para o Ano 2019 - Exercício Fiscal 2020, deixar todas as caixas de Ano desmarcadas. </p>
|
| 204 |
+
<p style="text-align: center;"> <b>2)</b> Para o Padrão Luxo, deixar Padrão Fino e Médio desmarcados. </p>
|
| 205 |
+
"""
|
MOD_V_AP_Z1_Z2_001.py
ADDED
|
@@ -0,0 +1,206 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import openpyxl
|
| 2 |
+
import gradio as gr
|
| 3 |
+
import joblib
|
| 4 |
+
import pandas as pd
|
| 5 |
+
import numpy as np
|
| 6 |
+
import seaborn as sns
|
| 7 |
+
import statsmodels.api as sm
|
| 8 |
+
import matplotlib.pyplot as plt
|
| 9 |
+
import io
|
| 10 |
+
from sklearn.preprocessing import MinMaxScaler
|
| 11 |
+
from reportlab.lib import colors
|
| 12 |
+
from reportlab.lib.units import inch
|
| 13 |
+
from reportlab.lib.pagesizes import A4, landscape
|
| 14 |
+
from reportlab.lib.styles import getSampleStyleSheet
|
| 15 |
+
from reportlab.pdfgen.canvas import Canvas
|
| 16 |
+
from reportlab.platypus import SimpleDocTemplate, Spacer, Image, Frame, PageTemplate, BaseDocTemplate, Table, Paragraph, NextPageTemplate, PageBreak
|
| 17 |
+
|
| 18 |
+
df = pd.read_excel('dados/MOD_V_AP_Z1_Z2_001/MOD_V_AP_Z1_Z2_001.xlsx')
|
| 19 |
+
df.rename(columns={2019: 'ANO_2019', 2020: 'ANO_2020', 2021: 'ANO_2021', 2022: 'ANO_2022', 'IDADE+1': 'IDADE', 'AP/AT': 'AP_AT'}, inplace=True)
|
| 20 |
+
df[['RH', 'APRIV', 'VUAPRIV']] = np.log(df[['RH', 'APRIV', 'VUAPRIV']])
|
| 21 |
+
|
| 22 |
+
# Separar as variáveis independentes (X) e dependente (y)
|
| 23 |
+
X = df[['ANO_2019', 'ANO_2020', 'ANO_2021', 'ANO_2022', 'RH', 'COB', 'APRIV', 'AP_AT', 'PAVTO', 'FINO', 'LUXO', 'IDADE']]
|
| 24 |
+
y = df['VUAPRIV']
|
| 25 |
+
|
| 26 |
+
|
| 27 |
+
def get_report(ANO_2019, ANO_2020, ANO_2021, ANO_2022, RH, COB, APRIV, AP_AT, PAVTO, FINO, LUXO, IDADE, pred, lower_bound, per_low, upper_bound, per_up, scatterplot_image):
|
| 28 |
+
# Define the page size
|
| 29 |
+
pagesize = A4 # You can adjust the page size as needed
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
def on_page(canvas, doc):
|
| 33 |
+
page_num = canvas.getPageNumber()
|
| 34 |
+
canvas.drawCentredString(pagesize[0] / 2, 50, str(page_num))
|
| 35 |
+
|
| 36 |
+
def on_page_landscape(canvas, doc):
|
| 37 |
+
return on_page(canvas, doc, pagesize=landscape(A4))
|
| 38 |
+
|
| 39 |
+
padding = dict(
|
| 40 |
+
leftPadding=72,
|
| 41 |
+
rightPadding=72,
|
| 42 |
+
topPadding=72,
|
| 43 |
+
bottomPadding=18)
|
| 44 |
+
|
| 45 |
+
portrait_frame = Frame(0, 0, *A4, **padding)
|
| 46 |
+
landscape_frame = Frame(0, 0, *landscape(A4), **padding)
|
| 47 |
+
|
| 48 |
+
portrait_template = PageTemplate(id='portrait',
|
| 49 |
+
frames=portrait_frame,
|
| 50 |
+
onPage=on_page,
|
| 51 |
+
pagesize=A4)
|
| 52 |
+
|
| 53 |
+
landscape_template = PageTemplate(id='landscape',
|
| 54 |
+
frames=landscape_frame,
|
| 55 |
+
onPage=on_page_landscape,
|
| 56 |
+
pagesize=landscape(A4))
|
| 57 |
+
|
| 58 |
+
doc = BaseDocTemplate('report.pdf',
|
| 59 |
+
pageTemplates=[portrait_template,landscape_template])
|
| 60 |
+
|
| 61 |
+
|
| 62 |
+
def fig2image(image_path):
|
| 63 |
+
return Image(image_path, 6 * inch, 2 * inch) # Adjust the width and height as needed
|
| 64 |
+
|
| 65 |
+
|
| 66 |
+
def df2table(df):
|
| 67 |
+
return Table([[Paragraph(col) for col in df.columns]] + df.values.tolist(),
|
| 68 |
+
style=[('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
|
| 69 |
+
('LINEBELOW',(0,0), (-1,0), 1, colors.black),
|
| 70 |
+
('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
|
| 71 |
+
('BOX', (0,0), (-1,-1), 1, colors.black),
|
| 72 |
+
('ROWBACKGROUNDS', (0,0), (-1,-1), [colors.lightgrey, colors.white])],
|
| 73 |
+
hAlign = 'LEFT')
|
| 74 |
+
|
| 75 |
+
scatterplot_image = "scatterplot.png" # Provide the correct path to your saved scatterplot image
|
| 76 |
+
|
| 77 |
+
styles = getSampleStyleSheet()
|
| 78 |
+
|
| 79 |
+
story = [
|
| 80 |
+
Image('DAI.png', width=6.4 * inch, height=1.28 * inch),
|
| 81 |
+
Spacer(1, 36),
|
| 82 |
+
Paragraph('MOD_V_AP_Z1_Z2_001', styles['Heading1']),
|
| 83 |
+
Paragraph('Parâmetros do cálculo', styles['Heading2']),
|
| 84 |
+
Paragraph(f"Ano 2019 - Exercício Fiscal 2020: {ANO_2019}", styles['Normal']),
|
| 85 |
+
Paragraph(f"Ano 2020 - Exercício Fiscal 2021: {ANO_2020}", styles['Normal']),
|
| 86 |
+
Paragraph(f"Ano 2021 - Exercício Fiscal 2022: {ANO_2021}", styles['Normal']),
|
| 87 |
+
Paragraph(f"Ano 2022 - Exercício Fiscal 2023: {ANO_2022}", styles['Normal']),
|
| 88 |
+
Paragraph(f"Região Homogênea: {RH}", styles['Normal']),
|
| 89 |
+
Paragraph(f"Apartamento de Cobertura: {COB}", styles['Normal']),
|
| 90 |
+
Paragraph(f"Área Privativa: {APRIV}", styles['Normal']),
|
| 91 |
+
Paragraph(f"Relação entre Área Privativa e Área Total: {AP_AT}", styles['Normal']),
|
| 92 |
+
Paragraph(f"Pavimento: {PAVTO}", styles['Normal']),
|
| 93 |
+
Paragraph(f"Padrão Fino: {FINO}", styles['Normal']),
|
| 94 |
+
Paragraph(f"Padrão Luxo: {LUXO}", styles['Normal']),
|
| 95 |
+
Paragraph(f"Idade: {IDADE}", styles['Normal']),
|
| 96 |
+
PageBreak(),
|
| 97 |
+
Image('DAI.png', width=6.4 * inch, height=1.28 * inch),
|
| 98 |
+
Spacer(1, 36),
|
| 99 |
+
Paragraph('Resultados', styles['Heading1']),
|
| 100 |
+
Paragraph('Valor do imóvel (R$/m²)', styles['Heading2']),
|
| 101 |
+
Paragraph(f"R$ {round(pred[0], 2)}", styles['Normal']),
|
| 102 |
+
Paragraph('Limite Inferior do Intervalo de Confiança', styles['Heading2']),
|
| 103 |
+
Paragraph(f"R$ {round(lower_bound, 2)}", styles['Normal']),
|
| 104 |
+
Paragraph('Percentual Limite Inferior do IC', styles['Heading2']),
|
| 105 |
+
Paragraph(f"{round(per_low[0]*100, 2)}%", styles['Normal']),
|
| 106 |
+
Paragraph('Limite Superior do Intervalo de Confiança', styles['Heading2']),
|
| 107 |
+
Paragraph(f"R$ {round(upper_bound, 2)}", styles['Normal']),
|
| 108 |
+
Paragraph('Percentual Limite Superior do IC', styles['Heading2']),
|
| 109 |
+
Paragraph(f"{round(per_up[0]*100, 2)}%", styles['Normal']),
|
| 110 |
+
Paragraph('Gráfico - Previstos X Observados', styles['Heading2']),
|
| 111 |
+
fig2image(scatterplot_image),
|
| 112 |
+
]
|
| 113 |
+
|
| 114 |
+
doc.build(story)
|
| 115 |
+
|
| 116 |
+
|
| 117 |
+
|
| 118 |
+
def execute(ANO_2019, ANO_2020, ANO_2021, ANO_2022, RH, COB, APRIV, AP_AT, PAVTO, FINO, LUXO, IDADE):
|
| 119 |
+
df = pd.DataFrame.from_dict({'ANO_2019': int(ANO_2019),
|
| 120 |
+
'ANO_2020': int(ANO_2020),
|
| 121 |
+
'ANO_2021': int(ANO_2021),
|
| 122 |
+
'ANO_2022': int(ANO_2022),
|
| 123 |
+
'RH': np.log([RH]),
|
| 124 |
+
'COB': int(COB),
|
| 125 |
+
'APRIV': np.log([APRIV]),
|
| 126 |
+
'AP_AT': float(AP_AT),
|
| 127 |
+
'PAVTO': int(PAVTO),
|
| 128 |
+
'FINO': int(FINO),
|
| 129 |
+
'LUXO': int(LUXO),
|
| 130 |
+
'IDADE': int(IDADE)}
|
| 131 |
+
)
|
| 132 |
+
|
| 133 |
+
|
| 134 |
+
X_with_constant = sm.add_constant(X)
|
| 135 |
+
model = sm.OLS(y, X_with_constant)
|
| 136 |
+
results = model.fit()
|
| 137 |
+
X_new = np.array(df).reshape(1, -1)
|
| 138 |
+
X_new_with_constant = np.insert(X_new, 0, 1)
|
| 139 |
+
y_pred = results.predict(X_new_with_constant)
|
| 140 |
+
ci = results.get_prediction(X_new_with_constant).conf_int(alpha=0.2)
|
| 141 |
+
lower_bound = np.exp(ci[0][0])
|
| 142 |
+
per_low = (np.exp(y_pred)-np.exp(ci[0][0]))/np.exp(y_pred)
|
| 143 |
+
upper_bound = np.exp(ci[0][1])
|
| 144 |
+
per_up = (np.exp(ci[0][1])-np.exp(y_pred))/np.exp(y_pred)
|
| 145 |
+
pred = np.exp(y_pred)
|
| 146 |
+
|
| 147 |
+
X_plot = np.linspace(min(y), max(y), 100)
|
| 148 |
+
Y_plot = X_plot
|
| 149 |
+
X_pred = np.array(X)
|
| 150 |
+
X_pred_cons = np.insert(X_pred, 0, 1, axis=1)
|
| 151 |
+
x_, y_ = pd.Series(np.array(y), name="Observado"), pd.Series(results.predict(X_pred_cons), name="Previsto")
|
| 152 |
+
|
| 153 |
+
plt.figure(figsize=(18, 6))
|
| 154 |
+
sns.scatterplot(x=x_, y=y_)
|
| 155 |
+
plt.xlabel("Observados")
|
| 156 |
+
plt.ylabel("Previstos")
|
| 157 |
+
plt.tight_layout()
|
| 158 |
+
plt.plot(X_plot, Y_plot, color='r')
|
| 159 |
+
plt.savefig("scatterplot.png")
|
| 160 |
+
plt.close()
|
| 161 |
+
|
| 162 |
+
texto_1 = f"R$ {round(pred[0], 2)}"
|
| 163 |
+
texto_2 = f"R$ {round(lower_bound, 2)}"
|
| 164 |
+
texto_3 = f"{round(per_low[0]*100, 2)}%"
|
| 165 |
+
texto_4 = f"R$ {round(upper_bound, 2)}"
|
| 166 |
+
texto_5 = f"{round(per_up[0]*100, 2)}%"
|
| 167 |
+
get_report(ANO_2019, ANO_2020, ANO_2021, ANO_2022, RH, COB, APRIV, AP_AT, PAVTO, FINO, LUXO, IDADE, pred, lower_bound, per_low, upper_bound, per_up, "scatterplot.png")
|
| 168 |
+
return texto_1, texto_2, texto_3, texto_4, texto_5, "scatterplot.png", 'report.pdf'
|
| 169 |
+
|
| 170 |
+
|
| 171 |
+
|
| 172 |
+
|
| 173 |
+
def load_inputs():
|
| 174 |
+
APRIV = gr.inputs.Number(default = 80., label='Área Privativa')
|
| 175 |
+
RH = gr.inputs.Number(default = 250, label='Região Homogênea')
|
| 176 |
+
PAVTO = gr.inputs.Number(default = 5, label='Pavimento')
|
| 177 |
+
COB = gr.inputs.Checkbox(default=False, label='É apartamento de cobertura?')
|
| 178 |
+
IDADE = gr.inputs.Number(default = 5, label='Idade')
|
| 179 |
+
AP_AT = gr.inputs.Number(default = .7, label='Razão entre Área privativa e Área total')
|
| 180 |
+
FINO = gr.inputs.Checkbox(default=False, label='Padrão Fino')
|
| 181 |
+
LUXO = gr.inputs.Checkbox(default=True, label='Padrão Luxo')
|
| 182 |
+
ANO_2019 = gr.inputs.Checkbox(default=False, label='Ano 2019 - Carga Geral 2020')
|
| 183 |
+
ANO_2020 = gr.inputs.Checkbox(default=False, label='Ano 2020 - Carga Geral 2021')
|
| 184 |
+
ANO_2021 = gr.inputs.Checkbox(default=False, label='Ano 2021 - Carga Geral 2022')
|
| 185 |
+
ANO_2022 = gr.inputs.Checkbox(default=True, label='Ano 2022 - Carga Geral 2023')
|
| 186 |
+
return [ANO_2019, ANO_2020, ANO_2021, ANO_2022, RH, COB, APRIV, AP_AT, PAVTO, FINO, LUXO, IDADE]
|
| 187 |
+
|
| 188 |
+
title = 'MOD_V_AP_Z1_Z2_001 (Apartamentos)'
|
| 189 |
+
|
| 190 |
+
|
| 191 |
+
description = f"""
|
| 192 |
+
# <p style="text-align: center;">MOD_V_AP_Z1_Z2_001</p>
|
| 193 |
+
<p style="text-align: center;">1255 dados de 2019 a 2022 | Para informações do modelo, você pode baixar <a href='https://raw.githubusercontent.com/fschwartzer/DAI/main/MOD_V_AP_Z1_Z2_001.pdf' download='MOD_V_AP_Z1_Z2_001.pdf'>aqui</a></p>
|
| 194 |
+
<hr style="color: #333; background-color: #333; height: 1px; border: none;">
|
| 195 |
+
<p style="text-align: center;"> <b>RH</b> | Menor: 73 - Maior: 380 </p>
|
| 196 |
+
<p style="text-align: center;"> <b>Área Privativa</b> | Menor: 60.39 - Maior: 547.92 </p>
|
| 197 |
+
<p style="text-align: center;"> <b>Razão entre Área privativa e Área total</b> | Menor: 0.51 - Maior: 0.90 </p>
|
| 198 |
+
<p style="text-align: center;"> <b>Pavimento</b> | Menor: 1 - Maior: 19 </p>
|
| 199 |
+
<p style="text-align: center;"> <b>Idade</b> | Menor: 1 - Maior: 67 </p>
|
| 200 |
+
<hr style="color: #333; background-color: #333; height: 1px; border: none;">
|
| 201 |
+
<p style="text-align: center;"> <b>BAIRROS:</b> Auxiliadora, Bela Vista, Boa Vista, Higienópolis, Mont Serrat e Passo da Areia.</p>
|
| 202 |
+
<hr style="color: #333; background-color: #333; height: 1px; border: none;">
|
| 203 |
+
<p style="text-align: center;"> <b>Observações:</b> </p>
|
| 204 |
+
<p style="text-align: center;"> <b>1)</b> Para o Ano 2023 - Exercício Fiscal 2024, deixar todas as caixas de Ano desmarcadas. </p>
|
| 205 |
+
<p style="text-align: center;"> <b>2)</b> Para o Padrão Médio, deixar Padrão Fino e Luxo desmarcados. </p>
|
| 206 |
+
"""
|
MOD_V_AP_Z1_Z2_001A.py
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import openpyxl
|
| 2 |
+
import gradio as gr
|
| 3 |
+
import joblib
|
| 4 |
+
import pandas as pd
|
| 5 |
+
import numpy as np
|
| 6 |
+
import seaborn as sns
|
| 7 |
+
import statsmodels.api as sm
|
| 8 |
+
import matplotlib.pyplot as plt
|
| 9 |
+
import io
|
| 10 |
+
from sklearn.preprocessing import MinMaxScaler
|
| 11 |
+
from reportlab.lib import colors
|
| 12 |
+
from reportlab.lib.units import inch
|
| 13 |
+
from reportlab.lib.pagesizes import A4, landscape
|
| 14 |
+
from reportlab.lib.styles import getSampleStyleSheet
|
| 15 |
+
from reportlab.pdfgen.canvas import Canvas
|
| 16 |
+
from reportlab.platypus import SimpleDocTemplate, Spacer, Image, Frame, PageTemplate, BaseDocTemplate, Table, Paragraph, NextPageTemplate, PageBreak
|
| 17 |
+
|
| 18 |
+
df = pd.read_excel('dados/MOD_V_AP_Z1_Z2_001A/MOD_V_AP_Z1_Z2_001A.xlsx')
|
| 19 |
+
df.rename(columns={2020: 'ANO_2020', 2021: 'ANO_2021', 2022: 'ANO_2022', 2023: 'ANO_2023', 2024: 'ANO_2024', 2025: 'ANO_2025','IDADE+1': 'IDADE', 'AP/AT': 'AP_AT'}, inplace=True)
|
| 20 |
+
df[['RH', 'APRIV', 'VUAPRIV']] = np.log(df[['RH', 'APRIV', 'VUAPRIV']])
|
| 21 |
+
|
| 22 |
+
# Separar as variáveis independentes (X) e dependente (y)
|
| 23 |
+
X = df[['ANO_2020', 'ANO_2021', 'ANO_2022', 'ANO_2023', 'ANO_2024', 'ANO_2025', 'RH', 'COB', 'APRIV', 'AP_AT', 'PAVTO', 'FINO', 'LUXO', 'IDADE']]
|
| 24 |
+
y = df['VUAPRIV']
|
| 25 |
+
|
| 26 |
+
|
| 27 |
+
def get_report(ANO_2020, ANO_2021, ANO_2022, ANO_2023, ANO_2024, ANO_2025, RH, COB, APRIV, AP_AT, PAVTO, FINO, LUXO, IDADE, pred, lower_bound, per_low, upper_bound, per_up, scatterplot_image):
|
| 28 |
+
# Define the page size
|
| 29 |
+
pagesize = A4 # You can adjust the page size as needed
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
def on_page(canvas, doc):
|
| 33 |
+
page_num = canvas.getPageNumber()
|
| 34 |
+
canvas.drawCentredString(pagesize[0] / 2, 50, str(page_num))
|
| 35 |
+
|
| 36 |
+
def on_page_landscape(canvas, doc):
|
| 37 |
+
return on_page(canvas, doc, pagesize=landscape(A4))
|
| 38 |
+
|
| 39 |
+
padding = dict(
|
| 40 |
+
leftPadding=72,
|
| 41 |
+
rightPadding=72,
|
| 42 |
+
topPadding=72,
|
| 43 |
+
bottomPadding=18)
|
| 44 |
+
|
| 45 |
+
portrait_frame = Frame(0, 0, *A4, **padding)
|
| 46 |
+
landscape_frame = Frame(0, 0, *landscape(A4), **padding)
|
| 47 |
+
|
| 48 |
+
portrait_template = PageTemplate(id='portrait',
|
| 49 |
+
frames=portrait_frame,
|
| 50 |
+
onPage=on_page,
|
| 51 |
+
pagesize=A4)
|
| 52 |
+
|
| 53 |
+
landscape_template = PageTemplate(id='landscape',
|
| 54 |
+
frames=landscape_frame,
|
| 55 |
+
onPage=on_page_landscape,
|
| 56 |
+
pagesize=landscape(A4))
|
| 57 |
+
|
| 58 |
+
doc = BaseDocTemplate('report.pdf',
|
| 59 |
+
pageTemplates=[portrait_template,landscape_template])
|
| 60 |
+
|
| 61 |
+
|
| 62 |
+
def fig2image(image_path):
|
| 63 |
+
return Image(image_path, 6 * inch, 2 * inch) # Adjust the width and height as needed
|
| 64 |
+
|
| 65 |
+
|
| 66 |
+
def df2table(df):
|
| 67 |
+
return Table([[Paragraph(col) for col in df.columns]] + df.values.tolist(),
|
| 68 |
+
style=[('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
|
| 69 |
+
('LINEBELOW',(0,0), (-1,0), 1, colors.black),
|
| 70 |
+
('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
|
| 71 |
+
('BOX', (0,0), (-1,-1), 1, colors.black),
|
| 72 |
+
('ROWBACKGROUNDS', (0,0), (-1,-1), [colors.lightgrey, colors.white])],
|
| 73 |
+
hAlign = 'LEFT')
|
| 74 |
+
|
| 75 |
+
scatterplot_image = "scatterplot.png" # Provide the correct path to your saved scatterplot image
|
| 76 |
+
|
| 77 |
+
styles = getSampleStyleSheet()
|
| 78 |
+
|
| 79 |
+
story = [
|
| 80 |
+
Image('DAI.png', width=6.4 * inch, height=1.28 * inch),
|
| 81 |
+
Spacer(1, 36),
|
| 82 |
+
Paragraph('MOD_V_AP_Z1_Z2_001A', styles['Heading1']),
|
| 83 |
+
Paragraph('Parâmetros do cálculo', styles['Heading2']),
|
| 84 |
+
Paragraph(f"Ano 2020 - Exercício Fiscal 2021: {ANO_2020}", styles['Normal']),
|
| 85 |
+
Paragraph(f"Ano 2021 - Exercício Fiscal 2022: {ANO_2021}", styles['Normal']),
|
| 86 |
+
Paragraph(f"Ano 2022 - Exercício Fiscal 2023: {ANO_2022}", styles['Normal']),
|
| 87 |
+
Paragraph(f"Ano 2023 - Exercício Fiscal 2024: {ANO_2023}", styles['Normal']),
|
| 88 |
+
Paragraph(f"Ano 2024 - Exercício Fiscal 2025: {ANO_2024}", styles['Normal']),
|
| 89 |
+
Paragraph(f"Ano 2025: {ANO_2025}", styles['Normal']),
|
| 90 |
+
Paragraph(f"Região Homogênea: {RH}", styles['Normal']),
|
| 91 |
+
Paragraph(f"Apartamento de Cobertura: {COB}", styles['Normal']),
|
| 92 |
+
Paragraph(f"Área Privativa: {APRIV}", styles['Normal']),
|
| 93 |
+
Paragraph(f"Relação entre Área Privativa e Área Total: {AP_AT}", styles['Normal']),
|
| 94 |
+
Paragraph(f"Pavimento: {PAVTO}", styles['Normal']),
|
| 95 |
+
Paragraph(f"Padrão Fino: {FINO}", styles['Normal']),
|
| 96 |
+
Paragraph(f"Padrão Luxo: {LUXO}", styles['Normal']),
|
| 97 |
+
Paragraph(f"Idade: {IDADE}", styles['Normal']),
|
| 98 |
+
PageBreak(),
|
| 99 |
+
Image('DAI.png', width=6.4 * inch, height=1.28 * inch),
|
| 100 |
+
Spacer(1, 36),
|
| 101 |
+
Paragraph('Resultados', styles['Heading1']),
|
| 102 |
+
Paragraph('Valor do imóvel (R$/m²)', styles['Heading2']),
|
| 103 |
+
Paragraph(f"R$ {round(pred[0], 2)}", styles['Normal']),
|
| 104 |
+
Paragraph('Limite Inferior do Intervalo de Confiança', styles['Heading2']),
|
| 105 |
+
Paragraph(f"R$ {round(lower_bound, 2)}", styles['Normal']),
|
| 106 |
+
Paragraph('Percentual Limite Inferior do IC', styles['Heading2']),
|
| 107 |
+
Paragraph(f"{round(per_low[0]*100, 2)}%", styles['Normal']),
|
| 108 |
+
Paragraph('Limite Superior do Intervalo de Confiança', styles['Heading2']),
|
| 109 |
+
Paragraph(f"R$ {round(upper_bound, 2)}", styles['Normal']),
|
| 110 |
+
Paragraph('Percentual Limite Superior do IC', styles['Heading2']),
|
| 111 |
+
Paragraph(f"{round(per_up[0]*100, 2)}%", styles['Normal']),
|
| 112 |
+
Paragraph('Gráfico - Previstos X Observados', styles['Heading2']),
|
| 113 |
+
fig2image(scatterplot_image),
|
| 114 |
+
]
|
| 115 |
+
|
| 116 |
+
doc.build(story)
|
| 117 |
+
|
| 118 |
+
|
| 119 |
+
|
| 120 |
+
def execute(ANO_2020, ANO_2021, ANO_2022, ANO_2023, ANO_2024, ANO_2025, RH, COB, APRIV, AP_AT, PAVTO, FINO, LUXO, IDADE):
|
| 121 |
+
df = pd.DataFrame.from_dict({'ANO_2020': int(ANO_2020),
|
| 122 |
+
'ANO_2021': int(ANO_2021),
|
| 123 |
+
'ANO_2022': int(ANO_2022),
|
| 124 |
+
'ANO_2023': int(ANO_2023),
|
| 125 |
+
'ANO_2024': int(ANO_2024),
|
| 126 |
+
'ANO_2025': int(ANO_2025),
|
| 127 |
+
'RH': np.log([RH]),
|
| 128 |
+
'COB': int(COB),
|
| 129 |
+
'APRIV': np.log([APRIV]),
|
| 130 |
+
'AP_AT': float(AP_AT),
|
| 131 |
+
'PAVTO': int(PAVTO),
|
| 132 |
+
'FINO': int(FINO),
|
| 133 |
+
'LUXO': int(LUXO),
|
| 134 |
+
'IDADE': int(IDADE)}
|
| 135 |
+
)
|
| 136 |
+
|
| 137 |
+
|
| 138 |
+
X_with_constant = sm.add_constant(X)
|
| 139 |
+
model = sm.OLS(y, X_with_constant)
|
| 140 |
+
results = model.fit()
|
| 141 |
+
X_new = np.array(df).reshape(1, -1)
|
| 142 |
+
X_new_with_constant = np.insert(X_new, 0, 1)
|
| 143 |
+
y_pred = results.predict(X_new_with_constant)
|
| 144 |
+
ci = results.get_prediction(X_new_with_constant).conf_int(alpha=0.2)
|
| 145 |
+
lower_bound = np.exp(ci[0][0])
|
| 146 |
+
per_low = (np.exp(y_pred)-np.exp(ci[0][0]))/np.exp(y_pred)
|
| 147 |
+
upper_bound = np.exp(ci[0][1])
|
| 148 |
+
per_up = (np.exp(ci[0][1])-np.exp(y_pred))/np.exp(y_pred)
|
| 149 |
+
pred = np.exp(y_pred)
|
| 150 |
+
|
| 151 |
+
X_plot = np.linspace(min(y), max(y), 100)
|
| 152 |
+
Y_plot = X_plot
|
| 153 |
+
X_pred = np.array(X)
|
| 154 |
+
X_pred_cons = np.insert(X_pred, 0, 1, axis=1)
|
| 155 |
+
x_, y_ = pd.Series(np.array(y), name="Observado"), pd.Series(results.predict(X_pred_cons), name="Previsto")
|
| 156 |
+
|
| 157 |
+
plt.figure(figsize=(18, 6))
|
| 158 |
+
sns.scatterplot(x=x_, y=y_)
|
| 159 |
+
plt.xlabel("Observados")
|
| 160 |
+
plt.ylabel("Previstos")
|
| 161 |
+
plt.tight_layout()
|
| 162 |
+
plt.plot(X_plot, Y_plot, color='r')
|
| 163 |
+
plt.savefig("scatterplot.png")
|
| 164 |
+
plt.close()
|
| 165 |
+
|
| 166 |
+
texto_1 = f"R$ {round(pred[0], 2)}"
|
| 167 |
+
texto_2 = f"R$ {round(lower_bound, 2)}"
|
| 168 |
+
texto_3 = f"{round(per_low[0]*100, 2)}%"
|
| 169 |
+
texto_4 = f"R$ {round(upper_bound, 2)}"
|
| 170 |
+
texto_5 = f"{round(per_up[0]*100, 2)}%"
|
| 171 |
+
get_report(ANO_2020, ANO_2021, ANO_2022, ANO_2023, ANO_2024, ANO_2025, RH, COB, APRIV, AP_AT, PAVTO, FINO, LUXO, IDADE, pred, lower_bound, per_low, upper_bound, per_up, "scatterplot.png")
|
| 172 |
+
return texto_1, texto_2, texto_3, texto_4, texto_5, "scatterplot.png", 'report.pdf'
|
| 173 |
+
|
| 174 |
+
|
| 175 |
+
|
| 176 |
+
|
| 177 |
+
def load_inputs():
|
| 178 |
+
APRIV = gr.inputs.Number(default = 80., label='Área Privativa')
|
| 179 |
+
RH = gr.inputs.Number(default = 250, label='Região Homogênea')
|
| 180 |
+
PAVTO = gr.inputs.Number(default = 5, label='Pavimento')
|
| 181 |
+
COB = gr.inputs.Checkbox(default=False, label='É apartamento de cobertura?')
|
| 182 |
+
IDADE = gr.inputs.Number(default = 5, label='Idade')
|
| 183 |
+
AP_AT = gr.inputs.Number(default = .7, label='Razão entre Área privativa e Área total')
|
| 184 |
+
FINO = gr.inputs.Checkbox(default=False, label='Padrão Fino')
|
| 185 |
+
LUXO = gr.inputs.Checkbox(default=True, label='Padrão Luxo')
|
| 186 |
+
ANO_2020 = gr.inputs.Checkbox(default=False, label='Ano 2020 - Carga Geral 2021')
|
| 187 |
+
ANO_2021 = gr.inputs.Checkbox(default=False, label='Ano 2021 - Carga Geral 2022')
|
| 188 |
+
ANO_2022 = gr.inputs.Checkbox(default=False, label='Ano 2022 - Carga Geral 2023')
|
| 189 |
+
ANO_2023 = gr.inputs.Checkbox(default=False, label='Ano 2023 - Carga Geral 2024')
|
| 190 |
+
ANO_2024 = gr.inputs.Checkbox(default=True, label='Ano 2024 - Carga Geral 2025')
|
| 191 |
+
ANO_2025 = gr.inputs.Checkbox(default=False, label='Ano 2025')
|
| 192 |
+
return [ANO_2020, ANO_2021, ANO_2022, ANO_2023, ANO_2024, ANO_2025, RH, COB, APRIV, AP_AT, PAVTO, FINO, LUXO, IDADE]
|
| 193 |
+
|
| 194 |
+
title = 'MOD_V_AP_Z1_Z2_001A (Apartamentos)'
|
| 195 |
+
|
| 196 |
+
|
| 197 |
+
description = f"""
|
| 198 |
+
# <p style="text-align: center;">MOD_V_AP_Z1_Z2_001A</p>
|
| 199 |
+
<p style="text-align: center;">1724 dados de 2019 a 2025</p>
|
| 200 |
+
<hr style="color: #333; background-color: #333; height: 1px; border: none;">
|
| 201 |
+
<p style="text-align: center;"> <b>RH</b> | Menor: 73 - Maior: 380 </p>
|
| 202 |
+
<p style="text-align: center;"> <b>Área Privativa</b> | Menor: 60.17 - Maior: 547.92 </p>
|
| 203 |
+
<p style="text-align: center;"> <b>Razão entre Área privativa e Área total</b> | Menor: 0.41 - Maior: 0.92 </p>
|
| 204 |
+
<p style="text-align: center;"> <b>Pavimento</b> | Menor: 1 - Maior: 20 </p>
|
| 205 |
+
<p style="text-align: center;"> <b>Idade</b> | Menor: 1 - Maior: 68 </p>
|
| 206 |
+
<hr style="color: #333; background-color: #333; height: 1px; border: none;">
|
| 207 |
+
<p style="text-align: center;"> <b>BAIRROS:</b> Auxiliadora, Bela Vista, Boa Vista, Higienópolis, Mont Serrat e Passo da Areia.</p>
|
| 208 |
+
<hr style="color: #333; background-color: #333; height: 1px; border: none;">
|
| 209 |
+
<p style="text-align: center;"> <b>Observações:</b> </p>
|
| 210 |
+
<p style="text-align: center;"> <b>1)</b> Para o Ano 2019 - Exercício Fiscal 2020, deixar todas as caixas de Ano desmarcadas. </p>
|
| 211 |
+
<p style="text-align: center;"> <b>2)</b> Para o Padrão Médio, deixar Padrão Fino e Luxo desmarcados. </p>
|
| 212 |
+
"""
|
MOD_V_SALA_Z1_002C.py
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import openpyxl
|
| 2 |
+
import gradio as gr
|
| 3 |
+
import joblib
|
| 4 |
+
import pandas as pd
|
| 5 |
+
import numpy as np
|
| 6 |
+
import seaborn as sns
|
| 7 |
+
from sklearn.preprocessing import MinMaxScaler
|
| 8 |
+
import statsmodels.api as sm
|
| 9 |
+
import matplotlib.pyplot as plt
|
| 10 |
+
|
| 11 |
+
df = pd.read_excel('dados/MOD_V_SALA_Z1_002C/BD_MOD_V_SALA_Z1_002C.xlsx', 'LAUDO')
|
| 12 |
+
|
| 13 |
+
df1 = df.iloc[:, 3:]
|
| 14 |
+
df1 = df1.drop(['VTOTAL'], axis=1)
|
| 15 |
+
df1[['RH', 'APRIV', 'VUNIT']] = np.log(df1[['RH', 'APRIV', 'VUNIT']])
|
| 16 |
+
|
| 17 |
+
# Separar as variáveis independentes (X) e dependente (y)
|
| 18 |
+
X = df1.drop(['VUNIT'], axis=1)
|
| 19 |
+
y = df1['VUNIT']
|
| 20 |
+
|
| 21 |
+
def execute(ANO_2020, ANO_2021, AP2022, RH, PAVTO, IDmenor10, ID10a20, ID20a30, ID30a40, FIN, LUX, APRIV):
|
| 22 |
+
df = pd.DataFrame.from_dict({'ANO_2020': int(ANO_2020),
|
| 23 |
+
'ANO_2021': int(ANO_2021),
|
| 24 |
+
'AP2022': int(AP2022),
|
| 25 |
+
'RH': np.log([RH]),
|
| 26 |
+
'PAVTO': [PAVTO],
|
| 27 |
+
'IDmenor10': int(IDmenor10),
|
| 28 |
+
'ID10a20': int(ID10a20),
|
| 29 |
+
'ID20a30': int(ID20a30),
|
| 30 |
+
'ID30a40': int(ID30a40),
|
| 31 |
+
'FIN': int(FIN),
|
| 32 |
+
'LUX': int(LUX),
|
| 33 |
+
'APRIV': np.log([APRIV])}
|
| 34 |
+
)
|
| 35 |
+
|
| 36 |
+
|
| 37 |
+
X_with_constant = sm.add_constant(X)
|
| 38 |
+
model = sm.OLS(y, X_with_constant)
|
| 39 |
+
results = model.fit()
|
| 40 |
+
X_new = np.array(df).reshape(1, -1)
|
| 41 |
+
X_new_with_constant = np.insert(X_new, 0, 1)
|
| 42 |
+
y_pred = results.predict(X_new_with_constant)
|
| 43 |
+
ci = results.get_prediction(X_new_with_constant).conf_int(alpha=0.2)
|
| 44 |
+
lower_bound = np.exp(ci[0][0])
|
| 45 |
+
per_low = (np.exp(y_pred)-np.exp(ci[0][0]))/np.exp(y_pred)
|
| 46 |
+
upper_bound = np.exp(ci[0][1])
|
| 47 |
+
per_up = (np.exp(ci[0][1])-np.exp(y_pred))/np.exp(y_pred)
|
| 48 |
+
pred = np.exp(y_pred)
|
| 49 |
+
|
| 50 |
+
X_plot = np.linspace(min(df1['VUNIT']), max(df1['VUNIT']), 100)
|
| 51 |
+
Y_plot = X_plot
|
| 52 |
+
X_pred = np.array(X)
|
| 53 |
+
X_pred_cons = np.insert(X_pred, 0, 1, axis=1)
|
| 54 |
+
x_, y_ = pd.Series(np.array(df1['VUNIT']), name="Observado"), pd.Series(results.predict(X_pred_cons), name="Previsto")
|
| 55 |
+
|
| 56 |
+
plt.figure(figsize=(18, 6))
|
| 57 |
+
sns.scatterplot(x=x_, y=y_)
|
| 58 |
+
plt.xlabel("Observados")
|
| 59 |
+
plt.ylabel("Previstos")
|
| 60 |
+
plt.tight_layout()
|
| 61 |
+
plt.plot(X_plot, Y_plot, color='r')
|
| 62 |
+
plt.savefig("scatterplot.png")
|
| 63 |
+
plt.close()
|
| 64 |
+
|
| 65 |
+
|
| 66 |
+
texto_1 = f"R$ {round(pred[0], 2)}"
|
| 67 |
+
texto_2 = f"R$ {round(lower_bound, 2)}"
|
| 68 |
+
texto_3 = f"{round(per_low[0]*100, 2)}%"
|
| 69 |
+
texto_4 = f"R$ {round(upper_bound, 2)}"
|
| 70 |
+
texto_5 = f"{round(per_up[0]*100, 2)}%"
|
| 71 |
+
return texto_1, texto_2, texto_3, texto_4, texto_5, "scatterplot.png"
|
| 72 |
+
|
| 73 |
+
def load_inputs():
|
| 74 |
+
APRIV = gr.inputs.Number(default = 35., label='Área Privativa')
|
| 75 |
+
RH = gr.inputs.Number(default = 250, label='Região Homogênea')
|
| 76 |
+
PAVTO = gr.inputs.Number(default = 5, label='Pavimento')
|
| 77 |
+
IDmenor10 = gr.inputs.Checkbox(default=True, label='Idade menor que 10 anos')
|
| 78 |
+
ID10a20 = gr.inputs.Checkbox(default=False, label='Idade entre 10 anos e 20 anos')
|
| 79 |
+
ID20a30 = gr.inputs.Checkbox(default=False, label='Idade entre 20 anos e 30 anos')
|
| 80 |
+
ID30a40 = gr.inputs.Checkbox(default=False, label='Idade entre 30 anos e 40 anos')
|
| 81 |
+
FIN = gr.inputs.Checkbox(default=False, label='Padrão Fino')
|
| 82 |
+
LUX = gr.inputs.Checkbox(default=True, label='Padrão Luxo')
|
| 83 |
+
ANO_2020 = gr.inputs.Checkbox(default=False, label='Ano 2020 - Carga Geral 2021')
|
| 84 |
+
ANO_2021 = gr.inputs.Checkbox(default=False, label='Ano 2021 - Carga Geral 2022')
|
| 85 |
+
AP2022 = gr.inputs.Checkbox(default=True, label='A partir do Ano 2022 - Carga Geral 2023')
|
| 86 |
+
return [ANO_2020, ANO_2021, AP2022, RH, PAVTO, IDmenor10, ID10a20, ID20a30, ID30a40, FIN, LUX, APRIV]
|
| 87 |
+
|
| 88 |
+
title = 'MOD_V_SALA_Z1_002C (Salas Comerciais)'
|
| 89 |
+
|
| 90 |
+
#description = "656 dados de 2019 a 2023 | Para informações do modelo, você pode baixar <a href='https://git-colocation.procempa.com.br/calculadora/calc-venda-salas-comerciais/-/raw/main/dados/MOD_V_SALA_Z1_002C/MOD_V_SALA_Z1_002C.pdf' download='MOD_V_SALA_Z1_002C.pdf'>aqui</a>."
|
| 91 |
+
|
| 92 |
+
description = "656 dados de 2019 a 2023 | Para informações do modelo, você pode baixar <a href='https://raw.githubusercontent.com/fschwartzer/DAI/main/MOD_V_SALA_Z1_002C-2.pdf' download='MOD_V_SALA_Z1_002C-2.pdf'>aqui</a>."
|
| 93 |
+
|
MOD_V_SALA_Z1_002D_A.py
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import openpyxl
|
| 2 |
+
import gradio as gr
|
| 3 |
+
import joblib
|
| 4 |
+
import pandas as pd
|
| 5 |
+
import numpy as np
|
| 6 |
+
import seaborn as sns
|
| 7 |
+
from sklearn.preprocessing import MinMaxScaler
|
| 8 |
+
import statsmodels.api as sm
|
| 9 |
+
import matplotlib.pyplot as plt
|
| 10 |
+
|
| 11 |
+
df_model = pd.read_excel('dados/MOD_V_SALA_Z1_002D_A/MOD_V_SALA_Z1_002D_A.xlsx')
|
| 12 |
+
|
| 13 |
+
df_model[['RH', 'APRIV', 'VUNIT']] = np.log(df_model[['RH', 'APRIV', 'VUNIT']])
|
| 14 |
+
|
| 15 |
+
# Separar as variáveis independentes (X) e dependente (y)
|
| 16 |
+
X = df_model.drop(['VUNIT'], axis=1)
|
| 17 |
+
y = df_model['VUNIT']
|
| 18 |
+
|
| 19 |
+
def execute(ANO_2020, ANO_2021, ANO_2022, AP2023, RH, PAVTO, IDmenor10, ID11a20, ID21a30, ID31a40, FIN, LUX, APRIV):
|
| 20 |
+
df = pd.DataFrame.from_dict({'ANO_2020': int(ANO_2020),
|
| 21 |
+
'ANO_2021': int(ANO_2021),
|
| 22 |
+
'ANO_2022': int(ANO_2022),
|
| 23 |
+
'AP2023': int(AP2023),
|
| 24 |
+
'RH': np.log([RH]),
|
| 25 |
+
'PAVTO': [PAVTO],
|
| 26 |
+
'IDmenor10': int(IDmenor10),
|
| 27 |
+
'ID11a20': int(ID11a20),
|
| 28 |
+
'ID21a30': int(ID21a30),
|
| 29 |
+
'ID31a40': int(ID31a40),
|
| 30 |
+
'FIN': int(FIN),
|
| 31 |
+
'LUX': int(LUX),
|
| 32 |
+
'APRIV': np.log([APRIV])}
|
| 33 |
+
)
|
| 34 |
+
|
| 35 |
+
|
| 36 |
+
X_with_constant = sm.add_constant(X)
|
| 37 |
+
model = sm.OLS(y, X_with_constant)
|
| 38 |
+
results = model.fit()
|
| 39 |
+
X_new = np.array(df).reshape(1, -1)
|
| 40 |
+
X_new_with_constant = np.insert(X_new, 0, 1)
|
| 41 |
+
y_pred = results.predict(X_new_with_constant)
|
| 42 |
+
ci = results.get_prediction(X_new_with_constant).conf_int(alpha=0.2)
|
| 43 |
+
lower_bound = np.exp(ci[0][0])
|
| 44 |
+
per_low = (np.exp(y_pred)-np.exp(ci[0][0]))/np.exp(y_pred)
|
| 45 |
+
upper_bound = np.exp(ci[0][1])
|
| 46 |
+
per_up = (np.exp(ci[0][1])-np.exp(y_pred))/np.exp(y_pred)
|
| 47 |
+
pred = np.exp(y_pred)
|
| 48 |
+
|
| 49 |
+
X_plot = np.linspace(min(df_model['VUNIT']), max(df_model['VUNIT']), 100)
|
| 50 |
+
Y_plot = X_plot
|
| 51 |
+
X_pred = np.array(X)
|
| 52 |
+
X_pred_cons = np.insert(X_pred, 0, 1, axis=1)
|
| 53 |
+
x_, y_ = pd.Series(np.array(df_model['VUNIT']), name="Observado"), pd.Series(results.predict(X_pred_cons), name="Previsto")
|
| 54 |
+
|
| 55 |
+
plt.figure(figsize=(18, 6))
|
| 56 |
+
sns.scatterplot(x=x_, y=y_)
|
| 57 |
+
plt.xlabel("Observados")
|
| 58 |
+
plt.ylabel("Previstos")
|
| 59 |
+
plt.tight_layout()
|
| 60 |
+
plt.plot(X_plot, Y_plot, color='r')
|
| 61 |
+
plt.savefig("scatterplot.png")
|
| 62 |
+
plt.close()
|
| 63 |
+
|
| 64 |
+
|
| 65 |
+
texto_1 = f"R$ {round(pred[0], 2)}"
|
| 66 |
+
texto_2 = f"R$ {round(lower_bound, 2)}"
|
| 67 |
+
texto_3 = f"{round(per_low[0]*100, 2)}%"
|
| 68 |
+
texto_4 = f"R$ {round(upper_bound, 2)}"
|
| 69 |
+
texto_5 = f"{round(per_up[0]*100, 2)}%"
|
| 70 |
+
return texto_1, texto_2, texto_3, texto_4, texto_5, "scatterplot.png"
|
| 71 |
+
|
| 72 |
+
def load_inputs():
|
| 73 |
+
APRIV = gr.Number(value = 35., label='Área Privativa')
|
| 74 |
+
RH = gr.Number(value = 250, label='Região Homogênea')
|
| 75 |
+
PAVTO = gr.Number(value = 5, label='Pavimento')
|
| 76 |
+
IDmenor10 = gr.Checkbox(value=True, label='Idade menor que 10 anos')
|
| 77 |
+
ID11a20 = gr.Checkbox(value=False, label='Idade entre 11 anos e 20 anos')
|
| 78 |
+
ID21a30 = gr.Checkbox(value=False, label='Idade entre 21 anos e 30 anos')
|
| 79 |
+
ID31a40 = gr.Checkbox(value=False, label='Idade entre 31 anos e 40 anos')
|
| 80 |
+
FIN = gr.Checkbox(value=False, label='Padrão Fino')
|
| 81 |
+
LUX = gr.Checkbox(value=True, label='Padrão Luxo')
|
| 82 |
+
ANO_2020 = gr.Checkbox(value=False, label='Ano 2020 - Carga Geral 2021')
|
| 83 |
+
ANO_2021 = gr.Checkbox(value=False, label='Ano 2021 - Carga Geral 2022')
|
| 84 |
+
ANO_2022 = gr.Checkbox(value=False, label='Ano 2022 - Carga Geral 2023')
|
| 85 |
+
AP2023 = gr.Checkbox(value=True, label='A partir do Ano 2023 - Carga Geral 2024')
|
| 86 |
+
return [ANO_2020, ANO_2021, ANO_2022, AP2023, RH, PAVTO, IDmenor10, ID11a20, ID21a30, ID31a40, FIN, LUX, APRIV]
|
| 87 |
+
|
| 88 |
+
title = 'MOD_V_SALA_Z1_002D_A (Salas Comerciais)'
|
| 89 |
+
|
| 90 |
+
description = f"""
|
| 91 |
+
# <p style="text-align: center;">MOD_V_SALA_Z1_002D_A</p>
|
| 92 |
+
<p style="text-align: center;">755 dados de 2019 a 2023 | Para informações do modelo, você pode baixar <a href='https://raw.githubusercontent.com/fschwartzer/DAI/main/MOD_V_SALA_Z1_002D_A.docx' download='MOD_V_SALA_Z1_002D_A.docx'>aqui</a></p>
|
| 93 |
+
<hr style="color: #333; background-color: #333; height: 1px; border: none;">
|
| 94 |
+
<p style="text-align: center;"> <b>RH</b> | Menor: 120 - Maior: 380 </p>
|
| 95 |
+
<p style="text-align: center;"> <b>Área Privativa</b> | Menor: 15.86 - Maior: 428.79 </p>
|
| 96 |
+
<p style="text-align: center;"> <b>Pavimento</b> | Menor: 1 - Maior: 24 </p>
|
| 97 |
+
<p style="text-align: center;"> <b>Idade</b> | Menor: 4 - Maior: 73 </p>
|
| 98 |
+
<hr style="color: #333; background-color: #333; height: 1px; border: none;">
|
| 99 |
+
<p style="text-align: center;"> <b>BAIRROS:</b> Auxiliadora, Bomfim, Centro Histórico, Cidade Baixa, Floresta, Higienópolis, Independência, Menino Deus, Moinhos de Vento, Mont Serrat, Petrópolis, Praia de Belas, Rio Branco e São João.</p>
|
| 100 |
+
<hr style="color: #333; background-color: #333; height: 1px; border: none;">
|
| 101 |
+
<p style="text-align: center;"> <b>Observações:</b> </p>
|
| 102 |
+
<p style="text-align: center;"> <b>1)</b> Para o Padrão Médio, deixar Padrão Fino e Luxo desmarcados. </p>
|
| 103 |
+
"""
|
MOD_V_SALA_Z1_002E.py
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import openpyxl
|
| 2 |
+
import gradio as gr
|
| 3 |
+
import joblib
|
| 4 |
+
import pandas as pd
|
| 5 |
+
import numpy as np
|
| 6 |
+
import seaborn as sns
|
| 7 |
+
from sklearn.preprocessing import MinMaxScaler
|
| 8 |
+
import statsmodels.api as sm
|
| 9 |
+
import matplotlib.pyplot as plt
|
| 10 |
+
|
| 11 |
+
df_model = pd.read_excel('dados/MOD_V_SALA_Z1_002E/MOD_V_SALA_Z1_002E.xlsx')
|
| 12 |
+
|
| 13 |
+
df_model[['RH', 'APRIV', 'VUNIT']] = np.log(df_model[['RH', 'APRIV', 'VUNIT']])
|
| 14 |
+
|
| 15 |
+
# Separar as variáveis independentes (X) e dependente (y)
|
| 16 |
+
X = df_model.drop(['VUNIT'], axis=1)
|
| 17 |
+
y = df_model['VUNIT']
|
| 18 |
+
|
| 19 |
+
def execute(ANO_2020, ANO_2021, ANO_2022, ANO_2023, ANO_2024, ANO_2025, RH, PAVTO, IDmenor10, ID11a20, ID21a30, ID31a40, FIN, LUX, APRIV):
|
| 20 |
+
df = pd.DataFrame.from_dict({'ANO_2020': int(ANO_2020),
|
| 21 |
+
'ANO_2021': int(ANO_2021),
|
| 22 |
+
'ANO_2022': int(ANO_2022),
|
| 23 |
+
'ANO_2023': int(ANO_2023),
|
| 24 |
+
'ANO_2024': int(ANO_2024),
|
| 25 |
+
'ANO_2025': int(ANO_2025),
|
| 26 |
+
'RH': np.log([RH]),
|
| 27 |
+
'PAVTO': [PAVTO],
|
| 28 |
+
'IDmenor10': int(IDmenor10),
|
| 29 |
+
'ID11a20': int(ID11a20),
|
| 30 |
+
'ID21a30': int(ID21a30),
|
| 31 |
+
'ID31a40': int(ID31a40),
|
| 32 |
+
'FIN': int(FIN),
|
| 33 |
+
'LUX': int(LUX),
|
| 34 |
+
'APRIV': np.log([APRIV])}
|
| 35 |
+
)
|
| 36 |
+
|
| 37 |
+
|
| 38 |
+
X_with_constant = sm.add_constant(X)
|
| 39 |
+
model = sm.OLS(y, X_with_constant)
|
| 40 |
+
results = model.fit()
|
| 41 |
+
X_new = np.array(df).reshape(1, -1)
|
| 42 |
+
X_new_with_constant = np.insert(X_new, 0, 1)
|
| 43 |
+
y_pred = results.predict(X_new_with_constant)
|
| 44 |
+
ci = results.get_prediction(X_new_with_constant).conf_int(alpha=0.2)
|
| 45 |
+
lower_bound = np.exp(ci[0][0])
|
| 46 |
+
per_low = (np.exp(y_pred)-np.exp(ci[0][0]))/np.exp(y_pred)
|
| 47 |
+
upper_bound = np.exp(ci[0][1])
|
| 48 |
+
per_up = (np.exp(ci[0][1])-np.exp(y_pred))/np.exp(y_pred)
|
| 49 |
+
pred = np.exp(y_pred)
|
| 50 |
+
|
| 51 |
+
X_plot = np.linspace(min(df_model['VUNIT']), max(df_model['VUNIT']), 100)
|
| 52 |
+
Y_plot = X_plot
|
| 53 |
+
X_pred = np.array(X)
|
| 54 |
+
X_pred_cons = np.insert(X_pred, 0, 1, axis=1)
|
| 55 |
+
x_, y_ = pd.Series(np.array(df_model['VUNIT']), name="Observado"), pd.Series(results.predict(X_pred_cons), name="Previsto")
|
| 56 |
+
|
| 57 |
+
plt.figure(figsize=(18, 6))
|
| 58 |
+
sns.scatterplot(x=x_, y=y_)
|
| 59 |
+
plt.xlabel("Observados")
|
| 60 |
+
plt.ylabel("Previstos")
|
| 61 |
+
plt.tight_layout()
|
| 62 |
+
plt.plot(X_plot, Y_plot, color='r')
|
| 63 |
+
plt.savefig("scatterplot.png")
|
| 64 |
+
plt.close()
|
| 65 |
+
|
| 66 |
+
|
| 67 |
+
texto_1 = f"R$ {round(pred[0], 2)}"
|
| 68 |
+
texto_2 = f"R$ {round(lower_bound, 2)}"
|
| 69 |
+
texto_3 = f"{round(per_low[0]*100, 2)}%"
|
| 70 |
+
texto_4 = f"R$ {round(upper_bound, 2)}"
|
| 71 |
+
texto_5 = f"{round(per_up[0]*100, 2)}%"
|
| 72 |
+
return texto_1, texto_2, texto_3, texto_4, texto_5, "scatterplot.png"
|
| 73 |
+
|
| 74 |
+
def load_inputs():
|
| 75 |
+
APRIV = gr.Number(value = 35., label='Área Privativa')
|
| 76 |
+
RH = gr.Number(value = 250, label='Região Homogênea')
|
| 77 |
+
PAVTO = gr.Number(value = 5, label='Pavimento')
|
| 78 |
+
IDmenor10 = gr.Checkbox(value=True, label='Idade menor ou igual a 10 anos')
|
| 79 |
+
ID11a20 = gr.Checkbox(value=False, label='Idade entre 11 anos e 20 anos')
|
| 80 |
+
ID21a30 = gr.Checkbox(value=False, label='Idade entre 21 anos e 30 anos')
|
| 81 |
+
ID31a40 = gr.Checkbox(value=False, label='Idade entre 31 anos e 40 anos')
|
| 82 |
+
FIN = gr.Checkbox(value=False, label='Padrão Fino')
|
| 83 |
+
LUX = gr.Checkbox(value=True, label='Padrão Luxo')
|
| 84 |
+
ANO_2020 = gr.Checkbox(value=False, label='Ano 2020 - Carga Geral 2021')
|
| 85 |
+
ANO_2021 = gr.Checkbox(value=False, label='Ano 2021 - Carga Geral 2022')
|
| 86 |
+
ANO_2022 = gr.Checkbox(value=False, label='Ano 2022 - Carga Geral 2023')
|
| 87 |
+
ANO_2023 = gr.Checkbox(value=False, label='Ano 2023 - Carga Geral 2024')
|
| 88 |
+
ANO_2024 = gr.Checkbox(value=True, label='Ano 2024 - Carga Geral 2025')
|
| 89 |
+
ANO_2025 = gr.Checkbox(value=False, label='Ano 2025')
|
| 90 |
+
|
| 91 |
+
return [ANO_2020, ANO_2021, ANO_2022, ANO_2023, ANO_2024, ANO_2025, RH, PAVTO, IDmenor10, ID11a20, ID21a30, ID31a40, FIN, LUX, APRIV]
|
| 92 |
+
|
| 93 |
+
title = 'MOD_V_SALA_Z1_002E (Salas Comerciais)'
|
| 94 |
+
|
| 95 |
+
description = f"""
|
| 96 |
+
# <p style="text-align: center;">MOD_V_SALA_Z1_002E</p>
|
| 97 |
+
<p style="text-align: center;">949 dados de 2019 a 2025</p>
|
| 98 |
+
<hr style="color: #333; background-color: #333; height: 1px; border: none;">
|
| 99 |
+
<p style="text-align: center;"> <b>RH</b> | Menor: 120 - Maior: 380 </p>
|
| 100 |
+
<p style="text-align: center;"> <b>Área Privativa</b> | Menor: 15.86 - Maior: 381.84 </p>
|
| 101 |
+
<p style="text-align: center;"> <b>Pavimento</b> | Menor: 1 - Maior: 24 </p>
|
| 102 |
+
<p style="text-align: center;"> <b>Idade</b> | Menor: 0 - Maior: 73 </p>
|
| 103 |
+
<hr style="color: #333; background-color: #333; height: 1px; border: none;">
|
| 104 |
+
<p style="text-align: center;"> <b>BAIRROS:</b> Auxiliadora, Bomfim, Centro Histórico, Cidade Baixa, Floresta, Higienópolis, Independência, Menino Deus, Moinhos de Vento, Mont Serrat, Petrópolis, Praia de Belas, Rio Branco e São João.</p>
|
| 105 |
+
<hr style="color: #333; background-color: #333; height: 1px; border: none;">
|
| 106 |
+
<p style="text-align: center;"> <b>Observações:</b> </p>
|
| 107 |
+
<p style="text-align: center;"> <b>1)</b> Para o Padrão Médio, deixar Padrão Fino e Luxo desmarcados. </p>
|
| 108 |
+
"""
|
apartamentos.py
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
import pandas as pd
|
| 3 |
+
import numpy as np
|
| 4 |
+
import xgboost as xgb
|
| 5 |
+
import joblib
|
| 6 |
+
from sklearn.preprocessing import MinMaxScaler
|
| 7 |
+
|
| 8 |
+
def execute(FONTE, IDADE, RH, ANDAR, X, Y, ATOTAL, ANO_2019, ANO_2020 , ANO_2021, ANO_2022):
|
| 9 |
+
df = pd.DataFrame.from_dict({'FONTE': [FONTE],
|
| 10 |
+
'IDADE': [IDADE],
|
| 11 |
+
'RH': np.log([RH]),
|
| 12 |
+
'ANDAR': [ANDAR],
|
| 13 |
+
'X': [X],
|
| 14 |
+
'Y': [Y],
|
| 15 |
+
'ATOTAL': np.log([ATOTAL]),
|
| 16 |
+
'ANO_2019': [ANO_2019],
|
| 17 |
+
'ANO_2020': [ANO_2020],
|
| 18 |
+
'ANO_2021': [ANO_2021],
|
| 19 |
+
'ANO_2022': [ANO_2022]
|
| 20 |
+
})
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
|
| 24 |
+
input_scaler = joblib.load("dados/apartamentos/input_scaler_ape_DEZ2022.save")
|
| 25 |
+
df = input_scaler.transform(df)
|
| 26 |
+
cols = ['FONTE', 'IDADE', 'RH', 'ANDAR', 'X', 'Y', 'ATOTAL', 'ANO_2019', 'ANO_2020', 'ANO_2021', 'ANO_2022']
|
| 27 |
+
aval = pd.DataFrame(df, columns = cols)
|
| 28 |
+
df = xgb.DMatrix(aval)
|
| 29 |
+
loaded_model = xgb.Booster()
|
| 30 |
+
loaded_model.load_model("dados/apartamentos/APARTAMENTO_2020_2021_2022_2023.model")
|
| 31 |
+
pred = loaded_model.predict(df)
|
| 32 |
+
output_scaler = joblib.load("dados/apartamentos/output_scaler_ape_DEZ2022.save")
|
| 33 |
+
pred = output_scaler.inverse_transform(np.array(pred).reshape(-1,1))
|
| 34 |
+
pred = np.exp(pred).tolist()
|
| 35 |
+
return f"""Valor do imóvel: R${round(pred[0][0]* ATOTAL, -2)}"""
|
| 36 |
+
|
| 37 |
+
|
| 38 |
+
|
| 39 |
+
def load_inputs():
|
| 40 |
+
FONTE = gr.inputs.Number(default = 0, label='Fonte: 0 - Transação | 1 - Oferta')
|
| 41 |
+
IDADE = gr.inputs.Number(default = 1, label='Idade do imóvel (Ano Base: 2022)')
|
| 42 |
+
RH = gr.inputs.Number(default = 45, label='Região Homogênea')
|
| 43 |
+
ANDAR = gr.inputs.Number(default = 1, label='Andar, conforme Cadastro Imobiliário')
|
| 44 |
+
X = gr.inputs.Number(default = 282122, label='Longitude (SIRGAS 2000)')
|
| 45 |
+
Y = gr.inputs.Number(default = 1672718, label='Latitude (SIRGAS 2000)')
|
| 46 |
+
ATOTAL = gr.inputs.Number(default = 60., label='Área Total')
|
| 47 |
+
ANO_2019 = gr.inputs.Number(default = 0, label='Ano 2019')
|
| 48 |
+
ANO_2020 = gr.inputs.Number(default = 0, label='Ano 2020')
|
| 49 |
+
ANO_2021 = gr.inputs.Number(default = 0, label='Ano 2021')
|
| 50 |
+
ANO_2022 = gr.inputs.Number(default = 1, label='Ano 2022')
|
| 51 |
+
return [FONTE, IDADE, RH, ANDAR, X, Y, ATOTAL, ANO_2019, ANO_2020 , ANO_2021, ANO_2022]
|
| 52 |
+
|
| 53 |
+
output_label = "Valor do imóvel (R$)"
|
| 54 |
+
|
| 55 |
+
title = 'Venda - Apartamentos'
|
| 56 |
+
|
| 57 |
+
description = '27.132 dados de Janeiro de 2019 a Dezembro de 2022'
|
app.py
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import numpy as np
|
| 2 |
+
import gradio as gr
|
| 3 |
+
import MOD_V_AP_Z1_Z2_001A
|
| 4 |
+
import MOD_V_AP_Z1_Z2_001
|
| 5 |
+
#import MOD_V_SALA_Z1_002C
|
| 6 |
+
#import apartamentos
|
| 7 |
+
#import salas
|
| 8 |
+
import salas_2025
|
| 9 |
+
import salas_2024
|
| 10 |
+
import aptos_2025
|
| 11 |
+
import aptos_2024
|
| 12 |
+
import MOD_V_SALA_Z1_002D_A
|
| 13 |
+
import MOD_V_SALA_Z1_002E
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
bloco = gr.Blocks(theme=gr.themes.Monochrome())
|
| 17 |
+
|
| 18 |
+
with bloco:
|
| 19 |
+
with gr.Tabs():
|
| 20 |
+
with gr.TabItem(MOD_V_SALA_Z1_002E.title):
|
| 21 |
+
gr.Markdown(MOD_V_SALA_Z1_002E.description)
|
| 22 |
+
inputs = MOD_V_SALA_Z1_002E.load_inputs()
|
| 23 |
+
text_button = gr.Button("Calcular")
|
| 24 |
+
outputs = [gr.TextArea(lines=1, label="Valor do imóvel (R$/m²)"), gr.TextArea(lines=1, label="Limite Inferior do Intervalo de Confiança"), gr.TextArea(lines=1, label="Percentual Limite Inferior do IC"), gr.TextArea(lines=1, label="Limite Superior do Intervalo de Confiança"), gr.TextArea(lines=1, label="Percentual Limite Superior do IC"), gr.Image(label="Gráfico")]
|
| 25 |
+
text_button.click(MOD_V_SALA_Z1_002E.execute, inputs=inputs, outputs=outputs)
|
| 26 |
+
with gr.TabItem(MOD_V_SALA_Z1_002D_A.title):
|
| 27 |
+
gr.Markdown(MOD_V_SALA_Z1_002D_A.description)
|
| 28 |
+
inputs = MOD_V_SALA_Z1_002D_A.load_inputs()
|
| 29 |
+
text_button = gr.Button("Calcular")
|
| 30 |
+
outputs = [gr.TextArea(lines=1, label="Valor do imóvel (R$/m²)"), gr.TextArea(lines=1, label="Limite Inferior do Intervalo de Confiança"), gr.TextArea(lines=1, label="Percentual Limite Inferior do IC"), gr.TextArea(lines=1, label="Limite Superior do Intervalo de Confiança"), gr.TextArea(lines=1, label="Percentual Limite Superior do IC"), gr.Image(label="Gráfico")]
|
| 31 |
+
text_button.click(MOD_V_SALA_Z1_002D_A.execute, inputs=inputs, outputs=outputs)
|
| 32 |
+
with gr.TabItem(salas_2025.title):
|
| 33 |
+
gr.Markdown(salas_2025.description)
|
| 34 |
+
inputs = salas_2025.load_inputs()
|
| 35 |
+
text_button = gr.Button("Calcular")
|
| 36 |
+
outputs = [gr.TextArea(lines=1, label="Valor do imóvel (R$/m²)"), gr.components.File(label="Download Relatório em PDF")]
|
| 37 |
+
text_button.click(salas_2025.execute, inputs=inputs, outputs=outputs)
|
| 38 |
+
with gr.TabItem(salas_2024.title):
|
| 39 |
+
gr.Markdown(salas_2024.description)
|
| 40 |
+
inputs = salas_2024.load_inputs()
|
| 41 |
+
text_button = gr.Button("Calcular")
|
| 42 |
+
outputs = [gr.TextArea(lines=1, label="Valor do imóvel (R$/m²)"), gr.components.File(label="Download Relatório em PDF")]
|
| 43 |
+
text_button.click(salas_2024.execute, inputs=inputs, outputs=outputs)
|
| 44 |
+
#with gr.TabItem(MOD_V_SALA_Z1_002C.title):
|
| 45 |
+
#gr.Markdown(MOD_V_SALA_Z1_002C.description)
|
| 46 |
+
#inputs = MOD_V_SALA_Z1_002C.load_inputs()
|
| 47 |
+
#text_button = gr.Button("Calcular")
|
| 48 |
+
#outputs = [gr.TextArea(lines=1, label="Valor do imóvel (R$/m²)"), gr.TextArea(lines=1, label="Limite Inferior do Intervalo de Confiança"), gr.TextArea(lines=1, label="Percentual Limite Inferior do IC"), gr.TextArea(lines=1, label="Limite Superior do Intervalo de Confiança"), gr.TextArea(lines=1, label="Percentual Limite Superior do IC"), gr.Image(label="Gráfico")]
|
| 49 |
+
#text_button.click(MOD_V_SALA_Z1_002C.execute, inputs=inputs, outputs=outputs)
|
| 50 |
+
with gr.TabItem(MOD_V_AP_Z1_Z2_001A.title):
|
| 51 |
+
gr.Markdown(MOD_V_AP_Z1_Z2_001A.description)
|
| 52 |
+
inputs = MOD_V_AP_Z1_Z2_001A.load_inputs()
|
| 53 |
+
text_button = gr.Button("Calcular")
|
| 54 |
+
outputs = [gr.TextArea(lines=1, label="Valor do imóvel (R$/m²)"), gr.TextArea(lines=1, label="Limite Inferior do Intervalo de Confiança"), gr.TextArea(lines=1, label="Percentual Limite Inferior do IC"), gr.TextArea(lines=1, label="Limite Superior do Intervalo de Confiança"), gr.TextArea(lines=1, label="Percentual Limite Superior do IC"), gr.Image(label="Gráfico"), gr.components.File(label="Download Relatório em PDF")]
|
| 55 |
+
text_button.click(MOD_V_AP_Z1_Z2_001A.execute, inputs=inputs, outputs=outputs)
|
| 56 |
+
with gr.TabItem(MOD_V_AP_Z1_Z2_001.title):
|
| 57 |
+
gr.Markdown(MOD_V_AP_Z1_Z2_001.description)
|
| 58 |
+
inputs = MOD_V_AP_Z1_Z2_001.load_inputs()
|
| 59 |
+
text_button = gr.Button("Calcular")
|
| 60 |
+
outputs = [gr.TextArea(lines=1, label="Valor do imóvel (R$/m²)"), gr.TextArea(lines=1, label="Limite Inferior do Intervalo de Confiança"), gr.TextArea(lines=1, label="Percentual Limite Inferior do IC"), gr.TextArea(lines=1, label="Limite Superior do Intervalo de Confiança"), gr.TextArea(lines=1, label="Percentual Limite Superior do IC"), gr.Image(label="Gráfico"), gr.components.File(label="Download Relatório em PDF")]
|
| 61 |
+
text_button.click(MOD_V_AP_Z1_Z2_001.execute, inputs=inputs, outputs=outputs)
|
| 62 |
+
with gr.TabItem(aptos_2025.title):
|
| 63 |
+
gr.Markdown(aptos_2025.description)
|
| 64 |
+
inputs = aptos_2025.load_inputs()
|
| 65 |
+
text_button = gr.Button("Calcular")
|
| 66 |
+
outputs = [gr.TextArea(lines=1, label="Valor do imóvel (R$/m²)"), gr.components.File(label="Download Relatório em PDF")]
|
| 67 |
+
text_button.click(aptos_2025.execute, inputs=inputs, outputs=outputs)
|
| 68 |
+
with gr.TabItem(aptos_2024.title):
|
| 69 |
+
gr.Markdown(aptos_2024.description)
|
| 70 |
+
inputs = aptos_2024.load_inputs()
|
| 71 |
+
text_button = gr.Button("Calcular")
|
| 72 |
+
outputs = [gr.TextArea(lines=1, label="Valor do imóvel (R$/m²)"), gr.components.File(label="Download Relatório em PDF")]
|
| 73 |
+
text_button.click(aptos_2024.execute, inputs=inputs, outputs=outputs)
|
| 74 |
+
#with gr.TabItem(apartamentos.title):
|
| 75 |
+
#gr.Markdown(apartamentos.description)
|
| 76 |
+
#inputs = apartamentos.load_inputs()
|
| 77 |
+
#text_button = gr.Button("Calcular")
|
| 78 |
+
#outputs = gr.TextArea(lines=1, label=apartamentos.output_label)
|
| 79 |
+
#text_button.click(apartamentos.execute, inputs=inputs, outputs=outputs)
|
| 80 |
+
#with gr.TabItem(salas.title):
|
| 81 |
+
#gr.Markdown(salas.description)
|
| 82 |
+
#inputs = salas.load_inputs()
|
| 83 |
+
#text_button = gr.Button("Calcular")
|
| 84 |
+
#outputs = gr.TextArea(lines=1, label=salas.output_label)
|
| 85 |
+
#text_button.click(salas.execute, inputs=inputs, outputs=outputs)
|
| 86 |
+
|
| 87 |
+
bloco.launch(server_name='0.0.0.0', server_port=7860)
|
aptos_2024.py
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import openpyxl
|
| 2 |
+
import xgboost as xgb
|
| 3 |
+
import gradio as gr
|
| 4 |
+
import joblib
|
| 5 |
+
import pandas as pd
|
| 6 |
+
import numpy as np
|
| 7 |
+
import seaborn as sns
|
| 8 |
+
import statsmodels.api as sm
|
| 9 |
+
import matplotlib.pyplot as plt
|
| 10 |
+
import io
|
| 11 |
+
from sklearn.preprocessing import MinMaxScaler
|
| 12 |
+
from reportlab.lib import colors
|
| 13 |
+
from reportlab.lib.units import inch
|
| 14 |
+
from reportlab.lib.pagesizes import A4, landscape
|
| 15 |
+
from reportlab.lib.styles import getSampleStyleSheet
|
| 16 |
+
from reportlab.pdfgen.canvas import Canvas
|
| 17 |
+
from reportlab.platypus import SimpleDocTemplate, Spacer, Image, Frame, PageTemplate, BaseDocTemplate, Table, Paragraph, NextPageTemplate, PageBreak
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
def get_report(FON, ANO_CONST, ANDAR, X, Y, ATOTAL, RH, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, C, D, E, pred):
|
| 21 |
+
# Define the page size
|
| 22 |
+
pagesize = A4 # You can adjust the page size as needed
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
def on_page(canvas, doc):
|
| 26 |
+
page_num = canvas.getPageNumber()
|
| 27 |
+
canvas.drawCentredString(pagesize[0] / 2, 50, str(page_num))
|
| 28 |
+
|
| 29 |
+
def on_page_landscape(canvas, doc):
|
| 30 |
+
return on_page(canvas, doc, pagesize=landscape(A4))
|
| 31 |
+
|
| 32 |
+
padding = dict(
|
| 33 |
+
leftPadding=72,
|
| 34 |
+
rightPadding=72,
|
| 35 |
+
topPadding=72,
|
| 36 |
+
bottomPadding=18)
|
| 37 |
+
|
| 38 |
+
portrait_frame = Frame(0, 0, *A4, **padding)
|
| 39 |
+
landscape_frame = Frame(0, 0, *landscape(A4), **padding)
|
| 40 |
+
|
| 41 |
+
portrait_template = PageTemplate(id='portrait',
|
| 42 |
+
frames=portrait_frame,
|
| 43 |
+
onPage=on_page,
|
| 44 |
+
pagesize=A4)
|
| 45 |
+
|
| 46 |
+
landscape_template = PageTemplate(id='landscape',
|
| 47 |
+
frames=landscape_frame,
|
| 48 |
+
onPage=on_page_landscape,
|
| 49 |
+
pagesize=landscape(A4))
|
| 50 |
+
|
| 51 |
+
doc = BaseDocTemplate('report.pdf',
|
| 52 |
+
pageTemplates=[portrait_template,landscape_template])
|
| 53 |
+
|
| 54 |
+
styles = getSampleStyleSheet()
|
| 55 |
+
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
story = [
|
| 59 |
+
Image('DAI.png', width=6.4 * inch, height=1.28 * inch),
|
| 60 |
+
Spacer(1, 36),
|
| 61 |
+
Paragraph('Modelo para Salas Comerciais - XGBoost Regressor - 2024', styles['Heading1']),
|
| 62 |
+
Paragraph('Parâmetros do cálculo', styles['Heading2']),
|
| 63 |
+
Paragraph(f"Fonte (Transação ou Oferta): {FON}", styles['Normal']),
|
| 64 |
+
Paragraph(f"Ano de Construção (Conforme Cadastro Imobiliário): {ANO_CONST}", styles['Normal']),
|
| 65 |
+
Paragraph(f"Andar (Conforme Cadastro Imobiliário): {ANDAR}", styles['Normal']),
|
| 66 |
+
Paragraph(f"Coordenada X (TM-POA): {X}", styles['Normal']),
|
| 67 |
+
Paragraph(f"Coordenada Y (TM-POA): {Y}", styles['Normal']),
|
| 68 |
+
Paragraph(f"Área Total (Conforme Cadastro Imobiliário): {ATOTAL}", styles['Normal']),
|
| 69 |
+
Paragraph(f"Região Homogênea: {RH}", styles['Normal']),
|
| 70 |
+
Paragraph(f"Ano 2019 - Exercício Fiscal 2020: {'Sim' if ANO_2019 else 'Não'}", styles['Normal']),
|
| 71 |
+
Paragraph(f"Ano 2020 - Exercício Fiscal 2021: {'Sim' if ANO_2020 else 'Não'}", styles['Normal']),
|
| 72 |
+
Paragraph(f"Ano 2021 - Exercício Fiscal 2022: {'Sim' if ANO_2021 else 'Não'}", styles['Normal']),
|
| 73 |
+
Paragraph(f"Ano 2022 - Exercício Fiscal 2023: {'Sim' if ANO_2022 else 'Não'}", styles['Normal']),
|
| 74 |
+
Paragraph(f"Ano 2023 - Exercício Fiscal 2024: {'Sim' if ANO_2023 else 'Não'}", styles['Normal']),
|
| 75 |
+
Paragraph(f"Padrão Construtivo C: {'Sim' if C else 'Não'}", styles['Normal']),
|
| 76 |
+
Paragraph(f"Padrão Construtivo D: {'Sim' if D else 'Não'}", styles['Normal']),
|
| 77 |
+
Paragraph(f"Padrão Construtivo E: {'Sim' if E else 'Não'}", styles['Normal']),
|
| 78 |
+
Spacer(1, 36),
|
| 79 |
+
Paragraph('Resultado', styles['Heading1']),
|
| 80 |
+
Paragraph('Valor do imóvel (R$)', styles['Heading2']),
|
| 81 |
+
Paragraph(f"R$ {round(pred[0][0] * ATOTAL, -2)}", styles['Normal']),
|
| 82 |
+
]
|
| 83 |
+
|
| 84 |
+
doc.build(story)
|
| 85 |
+
|
| 86 |
+
|
| 87 |
+
|
| 88 |
+
def execute(FON, ANO_CONST, ANDAR, X, Y, ATOTAL, RH, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, C, D, E):
|
| 89 |
+
df = pd.DataFrame.from_dict({'FON': [FON],
|
| 90 |
+
'ANO_CONST': [ANO_CONST],
|
| 91 |
+
'ANDAR': [ANDAR],
|
| 92 |
+
'X': [X],
|
| 93 |
+
'Y': [Y],
|
| 94 |
+
'ATOTAL': np.log(ATOTAL),
|
| 95 |
+
'RH': np.log(RH),
|
| 96 |
+
'ANO_2019': 1 if ANO_2019 else 0,
|
| 97 |
+
'ANO_2020': 1 if ANO_2020 else 0,
|
| 98 |
+
'ANO_2021': 1 if ANO_2021 else 0,
|
| 99 |
+
'ANO_2022': 1 if ANO_2022 else 0,
|
| 100 |
+
'ANO_2023': 1 if ANO_2023 else 0,
|
| 101 |
+
'A': 0,
|
| 102 |
+
'B': 0,
|
| 103 |
+
'C': 1 if C else 0,
|
| 104 |
+
'D': 1 if D else 0,
|
| 105 |
+
'E': 1 if E else 0,
|
| 106 |
+
})
|
| 107 |
+
|
| 108 |
+
|
| 109 |
+
|
| 110 |
+
input_scaler = joblib.load("dados/apartamentos/input_scaler_ape_DEZ2023.save")
|
| 111 |
+
df = input_scaler.transform(df)
|
| 112 |
+
cols = ['FON', 'ANO_CONST', 'ANDAR', 'X', 'Y', 'ATOTAL', 'RH', 'ANO_2019', 'ANO_2020', 'ANO_2021', 'ANO_2022', 'ANO_2023', 'A', 'B', 'C', 'D', 'E']
|
| 113 |
+
aval = pd.DataFrame(df, columns = cols)
|
| 114 |
+
df = xgb.DMatrix(aval)
|
| 115 |
+
loaded_model = xgb.Booster()
|
| 116 |
+
loaded_model.load_model("dados/apartamentos/APARTAMENTO_2020_2021_2022_2023_2024.model")
|
| 117 |
+
pred = loaded_model.predict(df)
|
| 118 |
+
output_scaler = joblib.load("dados/apartamentos/output_scaler_ape_DEZ2023.save")
|
| 119 |
+
pred = output_scaler.inverse_transform(np.array(pred).reshape(-1,1))
|
| 120 |
+
pred = np.exp(pred)
|
| 121 |
+
|
| 122 |
+
get_report(FON, ANO_CONST, ANDAR, X, Y, ATOTAL, RH, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, C, D, E, pred)
|
| 123 |
+
|
| 124 |
+
return f"""R${round(pred[0][0] * ATOTAL, -2)}""", 'report.pdf'
|
| 125 |
+
|
| 126 |
+
def load_inputs():
|
| 127 |
+
FON = gr.Checkbox(label='Fonte (Transação: desmarcar | Oferta: marcar)', value=False)
|
| 128 |
+
ANO_CONST = gr.Number(value=2020, label='Ano de Construção (Conforme Cadastro Imobiliário)')
|
| 129 |
+
ANDAR = gr.Number(value=4, label='Andar (Conforme Cadastro Imobiliário)')
|
| 130 |
+
X = gr.Number(label='Coordenada X (TM-POA)', value=281554.)
|
| 131 |
+
Y = gr.Number(label='Coordenada Y (TM-POA)', value=1675418.)
|
| 132 |
+
ATOTAL = gr.Number(label='Área Total (Conforme Cadastro Imobiliário)', value=60.)
|
| 133 |
+
RH = gr.Number(value=120, label='Região Homogênea')
|
| 134 |
+
ANO_2019 = gr.Checkbox(label='Ano 2019 - Carga Geral 2020', value=False)
|
| 135 |
+
ANO_2020 = gr.Checkbox(label='Ano 2020 - Carga Geral 2021', value=False)
|
| 136 |
+
ANO_2021 = gr.Checkbox(label='Ano 2021 - Carga Geral 2022', value=False)
|
| 137 |
+
ANO_2022 = gr.Checkbox(label='Ano 2022 - Carga Geral 2023', value=False)
|
| 138 |
+
ANO_2023 = gr.Checkbox(label='Ano 2023 - Carga Geral 2024', value=True)
|
| 139 |
+
C = gr.Checkbox(label='Padrão Construtivo C', value=True)
|
| 140 |
+
D = gr.Checkbox(label='Padrão Construtivo D', value=False)
|
| 141 |
+
E = gr.Checkbox(label='Padrão Construtivo E', value=False)
|
| 142 |
+
|
| 143 |
+
|
| 144 |
+
return [FON, ANO_CONST, ANDAR, X, Y, ATOTAL, RH, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, C, D, E]
|
| 145 |
+
|
| 146 |
+
title = 'Apartamentos - XGBoost Regressor - 2024'
|
| 147 |
+
|
| 148 |
+
|
| 149 |
+
description = f"""
|
| 150 |
+
# <p style="text-align: center;">Modelo para Apartamentos - XGBoost Regressor - 2024</p>
|
| 151 |
+
<p style="text-align: center;">39.732 dados efetivamente utilizados, referentes aos anos 2019 a 2023.</p>
|
| 152 |
+
<hr style="color: #333; background-color: #333; height: 1px; border: none;">
|
| 153 |
+
"""
|
aptos_2025.py
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import openpyxl
|
| 2 |
+
import xgboost as xgb
|
| 3 |
+
import gradio as gr
|
| 4 |
+
import joblib
|
| 5 |
+
import pandas as pd
|
| 6 |
+
import numpy as np
|
| 7 |
+
import seaborn as sns
|
| 8 |
+
import statsmodels.api as sm
|
| 9 |
+
import matplotlib.pyplot as plt
|
| 10 |
+
import io
|
| 11 |
+
from sklearn.preprocessing import MinMaxScaler
|
| 12 |
+
from reportlab.lib import colors
|
| 13 |
+
from reportlab.lib.units import inch
|
| 14 |
+
from reportlab.lib.pagesizes import A4, landscape
|
| 15 |
+
from reportlab.lib.styles import getSampleStyleSheet
|
| 16 |
+
from reportlab.pdfgen.canvas import Canvas
|
| 17 |
+
from reportlab.platypus import SimpleDocTemplate, Spacer, Image, Frame, PageTemplate, BaseDocTemplate, Table, Paragraph, NextPageTemplate, PageBreak
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
def get_report(FON, ANO_CONST, ANDAR, X, Y, ATOTAL, RH, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, ANO_2024, C, D, E, pred):
|
| 21 |
+
# Define the page size
|
| 22 |
+
pagesize = A4 # You can adjust the page size as needed
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
def on_page(canvas, doc):
|
| 26 |
+
page_num = canvas.getPageNumber()
|
| 27 |
+
canvas.drawCentredString(pagesize[0] / 2, 50, str(page_num))
|
| 28 |
+
|
| 29 |
+
def on_page_landscape(canvas, doc):
|
| 30 |
+
return on_page(canvas, doc, pagesize=landscape(A4))
|
| 31 |
+
|
| 32 |
+
padding = dict(
|
| 33 |
+
leftPadding=72,
|
| 34 |
+
rightPadding=72,
|
| 35 |
+
topPadding=72,
|
| 36 |
+
bottomPadding=18)
|
| 37 |
+
|
| 38 |
+
portrait_frame = Frame(0, 0, *A4, **padding)
|
| 39 |
+
landscape_frame = Frame(0, 0, *landscape(A4), **padding)
|
| 40 |
+
|
| 41 |
+
portrait_template = PageTemplate(id='portrait',
|
| 42 |
+
frames=portrait_frame,
|
| 43 |
+
onPage=on_page,
|
| 44 |
+
pagesize=A4)
|
| 45 |
+
|
| 46 |
+
landscape_template = PageTemplate(id='landscape',
|
| 47 |
+
frames=landscape_frame,
|
| 48 |
+
onPage=on_page_landscape,
|
| 49 |
+
pagesize=landscape(A4))
|
| 50 |
+
|
| 51 |
+
doc = BaseDocTemplate('report.pdf',
|
| 52 |
+
pageTemplates=[portrait_template,landscape_template])
|
| 53 |
+
|
| 54 |
+
styles = getSampleStyleSheet()
|
| 55 |
+
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
story = [
|
| 59 |
+
Image('DAI.png', width=6.4 * inch, height=1.28 * inch),
|
| 60 |
+
Spacer(1, 36),
|
| 61 |
+
Paragraph('Modelo para Salas Comerciais - XGBoost Regressor - 2024', styles['Heading1']),
|
| 62 |
+
Paragraph('Parâmetros do cálculo', styles['Heading2']),
|
| 63 |
+
Paragraph(f"Fonte (Transação ou Oferta): {FON}", styles['Normal']),
|
| 64 |
+
Paragraph(f"Ano de Construção (Conforme Cadastro Imobiliário): {ANO_CONST}", styles['Normal']),
|
| 65 |
+
Paragraph(f"Andar (Conforme Cadastro Imobiliário): {ANDAR}", styles['Normal']),
|
| 66 |
+
Paragraph(f"Coordenada X (TM-POA): {X}", styles['Normal']),
|
| 67 |
+
Paragraph(f"Coordenada Y (TM-POA): {Y}", styles['Normal']),
|
| 68 |
+
Paragraph(f"Área Total (Conforme Cadastro Imobiliário): {ATOTAL}", styles['Normal']),
|
| 69 |
+
Paragraph(f"Região Homogênea: {RH}", styles['Normal']),
|
| 70 |
+
Paragraph(f"Ano 2019 - Exercício Fiscal 2020: {'Sim' if ANO_2019 else 'Não'}", styles['Normal']),
|
| 71 |
+
Paragraph(f"Ano 2020 - Exercício Fiscal 2021: {'Sim' if ANO_2020 else 'Não'}", styles['Normal']),
|
| 72 |
+
Paragraph(f"Ano 2021 - Exercício Fiscal 2022: {'Sim' if ANO_2021 else 'Não'}", styles['Normal']),
|
| 73 |
+
Paragraph(f"Ano 2022 - Exercício Fiscal 2023: {'Sim' if ANO_2022 else 'Não'}", styles['Normal']),
|
| 74 |
+
Paragraph(f"Ano 2023 - Exercício Fiscal 2024: {'Sim' if ANO_2023 else 'Não'}", styles['Normal']),
|
| 75 |
+
Paragraph(f"Ano 2024 - Exercício Fiscal 2025: {'Sim' if ANO_2023 else 'Não'}", styles['Normal']),
|
| 76 |
+
Paragraph(f"Padrão Construtivo C: {'Sim' if C else 'Não'}", styles['Normal']),
|
| 77 |
+
Paragraph(f"Padrão Construtivo D: {'Sim' if D else 'Não'}", styles['Normal']),
|
| 78 |
+
Paragraph(f"Padrão Construtivo E: {'Sim' if E else 'Não'}", styles['Normal']),
|
| 79 |
+
Spacer(1, 36),
|
| 80 |
+
Paragraph('Resultado', styles['Heading1']),
|
| 81 |
+
Paragraph('Valor do imóvel (R$)', styles['Heading2']),
|
| 82 |
+
Paragraph(f"R$ {round(pred[0][0] * ATOTAL, -2)}", styles['Normal']),
|
| 83 |
+
]
|
| 84 |
+
|
| 85 |
+
doc.build(story)
|
| 86 |
+
|
| 87 |
+
|
| 88 |
+
|
| 89 |
+
def execute(FON, ANO_CONST, ANDAR, X, Y, ATOTAL, RH, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, ANO_2024, C, D, E):
|
| 90 |
+
df = pd.DataFrame.from_dict({'FON': [FON],
|
| 91 |
+
'ANO_CONST': [ANO_CONST],
|
| 92 |
+
'ANDAR': [ANDAR],
|
| 93 |
+
'X': [X],
|
| 94 |
+
'Y': [Y],
|
| 95 |
+
'ATOTAL': np.log(ATOTAL),
|
| 96 |
+
'RH': np.log(RH),
|
| 97 |
+
'ANO_2019': 1 if ANO_2019 else 0,
|
| 98 |
+
'ANO_2020': 1 if ANO_2020 else 0,
|
| 99 |
+
'ANO_2021': 1 if ANO_2021 else 0,
|
| 100 |
+
'ANO_2022': 1 if ANO_2022 else 0,
|
| 101 |
+
'ANO_2023': 1 if ANO_2023 else 0,
|
| 102 |
+
'ANO_2024': 1 if ANO_2023 else 0,
|
| 103 |
+
'C': 1 if C else 0,
|
| 104 |
+
'D': 1 if D else 0,
|
| 105 |
+
'E': 1 if E else 0,
|
| 106 |
+
})
|
| 107 |
+
|
| 108 |
+
|
| 109 |
+
|
| 110 |
+
input_scaler = joblib.load("dados/apartamentos/input_scaler_ape_DEZ2024.save")
|
| 111 |
+
df = input_scaler.transform(df)
|
| 112 |
+
cols = ['FON', 'ANO_CONST', 'ANDAR', 'X', 'Y', 'ATOTAL', 'RH', 'ANO_2019', 'ANO_2020', 'ANO_2021', 'ANO_2022', 'ANO_2023', 'ANO_2024', 'C', 'D', 'E']
|
| 113 |
+
aval = pd.DataFrame(df, columns = cols)
|
| 114 |
+
df = xgb.DMatrix(aval)
|
| 115 |
+
loaded_model = xgb.Booster()
|
| 116 |
+
loaded_model.load_model("dados/apartamentos/APARTAMENTO_2020_a_2025.model")
|
| 117 |
+
pred = loaded_model.predict(df)
|
| 118 |
+
output_scaler = joblib.load("dados/apartamentos/output_scaler_ape_DEZ2024.save")
|
| 119 |
+
pred = output_scaler.inverse_transform(np.array(pred).reshape(-1,1))
|
| 120 |
+
pred = np.exp(pred)
|
| 121 |
+
|
| 122 |
+
get_report(FON, ANO_CONST, ANDAR, X, Y, ATOTAL, RH, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, ANO_2024, C, D, E, pred)
|
| 123 |
+
|
| 124 |
+
return f"""R${round(pred[0][0] * ATOTAL, -2)}""", 'report.pdf'
|
| 125 |
+
|
| 126 |
+
def load_inputs():
|
| 127 |
+
FON = gr.Checkbox(label='Fonte (Transação: desmarcar | Oferta: marcar)', value=False)
|
| 128 |
+
ANO_CONST = gr.Number(value=2020, label='Ano de Construção (Conforme Cadastro Imobiliário)')
|
| 129 |
+
ANDAR = gr.Number(value=4, label='Andar (Conforme Cadastro Imobiliário)')
|
| 130 |
+
X = gr.Number(label='Coordenada X (TM-POA)', value=281554.)
|
| 131 |
+
Y = gr.Number(label='Coordenada Y (TM-POA)', value=1675418.)
|
| 132 |
+
ATOTAL = gr.Number(label='Área Total (Conforme Cadastro Imobiliário)', value=60.)
|
| 133 |
+
RH = gr.Number(value=120, label='Região Homogênea')
|
| 134 |
+
ANO_2019 = gr.Checkbox(label='Ano 2019 - Carga Geral 2020', value=False)
|
| 135 |
+
ANO_2020 = gr.Checkbox(label='Ano 2020 - Carga Geral 2021', value=False)
|
| 136 |
+
ANO_2021 = gr.Checkbox(label='Ano 2021 - Carga Geral 2022', value=False)
|
| 137 |
+
ANO_2022 = gr.Checkbox(label='Ano 2022 - Carga Geral 2023', value=False)
|
| 138 |
+
ANO_2023 = gr.Checkbox(label='Ano 2023 - Carga Geral 2024', value=False)
|
| 139 |
+
ANO_2024 = gr.Checkbox(label='Ano 2024 - Carga Geral 2025', value=True)
|
| 140 |
+
C = gr.Checkbox(label='Padrão Construtivo C', value=True)
|
| 141 |
+
D = gr.Checkbox(label='Padrão Construtivo D', value=False)
|
| 142 |
+
E = gr.Checkbox(label='Padrão Construtivo E', value=False)
|
| 143 |
+
|
| 144 |
+
|
| 145 |
+
return [FON, ANO_CONST, ANDAR, X, Y, ATOTAL, RH, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, ANO_2024, C, D, E]
|
| 146 |
+
|
| 147 |
+
title = 'Apartamentos - XGBoost Regressor - 2025'
|
| 148 |
+
|
| 149 |
+
|
| 150 |
+
description = f"""
|
| 151 |
+
# <p style="text-align: center;">Modelo para Apartamentos - XGBoost Regressor - 2025</p>
|
| 152 |
+
<p style="text-align: center;">76.569 dados efetivamente utilizados, referentes aos anos 2019 a 2024.</p>
|
| 153 |
+
<hr style="color: #333; background-color: #333; height: 1px; border: none;">
|
| 154 |
+
"""
|
salas.py
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
import pandas as pd
|
| 3 |
+
import numpy as np
|
| 4 |
+
import xgboost as xgb
|
| 5 |
+
import joblib
|
| 6 |
+
from sklearn.preprocessing import MinMaxScaler
|
| 7 |
+
|
| 8 |
+
def execute(FONTE, X, Y, RH, ANO_C, ATOTAL, ANO_DADO_ANO_2019, ANO_DADO_ANO_2020, ANO_DADO_ANO_2021, ANO_DADO_ANO_2022, Alvenaria_B, Alvenaria_D, Alvenaria_C, Alvenaria_E):
|
| 9 |
+
df = pd.DataFrame.from_dict({'FONTE': [FONTE],
|
| 10 |
+
'X': [X],
|
| 11 |
+
'Y': [Y],
|
| 12 |
+
'RH': [RH],
|
| 13 |
+
'ANO_C': [ANO_C],
|
| 14 |
+
'ATOTAL': np.log([ATOTAL]),
|
| 15 |
+
'ANO_DADO_ANO_2019': ANO_DADO_ANO_2019,
|
| 16 |
+
'ANO_DADO_ANO_2020': ANO_DADO_ANO_2020,
|
| 17 |
+
'ANO_DADO_ANO_2021': ANO_DADO_ANO_2021,
|
| 18 |
+
'ANO_DADO_ANO_2022': ANO_DADO_ANO_2022,
|
| 19 |
+
'Alvenaria_B': Alvenaria_B,
|
| 20 |
+
'Alvenaria_D': Alvenaria_D,
|
| 21 |
+
'Alvenaria_C': Alvenaria_C,
|
| 22 |
+
'Alvenaria_E': Alvenaria_E}
|
| 23 |
+
)
|
| 24 |
+
|
| 25 |
+
|
| 26 |
+
|
| 27 |
+
input_scaler = joblib.load("dados/salas/input_scaler_salas_comerciais_2023_v2.save")
|
| 28 |
+
df = input_scaler.transform(df)
|
| 29 |
+
cols = ['FONTE', 'X', 'Y', 'RH', 'ANO_C', 'ATOTAL', 'ANO_DADO_ANO_2019', 'ANO_DADO_ANO_2020', 'ANO_DADO_ANO_2021', 'ANO_DADO_ANO_2022', 'Alvenaria_B', 'Alvenaria_D', 'Alvenaria_C', 'Alvenaria_E']
|
| 30 |
+
aval = pd.DataFrame(df, columns = cols)
|
| 31 |
+
df = xgb.DMatrix(aval)
|
| 32 |
+
loaded_model = xgb.Booster()
|
| 33 |
+
loaded_model.load_model("dados/salas/SALAS_COMERCIAIS_2020_2021_2022_2023_v2.model")
|
| 34 |
+
pred = loaded_model.predict(df)
|
| 35 |
+
output_scaler = joblib.load("dados/salas/output_scaler_salas_comerciais_2023_v2.save")
|
| 36 |
+
pred = output_scaler.inverse_transform(np.array(pred).reshape(-1,1))
|
| 37 |
+
pred = np.exp(pred).tolist()
|
| 38 |
+
return f"""Valor do imóvel: R${round(pred[0][0], -2) * ATOTAL}"""
|
| 39 |
+
|
| 40 |
+
|
| 41 |
+
|
| 42 |
+
def load_inputs():
|
| 43 |
+
FONTE = gr.inputs.Number(default = 0, label='Fonte: 0 - Transação | 1 - Oferta')
|
| 44 |
+
X = gr.inputs.Number(default = 282122.159663, label='Longitude (SIRGAS 2000)')
|
| 45 |
+
Y = gr.inputs.Number(default = 1.672718e+06, label='Latitude (SIRGAS 2000)')
|
| 46 |
+
RH = gr.inputs.Number(default = 150, label='Região Homogênea')
|
| 47 |
+
ANO_C = gr.inputs.Number(default = 2022, label='Ano de Construção')
|
| 48 |
+
ATOTAL = gr.inputs.Number(default = 80., label='Área Total')
|
| 49 |
+
ANO_DADO_ANO_2019 = gr.inputs.Number(default = 0, label='Ano 2019')
|
| 50 |
+
ANO_DADO_ANO_2020 = gr.inputs.Number(default = 0, label='Ano 2020')
|
| 51 |
+
ANO_DADO_ANO_2021 = gr.inputs.Number(default = 0, label='Ano 2021')
|
| 52 |
+
ANO_DADO_ANO_2022 = gr.inputs.Number(default = 1, label='Ano 2022')
|
| 53 |
+
Alvenaria_B = gr.inputs.Number(default = 0, label='Alvenaria (B)')
|
| 54 |
+
Alvenaria_C = gr.inputs.Number(default = 1, label='Alvenaria (C)')
|
| 55 |
+
Alvenaria_D = gr.inputs.Number(default = 0, label='Alvenaria (D)')
|
| 56 |
+
Alvenaria_E = gr.inputs.Number(default = 0, label='Alvenaria (E)')
|
| 57 |
+
return [FONTE, X, Y, RH, ANO_C, ATOTAL, ANO_DADO_ANO_2019, ANO_DADO_ANO_2020, ANO_DADO_ANO_2021, ANO_DADO_ANO_2022, Alvenaria_B, Alvenaria_D, Alvenaria_C, Alvenaria_E]
|
| 58 |
+
|
| 59 |
+
output_label = "Valor do imóvel (R$)"
|
| 60 |
+
|
| 61 |
+
title = 'Venda - Salas Comerciais'
|
| 62 |
+
|
| 63 |
+
description = '2.887 dados de Janeiro de 2019 a Dezembro de 2022'
|
salas_2024.py
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import openpyxl
|
| 2 |
+
import xgboost as xgb
|
| 3 |
+
import gradio as gr
|
| 4 |
+
import joblib
|
| 5 |
+
import pandas as pd
|
| 6 |
+
import numpy as np
|
| 7 |
+
import seaborn as sns
|
| 8 |
+
import statsmodels.api as sm
|
| 9 |
+
import matplotlib.pyplot as plt
|
| 10 |
+
import io
|
| 11 |
+
from sklearn.preprocessing import MinMaxScaler
|
| 12 |
+
from reportlab.lib import colors
|
| 13 |
+
from reportlab.lib.units import inch
|
| 14 |
+
from reportlab.lib.pagesizes import A4, landscape
|
| 15 |
+
from reportlab.lib.styles import getSampleStyleSheet
|
| 16 |
+
from reportlab.pdfgen.canvas import Canvas
|
| 17 |
+
from reportlab.platypus import SimpleDocTemplate, Spacer, Image, Frame, PageTemplate, BaseDocTemplate, Table, Paragraph, NextPageTemplate, PageBreak
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
def get_report(FON, X, Y, RH, ANO_C, ATOTAL, C, D, E, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, ANO_2024, pred):
|
| 21 |
+
# Define the page size
|
| 22 |
+
pagesize = A4 # You can adjust the page size as needed
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
def on_page(canvas, doc):
|
| 26 |
+
page_num = canvas.getPageNumber()
|
| 27 |
+
canvas.drawCentredString(pagesize[0] / 2, 50, str(page_num))
|
| 28 |
+
|
| 29 |
+
def on_page_landscape(canvas, doc):
|
| 30 |
+
return on_page(canvas, doc, pagesize=landscape(A4))
|
| 31 |
+
|
| 32 |
+
padding = dict(
|
| 33 |
+
leftPadding=72,
|
| 34 |
+
rightPadding=72,
|
| 35 |
+
topPadding=72,
|
| 36 |
+
bottomPadding=18)
|
| 37 |
+
|
| 38 |
+
portrait_frame = Frame(0, 0, *A4, **padding)
|
| 39 |
+
landscape_frame = Frame(0, 0, *landscape(A4), **padding)
|
| 40 |
+
|
| 41 |
+
portrait_template = PageTemplate(id='portrait',
|
| 42 |
+
frames=portrait_frame,
|
| 43 |
+
onPage=on_page,
|
| 44 |
+
pagesize=A4)
|
| 45 |
+
|
| 46 |
+
landscape_template = PageTemplate(id='landscape',
|
| 47 |
+
frames=landscape_frame,
|
| 48 |
+
onPage=on_page_landscape,
|
| 49 |
+
pagesize=landscape(A4))
|
| 50 |
+
|
| 51 |
+
doc = BaseDocTemplate('report.pdf',
|
| 52 |
+
pageTemplates=[portrait_template,landscape_template])
|
| 53 |
+
|
| 54 |
+
styles = getSampleStyleSheet()
|
| 55 |
+
|
| 56 |
+
story = [
|
| 57 |
+
Image('DAI.png', width=6.4 * inch, height=1.28 * inch),
|
| 58 |
+
Spacer(1, 36),
|
| 59 |
+
Paragraph('Modelo para Salas Comerciais - XGBoost Regressor - 2024', styles['Heading1']),
|
| 60 |
+
Paragraph('Parâmetros do cálculo', styles['Heading2']),
|
| 61 |
+
Paragraph(f"Fonte (Transação ou Oferta): {FON}", styles['Normal']),
|
| 62 |
+
Paragraph(f"Coordenada X (TM-POA): {X}", styles['Normal']),
|
| 63 |
+
Paragraph(f"Coordenada Y (TM-POA): {Y}", styles['Normal']),
|
| 64 |
+
Paragraph(f"Região Homogênea: {RH}", styles['Normal']),
|
| 65 |
+
Paragraph(f"Ano de Construção (Conforme Cadastro Imobiliário): {ANO_C}", styles['Normal']),
|
| 66 |
+
Paragraph(f"Área Total (Conforme Cadastro Imobiliário): {ATOTAL}", styles['Normal']),
|
| 67 |
+
Paragraph(f"Padrão Construtivo C: {'Sim' if C else 'Não'}", styles['Normal']),
|
| 68 |
+
Paragraph(f"Padrão Construtivo D: {'Sim' if D else 'Não'}", styles['Normal']),
|
| 69 |
+
Paragraph(f"Padrão Construtivo E: {'Sim' if E else 'Não'}", styles['Normal']),
|
| 70 |
+
Paragraph(f"Ano 2019 - Exercício Fiscal 2020: {'Sim' if ANO_2019 else 'Não'}", styles['Normal']),
|
| 71 |
+
Paragraph(f"Ano 2020 - Exercício Fiscal 2021: {'Sim' if ANO_2020 else 'Não'}", styles['Normal']),
|
| 72 |
+
Paragraph(f"Ano 2021 - Exercício Fiscal 2022: {'Sim' if ANO_2021 else 'Não'}", styles['Normal']),
|
| 73 |
+
Paragraph(f"Ano 2022 - Exercício Fiscal 2023: {'Sim' if ANO_2022 else 'Não'}", styles['Normal']),
|
| 74 |
+
Paragraph(f"Ano 2023 - Exercício Fiscal 2024: {'Sim' if ANO_2023 else 'Não'}", styles['Normal']),
|
| 75 |
+
Paragraph(f"Ano 2024 : {'Sim' if ANO_2024 else 'Não'}", styles['Normal']),
|
| 76 |
+
Spacer(1, 36),
|
| 77 |
+
Paragraph('Resultado', styles['Heading1']),
|
| 78 |
+
Paragraph('Valor do imóvel (R$)', styles['Heading2']),
|
| 79 |
+
Paragraph(f"R$ {round(pred[0][0] * ATOTAL, -2)}", styles['Normal']),
|
| 80 |
+
]
|
| 81 |
+
|
| 82 |
+
doc.build(story)
|
| 83 |
+
|
| 84 |
+
|
| 85 |
+
|
| 86 |
+
def execute(FON, X, Y, RH, ANO_C, ATOTAL, C, D, E, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, ANO_2024):
|
| 87 |
+
df = pd.DataFrame.from_dict({'FON': [FON],
|
| 88 |
+
'X': [X],
|
| 89 |
+
'Y': [Y],
|
| 90 |
+
'RH': [RH],
|
| 91 |
+
'ANO_C': [ANO_C],
|
| 92 |
+
'ATOTAL': np.log(ATOTAL),
|
| 93 |
+
'A': 0,
|
| 94 |
+
'B': 0,
|
| 95 |
+
'C': 1 if C else 0,
|
| 96 |
+
'D': 1 if D else 0,
|
| 97 |
+
'E': 1 if E else 0,
|
| 98 |
+
'ANO_2019': 1 if ANO_2019 else 0,
|
| 99 |
+
'ANO_2020': 1 if ANO_2020 else 0,
|
| 100 |
+
'ANO_2021': 1 if ANO_2021 else 0,
|
| 101 |
+
'ANO_2022': 1 if ANO_2022 else 0,
|
| 102 |
+
'ANO_2023': 1 if ANO_2023 else 0,
|
| 103 |
+
'ANO_2024': 1 if ANO_2024 else 0,
|
| 104 |
+
})
|
| 105 |
+
|
| 106 |
+
|
| 107 |
+
|
| 108 |
+
input_scaler = joblib.load("dados/salas/input_scaler_salas_comerciais_2024.save")
|
| 109 |
+
df = input_scaler.transform(df)
|
| 110 |
+
cols = ['FON', 'X', 'Y', 'RH', 'ANO_C', 'ATOTAL', 'A', 'B', 'C', 'D', 'E', 'ANO_2019', 'ANO_2020', 'ANO_2021', 'ANO_2022', 'ANO_2023', 'ANO_2024']
|
| 111 |
+
aval = pd.DataFrame(df, columns = cols)
|
| 112 |
+
df = xgb.DMatrix(aval)
|
| 113 |
+
loaded_model = xgb.Booster()
|
| 114 |
+
loaded_model.load_model("dados/salas/SALAS_COMERCIAIS_2020_2021_2022_2023_2024.model")
|
| 115 |
+
pred = loaded_model.predict(df)
|
| 116 |
+
output_scaler = joblib.load("dados/salas/output_scaler_salas_comerciais_2024.save")
|
| 117 |
+
pred = output_scaler.inverse_transform(np.array(pred).reshape(-1,1))
|
| 118 |
+
pred = np.exp(pred)
|
| 119 |
+
|
| 120 |
+
get_report(FON, X, Y, RH, ANO_C, ATOTAL, C, D, E, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, ANO_2024, pred)
|
| 121 |
+
|
| 122 |
+
return f"""R${round(pred[0][0] * ATOTAL, -2)}""", 'report.pdf'
|
| 123 |
+
|
| 124 |
+
def load_inputs():
|
| 125 |
+
FON = gr.Checkbox(label='Fonte (Transação: desmarcar | Oferta: marcar)', value=False)
|
| 126 |
+
X = gr.Number(label='Coordenada X (TM-POA)', value=281554.)
|
| 127 |
+
Y = gr.Number(label='Coordenada Y (TM-POA)', value=1675418.)
|
| 128 |
+
RH = gr.Number(value=120, label='Região Homogênea')
|
| 129 |
+
ANO_C = gr.Number(value=2020, label='Ano de Construção (Conforme Cadastro Imobiliário)')
|
| 130 |
+
ATOTAL = gr.Number(label='Área Total (Conforme Cadastro Imobiliário)', value=60.)
|
| 131 |
+
C = gr.Checkbox(label='Padrão Construtivo C', value=True)
|
| 132 |
+
D = gr.Checkbox(label='Padrão Construtivo D', value=False)
|
| 133 |
+
E = gr.Checkbox(label='Padrão Construtivo E', value=False)
|
| 134 |
+
ANO_2019 = gr.Checkbox(label='Ano 2019 - Carga Geral 2020', value=False)
|
| 135 |
+
ANO_2020 = gr.Checkbox(label='Ano 2020 - Carga Geral 2021', value=False)
|
| 136 |
+
ANO_2021 = gr.Checkbox(label='Ano 2021 - Carga Geral 2022', value=False)
|
| 137 |
+
ANO_2022 = gr.Checkbox(label='Ano 2022 - Carga Geral 2023', value=False)
|
| 138 |
+
ANO_2023 = gr.Checkbox(label='Ano 2023 - Carga Geral 2024', value=True)
|
| 139 |
+
ANO_2024 = gr.Checkbox(label='Ano 2024', value=False)
|
| 140 |
+
return [FON, X, Y, RH, ANO_C, ATOTAL, C, D, E, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, ANO_2024]
|
| 141 |
+
|
| 142 |
+
title = 'Salas Comerciais - XGBoost Regressor - 2024'
|
| 143 |
+
|
| 144 |
+
|
| 145 |
+
description = f"""
|
| 146 |
+
# <p style="text-align: center;">Modelo para Salas Comerciais - XGBoost Regressor - 2024</p>
|
| 147 |
+
<p style="text-align: center;">19.984 dados efetivamente utilizados, referentes aos anos 2019 a 2024.</p>
|
| 148 |
+
<hr style="color: #333; background-color: #333; height: 1px; border: none;">
|
| 149 |
+
"""
|
salas_2025.py
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import openpyxl
|
| 2 |
+
import xgboost as xgb
|
| 3 |
+
import gradio as gr
|
| 4 |
+
import joblib
|
| 5 |
+
import pandas as pd
|
| 6 |
+
import numpy as np
|
| 7 |
+
import seaborn as sns
|
| 8 |
+
import statsmodels.api as sm
|
| 9 |
+
import matplotlib.pyplot as plt
|
| 10 |
+
import io
|
| 11 |
+
from sklearn.preprocessing import MinMaxScaler
|
| 12 |
+
from reportlab.lib import colors
|
| 13 |
+
from reportlab.lib.units import inch
|
| 14 |
+
from reportlab.lib.pagesizes import A4, landscape
|
| 15 |
+
from reportlab.lib.styles import getSampleStyleSheet
|
| 16 |
+
from reportlab.pdfgen.canvas import Canvas
|
| 17 |
+
from reportlab.platypus import SimpleDocTemplate, Spacer, Image, Frame, PageTemplate, BaseDocTemplate, Table, Paragraph, NextPageTemplate, PageBreak
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
def get_report(FON, X, Y, RH, ANO_C, ATOTAL, C, D, E, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, ANO_2024, pred):
|
| 21 |
+
# Define the page size
|
| 22 |
+
pagesize = A4 # You can adjust the page size as needed
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
def on_page(canvas, doc):
|
| 26 |
+
page_num = canvas.getPageNumber()
|
| 27 |
+
canvas.drawCentredString(pagesize[0] / 2, 50, str(page_num))
|
| 28 |
+
|
| 29 |
+
def on_page_landscape(canvas, doc):
|
| 30 |
+
return on_page(canvas, doc, pagesize=landscape(A4))
|
| 31 |
+
|
| 32 |
+
padding = dict(
|
| 33 |
+
leftPadding=72,
|
| 34 |
+
rightPadding=72,
|
| 35 |
+
topPadding=72,
|
| 36 |
+
bottomPadding=18)
|
| 37 |
+
|
| 38 |
+
portrait_frame = Frame(0, 0, *A4, **padding)
|
| 39 |
+
landscape_frame = Frame(0, 0, *landscape(A4), **padding)
|
| 40 |
+
|
| 41 |
+
portrait_template = PageTemplate(id='portrait',
|
| 42 |
+
frames=portrait_frame,
|
| 43 |
+
onPage=on_page,
|
| 44 |
+
pagesize=A4)
|
| 45 |
+
|
| 46 |
+
landscape_template = PageTemplate(id='landscape',
|
| 47 |
+
frames=landscape_frame,
|
| 48 |
+
onPage=on_page_landscape,
|
| 49 |
+
pagesize=landscape(A4))
|
| 50 |
+
|
| 51 |
+
doc = BaseDocTemplate('report.pdf',
|
| 52 |
+
pageTemplates=[portrait_template,landscape_template])
|
| 53 |
+
|
| 54 |
+
styles = getSampleStyleSheet()
|
| 55 |
+
|
| 56 |
+
story = [
|
| 57 |
+
Image('DAI.png', width=6.4 * inch, height=1.28 * inch),
|
| 58 |
+
Spacer(1, 36),
|
| 59 |
+
Paragraph('Modelo para Salas Comerciais - XGBoost Regressor - 2025', styles['Heading1']),
|
| 60 |
+
Paragraph('Parâmetros do cálculo', styles['Heading2']),
|
| 61 |
+
Paragraph(f"Fonte (Transação ou Oferta): {FON}", styles['Normal']),
|
| 62 |
+
Paragraph(f"Coordenada X (TM-POA): {X}", styles['Normal']),
|
| 63 |
+
Paragraph(f"Coordenada Y (TM-POA): {Y}", styles['Normal']),
|
| 64 |
+
Paragraph(f"Região Homogênea: {RH}", styles['Normal']),
|
| 65 |
+
Paragraph(f"Ano de Construção (Conforme Cadastro Imobiliário): {ANO_C}", styles['Normal']),
|
| 66 |
+
Paragraph(f"Área Total (Conforme Cadastro Imobiliário): {ATOTAL}", styles['Normal']),
|
| 67 |
+
Paragraph(f"Padrão Construtivo C: {'Sim' if C else 'Não'}", styles['Normal']),
|
| 68 |
+
Paragraph(f"Padrão Construtivo D: {'Sim' if D else 'Não'}", styles['Normal']),
|
| 69 |
+
Paragraph(f"Padrão Construtivo E: {'Sim' if E else 'Não'}", styles['Normal']),
|
| 70 |
+
Paragraph(f"Ano 2019 - Exercício Fiscal 2020: {'Sim' if ANO_2019 else 'Não'}", styles['Normal']),
|
| 71 |
+
Paragraph(f"Ano 2020 - Exercício Fiscal 2021: {'Sim' if ANO_2020 else 'Não'}", styles['Normal']),
|
| 72 |
+
Paragraph(f"Ano 2021 - Exercício Fiscal 2022: {'Sim' if ANO_2021 else 'Não'}", styles['Normal']),
|
| 73 |
+
Paragraph(f"Ano 2022 - Exercício Fiscal 2023: {'Sim' if ANO_2022 else 'Não'}", styles['Normal']),
|
| 74 |
+
Paragraph(f"Ano 2023 - Exercício Fiscal 2024: {'Sim' if ANO_2023 else 'Não'}", styles['Normal']),
|
| 75 |
+
Paragraph(f"Ano 2024 - Exercício Fiscal 2025: {'Sim' if ANO_2024 else 'Não'}", styles['Normal']),
|
| 76 |
+
Spacer(1, 36),
|
| 77 |
+
Paragraph('Resultado', styles['Heading1']),
|
| 78 |
+
Paragraph('Valor do imóvel (R$)', styles['Heading2']),
|
| 79 |
+
Paragraph(f"R$ {round(pred[0][0] * ATOTAL, -2)}", styles['Normal']),
|
| 80 |
+
]
|
| 81 |
+
|
| 82 |
+
doc.build(story)
|
| 83 |
+
|
| 84 |
+
|
| 85 |
+
|
| 86 |
+
def execute(FON, X, Y, RH, ANO_C, ATOTAL, C, D, E, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, ANO_2024):
|
| 87 |
+
df = pd.DataFrame.from_dict({'FON': [FON],
|
| 88 |
+
'X': [X],
|
| 89 |
+
'Y': [Y],
|
| 90 |
+
'RH': [RH],
|
| 91 |
+
'ANO_C': [ANO_C],
|
| 92 |
+
'ATOTAL': np.log(ATOTAL),
|
| 93 |
+
'A': 0,
|
| 94 |
+
'B': 0,
|
| 95 |
+
'C': 1 if C else 0,
|
| 96 |
+
'D': 1 if D else 0,
|
| 97 |
+
'E': 1 if E else 0,
|
| 98 |
+
'ANO_2019': 1 if ANO_2019 else 0,
|
| 99 |
+
'ANO_2020': 1 if ANO_2020 else 0,
|
| 100 |
+
'ANO_2021': 1 if ANO_2021 else 0,
|
| 101 |
+
'ANO_2022': 1 if ANO_2022 else 0,
|
| 102 |
+
'ANO_2023': 1 if ANO_2023 else 0,
|
| 103 |
+
'ANO_2024': 1 if ANO_2024 else 0,
|
| 104 |
+
})
|
| 105 |
+
|
| 106 |
+
|
| 107 |
+
|
| 108 |
+
input_scaler = joblib.load("dados/salas/input_scaler_salas_comerciais_2025.save")
|
| 109 |
+
df = input_scaler.transform(df)
|
| 110 |
+
cols = ['FON', 'X', 'Y', 'RH', 'ANO_C', 'ATOTAL', 'A', 'B', 'C', 'D', 'E', 'ANO_2019', 'ANO_2020', 'ANO_2021', 'ANO_2022', 'ANO_2023', 'ANO_2024']
|
| 111 |
+
aval = pd.DataFrame(df, columns = cols)
|
| 112 |
+
df = xgb.DMatrix(aval)
|
| 113 |
+
loaded_model = xgb.Booster()
|
| 114 |
+
loaded_model.load_model("dados/salas/SALAS_COMERCIAIS_2020_a_2025.model")
|
| 115 |
+
pred = loaded_model.predict(df)
|
| 116 |
+
output_scaler = joblib.load("dados/salas/output_scaler_salas_comerciais_2025.save")
|
| 117 |
+
pred = output_scaler.inverse_transform(np.array(pred).reshape(-1,1))
|
| 118 |
+
pred = np.exp(pred)
|
| 119 |
+
|
| 120 |
+
get_report(FON, X, Y, RH, ANO_C, ATOTAL, C, D, E, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, ANO_2024, pred)
|
| 121 |
+
|
| 122 |
+
return f"""R${round(pred[0][0] * ATOTAL, -2)}""", 'report.pdf'
|
| 123 |
+
|
| 124 |
+
def load_inputs():
|
| 125 |
+
FON = gr.Checkbox(label='Fonte (Transação: desmarcar | Oferta: marcar)', value=False)
|
| 126 |
+
X = gr.Number(label='Coordenada X (TM-POA)', value=281554.)
|
| 127 |
+
Y = gr.Number(label='Coordenada Y (TM-POA)', value=1675418.)
|
| 128 |
+
RH = gr.Number(value=120, label='Região Homogênea')
|
| 129 |
+
ANO_C = gr.Number(value=2020, label='Ano de Construção (Conforme Cadastro Imobiliário)')
|
| 130 |
+
ATOTAL = gr.Number(label='Área Total (Conforme Cadastro Imobiliário)', value=60.)
|
| 131 |
+
C = gr.Checkbox(label='Padrão Construtivo C', value=True)
|
| 132 |
+
D = gr.Checkbox(label='Padrão Construtivo D', value=False)
|
| 133 |
+
E = gr.Checkbox(label='Padrão Construtivo E', value=False)
|
| 134 |
+
ANO_2019 = gr.Checkbox(label='Ano 2019 - Carga Geral 2020', value=False)
|
| 135 |
+
ANO_2020 = gr.Checkbox(label='Ano 2020 - Carga Geral 2021', value=False)
|
| 136 |
+
ANO_2021 = gr.Checkbox(label='Ano 2021 - Carga Geral 2022', value=False)
|
| 137 |
+
ANO_2022 = gr.Checkbox(label='Ano 2022 - Carga Geral 2023', value=False)
|
| 138 |
+
ANO_2023 = gr.Checkbox(label='Ano 2023 - Carga Geral 2024', value=False)
|
| 139 |
+
ANO_2024 = gr.Checkbox(label='Ano 2024 - Carga Geral 2025', value=True)
|
| 140 |
+
return [FON, X, Y, RH, ANO_C, ATOTAL, C, D, E, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, ANO_2024]
|
| 141 |
+
|
| 142 |
+
title = 'Salas Comerciais - XGBoost Regressor - 2025'
|
| 143 |
+
|
| 144 |
+
|
| 145 |
+
description = f"""
|
| 146 |
+
# <p style="text-align: center;">Modelo para Salas Comerciais - XGBoost Regressor - 2025</p>
|
| 147 |
+
<p style="text-align: center;">20.545 dados efetivamente utilizados, referentes aos anos 2019 a 2025.</p>
|
| 148 |
+
<hr style="color: #333; background-color: #333; height: 1px; border: none;">
|
| 149 |
+
"""
|