File size: 7,412 Bytes
cdcce9b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import openpyxl
import xgboost as xgb
import gradio as gr
import joblib
import pandas as pd
import numpy as np
import seaborn as sns
import statsmodels.api as sm
import matplotlib.pyplot as plt
import io
from sklearn.preprocessing import MinMaxScaler
from reportlab.lib import colors
from reportlab.lib.units import inch
from reportlab.lib.pagesizes import A4, landscape
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.pdfgen.canvas import Canvas
from reportlab.platypus import SimpleDocTemplate, Spacer, Image, Frame, PageTemplate, BaseDocTemplate, Table, Paragraph, NextPageTemplate, PageBreak


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):
    # Define the page size
    pagesize = A4  # You can adjust the page size as needed


    def on_page(canvas, doc):
        page_num = canvas.getPageNumber()
        canvas.drawCentredString(pagesize[0] / 2, 50, str(page_num))

    def on_page_landscape(canvas, doc):
        return on_page(canvas, doc, pagesize=landscape(A4))
        
    padding = dict(
        leftPadding=72, 
        rightPadding=72,
        topPadding=72,
        bottomPadding=18)

    portrait_frame = Frame(0, 0, *A4, **padding)
    landscape_frame = Frame(0, 0, *landscape(A4), **padding)

    portrait_template = PageTemplate(id='portrait', 
                                     frames=portrait_frame,
                                     onPage=on_page,
                                     pagesize=A4)

    landscape_template = PageTemplate(id='landscape', 
                                      frames=landscape_frame,
                                      onPage=on_page_landscape,
                                      pagesize=landscape(A4))

    doc = BaseDocTemplate('report.pdf',
                          pageTemplates=[portrait_template,landscape_template])
    
    styles = getSampleStyleSheet()


    
    story = [
        Image('DAI.png', width=6.4 * inch, height=1.28 * inch),
        Spacer(1, 36),
        Paragraph('Modelo para Salas Comerciais - XGBoost Regressor - 2024', styles['Heading1']),
        Paragraph('Parâmetros do cálculo', styles['Heading2']),
        Paragraph(f"Fonte (Transação ou Oferta): {FON}", styles['Normal']),
        Paragraph(f"Ano de Construção (Conforme Cadastro Imobiliário): {ANO_CONST}", styles['Normal']),
        Paragraph(f"Andar (Conforme Cadastro Imobiliário): {ANDAR}", styles['Normal']),
        Paragraph(f"Coordenada X (TM-POA): {X}", styles['Normal']),
        Paragraph(f"Coordenada Y (TM-POA): {Y}", styles['Normal']),
        Paragraph(f"Área Total (Conforme Cadastro Imobiliário): {ATOTAL}", styles['Normal']),
        Paragraph(f"Região Homogênea: {RH}", styles['Normal']),
        Paragraph(f"Ano 2019 - Exercício Fiscal 2020: {'Sim' if ANO_2019 else 'Não'}", styles['Normal']),
        Paragraph(f"Ano 2020 - Exercício Fiscal 2021: {'Sim' if ANO_2020 else 'Não'}", styles['Normal']),
        Paragraph(f"Ano 2021 - Exercício Fiscal 2022: {'Sim' if ANO_2021 else 'Não'}", styles['Normal']),
        Paragraph(f"Ano 2022 - Exercício Fiscal 2023: {'Sim' if ANO_2022 else 'Não'}", styles['Normal']),
        Paragraph(f"Ano 2023 - Exercício Fiscal 2024: {'Sim' if ANO_2023 else 'Não'}", styles['Normal']),
        Paragraph(f"Padrão Construtivo C: {'Sim' if C else 'Não'}", styles['Normal']),
        Paragraph(f"Padrão Construtivo D: {'Sim' if D else 'Não'}", styles['Normal']),
        Paragraph(f"Padrão Construtivo E: {'Sim' if E else 'Não'}", styles['Normal']),        
        Spacer(1, 36),
        Paragraph('Resultado', styles['Heading1']),
        Paragraph('Valor do imóvel (R$)', styles['Heading2']),
        Paragraph(f"R$ {round(pred[0][0] * ATOTAL, -2)}", styles['Normal']),
    ]
    
    doc.build(story)
  


