ESJL commited on
Commit
0681b2e
·
verified ·
1 Parent(s): 3282f9e

Create boxes_2026.py

Browse files
Files changed (1) hide show
  1. boxes_2026.py +153 -0
boxes_2026.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
+ # --- Função de Geração do Relatório PDF ---
20
+ def get_report(ANO_CONST, RH, X, Y, ATOTAL, ANO_2020, ANO_2021, ANO_2022, ANO_2023, ANO_2024, ANO_2025, pred):
21
+ # Define the page size
22
+ pagesize = A4
23
+
24
+ def on_page(canvas, doc):
25
+ page_num = canvas.getPageNumber()
26
+ canvas.drawCentredString(pagesize[0] / 2, 50, str(page_num))
27
+
28
+ def on_page_landscape(canvas, doc):
29
+ return on_page(canvas, doc, pagesize=landscape(A4))
30
+
31
+ padding = dict(
32
+ leftPadding=72,
33
+ rightPadding=72,
34
+ topPadding=72,
35
+ bottomPadding=18)
36
+
37
+ portrait_frame = Frame(0, 0, *A4, **padding)
38
+ landscape_frame = Frame(0, 0, *landscape(A4), **padding)
39
+
40
+ portrait_template = PageTemplate(id='portrait',
41
+ frames=portrait_frame,
42
+ onPage=on_page,
43
+ pagesize=A4)
44
+
45
+ landscape_template = PageTemplate(id='landscape',
46
+ frames=landscape_frame,
47
+ onPage=on_page_landscape,
48
+ pagesize=landscape(A4))
49
+
50
+ doc = BaseDocTemplate('report.pdf',
51
+ pageTemplates=[portrait_template,landscape_template])
52
+
53
+ styles = getSampleStyleSheet()
54
+
55
+ story = [
56
+ # Image('DAI.png', width=6.4 * inch, height=1.28 * inch), # Certifique-se que a imagem existe ou comente
57
+ Spacer(1, 36),
58
+ Paragraph('Modelo para Boxes de Estacionamento - XGBoost Regressor - 2026', styles['Heading1']),
59
+ Paragraph('Parâmetros do cálculo', styles['Heading2']),
60
+ Paragraph(f"Ano de Construção (Conforme Cadastro Imobiliário): {ANO_CONST}", styles['Normal']),
61
+ Paragraph(f"Região Homogênea: {RH}", 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"Área Total (Conforme Cadastro Imobiliário): {ATOTAL}", styles['Normal']),
65
+ Paragraph(f"Ano 2020 - Exercício Fiscal 2021: {'Sim' if ANO_2020 else 'Não'}", styles['Normal']),
66
+ Paragraph(f"Ano 2021 - Exercício Fiscal 2022: {'Sim' if ANO_2021 else 'Não'}", styles['Normal']),
67
+ Paragraph(f"Ano 2022 - Exercício Fiscal 2023: {'Sim' if ANO_2022 else 'Não'}", styles['Normal']),
68
+ Paragraph(f"Ano 2023 - Exercício Fiscal 2024: {'Sim' if ANO_2023 else 'Não'}", styles['Normal']),
69
+ Paragraph(f"Ano 2024 - Exercício Fiscal 2025: {'Sim' if ANO_2024 else 'Não'}", styles['Normal']),
70
+ Paragraph(f"Ano 2025 - Exercício Fiscal 2026: {'Sim' if ANO_2025 else 'Não'}", styles['Normal']),
71
+ Spacer(1, 36),
72
+ Paragraph('Resultado', styles['Heading1']),
73
+ Paragraph('Valor do imóvel (R$)', styles['Heading2']),
74
+ Paragraph(f"R$ {round(pred[0][0] * ATOTAL, -2)}", styles['Normal']),
75
+ ]
76
+
77
+ doc.build(story)
78
+
79
+ # --- Função de Execução do Modelo ---
80
+ def execute(ANO_CONST, RH, X, Y, ATOTAL, ANO_2020, ANO_2021, ANO_2022, ANO_2023, ANO_2024, ANO_2025):
81
+ # Criação do DataFrame incluindo a nova variável ANO_2025
82
+ df = pd.DataFrame.from_dict({'ANO_CONST': [ANO_CONST],
83
+ 'RH': [RH],
84
+ 'X': [X],
85
+ 'Y': [Y],
86
+ 'ATOTAL': np.log(ATOTAL),
87
+ 'ANO_2020': 1 if ANO_2020 else 0,
88
+ 'ANO_2021': 1 if ANO_2021 else 0,
89
+ 'ANO_2022': 1 if ANO_2022 else 0,
90
+ 'ANO_2023': 1 if ANO_2023 else 0,
91
+ 'ANO_2024': 1 if ANO_2024 else 0,
92
+ 'ANO_2025': 1 if ANO_2025 else 0,
93
+ })
94
+
95
+ print("Inputs Recebidos:")
96
+ print(df)
97
+
98
+ # ATENÇÃO: Os arquivos .save e .model abaixo devem ter sido atualizados/treinados
99
+ # contemplando a coluna ANO_2025. Caso contrário, ocorrerá erro de shape.
100
+ input_scaler = joblib.load("dados/boxes/input_scaler_boxes_2025_VU.save")
101
+
102
+ # Transformação
103
+ df_transformed = input_scaler.transform(df)
104
+
105
+ # Definição das colunas para o DMatrix (incluindo a nova)
106
+ cols = ['ANO_CONST', 'RH', 'X', 'Y', 'ATOTAL', 'ANO_2020', 'ANO_2021', 'ANO_2022', 'ANO_2023', 'ANO_2024', 'ANO_2025']
107
+ aval = pd.DataFrame(df_transformed, columns=cols)
108
+
109
+ dmatrix_data = xgb.DMatrix(aval)
110
+
111
+ # Carregamento do Modelo
112
+ loaded_model = xgb.Booster()
113
+ loaded_model.load_model("dados/boxes/boxes_2020_2026.model") # Verificar se o nome do arquivo mudou para 2026
114
+
115
+ # Predição
116
+ pred = loaded_model.predict(dmatrix_data)
117
+
118
+ # Escala de saída
119
+ output_scaler = joblib.load("dados/boxes/output_scaler_boxes_2025_VU.save")
120
+ pred = output_scaler.inverse_transform(np.array(pred).reshape(-1,1))
121
+ pred = np.exp(pred)
122
+
123
+ # Gerar Relatório
124
+ get_report(ANO_CONST, RH, X, Y, ATOTAL, ANO_2020, ANO_2021, ANO_2022, ANO_2023, ANO_2024, ANO_2025, pred)
125
+
126
+ return f"""R${round(pred[0][0] * ATOTAL, -2)}""", 'report.pdf'
127
+
128
+ # --- Configuração dos Inputs do Gradio ---
129
+ def load_inputs():
130
+ ANO_CONST = gr.Number(value=2020, label='Ano de Construção (Conforme Cadastro Imobiliário)')
131
+ RH = gr.Number(value=120, label='Região Homogênea')
132
+ X = gr.Number(label='Coordenada X (TM-POA)', value=281554.)
133
+ Y = gr.Number(label='Coordenada Y (TM-POA)', value=1675418.)
134
+ ATOTAL = gr.Number(label='Área Total (Conforme Cadastro Imobiliário)', value=12.)
135
+
136
+ # Checkboxes para os anos dummies
137
+ ANO_2020 = gr.Checkbox(label='Ano 2020 - Carga Geral 2021', value=False)
138
+ ANO_2021 = gr.Checkbox(label='Ano 2021 - Carga Geral 2022', value=False)
139
+ ANO_2022 = gr.Checkbox(label='Ano 2022 - Carga Geral 2023', value=False)
140
+ ANO_2023 = gr.Checkbox(label='Ano 2023 - Carga Geral 2024', value=False)
141
+ ANO_2024 = gr.Checkbox(label='Ano 2024 - Carga Geral 2025', value=False)
142
+ ANO_2025 = gr.Checkbox(label='Ano 2025 - Carga Geral 2026', value=True) # Definido como True por padrão para o modelo atual
143
+
144
+ return [ANO_CONST, RH, X, Y, ATOTAL, ANO_2020, ANO_2021, ANO_2022, ANO_2023, ANO_2024, ANO_2025]
145
+
146
+ # --- Configurações da Interface ---
147
+ title = 'Boxes - XGBoost Regressor - 2026'
148
+
149
+ description = f"""
150
+ # <p style="text-align: center;">Modelo para Boxes de Estacionamento - XGBoost Regressor - 2026</p>
151
+ <p style="text-align: center;">Dados efetivamente utilizados, referentes aos anos 2019 a 2025.</p>
152
+ <hr style="color: #333; background-color: #333; height: 1px; border: none;">
153
+ """