def execute(FON, ANO_CONST, ANDAR, X, Y, ATOTAL, RH, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, C, D, E):
    df = pd.DataFrame.from_dict({'FON': [FON],
                                 'ANO_CONST': [ANO_CONST], 
                                 'ANDAR': [ANDAR],
                                 'X': [X],
                                 'Y': [Y],
                                 'ATOTAL': np.log(ATOTAL),
                                 'RH': np.log(RH),
                                 'ANO_2019': 1 if ANO_2019 else 0,
                                 'ANO_2020': 1 if ANO_2020 else 0,
                                 'ANO_2021': 1 if ANO_2021 else 0,
                                 'ANO_2022': 1 if ANO_2022 else 0,
                                 'ANO_2023': 1 if ANO_2023 else 0,
                                 'A': 0,
                                 'B': 0,
                                 'C': 1 if C else 0,
                                 'D': 1 if D else 0,
                                 'E': 1 if E else 0,
                                 })



    input_scaler = joblib.load("dados/apartamentos/input_scaler_ape_DEZ2023.save")
    df = input_scaler.transform(df)
    cols = ['FON', 'ANO_CONST', 'ANDAR', 'X', 'Y', 'ATOTAL', 'RH', 'ANO_2019', 'ANO_2020', 'ANO_2021', 'ANO_2022', 'ANO_2023', 'A', 'B', 'C', 'D', 'E']
    aval = pd.DataFrame(df, columns = cols)
    df = xgb.DMatrix(aval)
    loaded_model = xgb.Booster()
    loaded_model.load_model("dados/apartamentos/APARTAMENTO_2020_2021_2022_2023_2024.model")
    pred = loaded_model.predict(df)
    output_scaler = joblib.load("dados/apartamentos/output_scaler_ape_DEZ2023.save")
    pred = output_scaler.inverse_transform(np.array(pred).reshape(-1,1))
    pred = np.exp(pred)

    get_report(FON, ANO_CONST, ANDAR, X, Y, ATOTAL, RH, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, C, D, E, pred)
    
    return f"""R${round(pred[0][0] * ATOTAL, -2)}""", 'report.pdf'

def load_inputs():
    FON = gr.Checkbox(label='Fonte (Transação: desmarcar | Oferta: marcar)', value=False)
    ANO_CONST = gr.Number(value=2020, label='Ano de Construção (Conforme Cadastro Imobiliário)')
    ANDAR = gr.Number(value=4, label='Andar (Conforme Cadastro Imobiliário)')
    X = gr.Number(label='Coordenada X (TM-POA)', value=281554.)
    Y = gr.Number(label='Coordenada Y (TM-POA)', value=1675418.)
    ATOTAL = gr.Number(label='Área Total (Conforme Cadastro Imobiliário)', value=60.)
    RH = gr.Number(value=120, label='Região Homogênea')
    ANO_2019 = gr.Checkbox(label='Ano 2019 - Carga Geral 2020', value=False)
    ANO_2020 = gr.Checkbox(label='Ano 2020 - Carga Geral 2021', value=False)
    ANO_2021 = gr.Checkbox(label='Ano 2021 - Carga Geral 2022', value=False)
    ANO_2022 = gr.Checkbox(label='Ano 2022 - Carga Geral 2023', value=False)
    ANO_2023 = gr.Checkbox(label='Ano 2023 - Carga Geral 2024', value=True)
    C = gr.Checkbox(label='Padrão Construtivo C', value=True)
    D = gr.Checkbox(label='Padrão Construtivo D', value=False)
    E = gr.Checkbox(label='Padrão Construtivo E', value=False)  


    return [FON, ANO_CONST, ANDAR, X, Y, ATOTAL, RH, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, C, D, E]

title = 'Apartamentos - XGBoost Regressor - 2024'


description =  f"""
# <p style="text-align: center;">Modelo para Apartamentos - XGBoost Regressor - 2024</p>
<p style="text-align: center;">39.732 dados efetivamente utilizados, referentes aos anos 2019 a 2023.</p>
<hr style="color: #333; background-color: #333; height: 1px; border: none;">
"""