ESJL commited on
Commit
810ab08
·
verified ·
1 Parent(s): aace717

Create boxes_2024.py

Browse files
Files changed (1) hide show
  1. boxes_2024.py +132 -0
boxes_2024.py ADDED
@@ -0,0 +1,132 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ def get_report(ANO_CONST, RH, X, Y, ATOTAL, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, pred):
20
+ # Define the page size
21
+ pagesize = A4 # You can adjust the page size as needed
22
+
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),
57
+ Spacer(1, 36),
58
+ Paragraph('Modelo para Boxes de Estacionamento - XGBoost Regressor - 2024', 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 2019 - Exercício Fiscal 2020: {'Sim' if ANO_2019 else 'Não'}", styles['Normal']),
66
+ Paragraph(f"Ano 2020 - Exercício Fiscal 2021: {'Sim' if ANO_2020 else 'Não'}", styles['Normal']),
67
+ Paragraph(f"Ano 2021 - Exercício Fiscal 2022: {'Sim' if ANO_2021 else 'Não'}", styles['Normal']),
68
+ Paragraph(f"Ano 2022 - Exercício Fiscal 2023: {'Sim' if ANO_2022 else 'Não'}", styles['Normal']),
69
+ Paragraph(f"Ano 2023 - Exercício Fiscal 2024: {'Sim' if ANO_2023 else 'Não'}", styles['Normal']),
70
+ Spacer(1, 36),
71
+ Paragraph('Resultado', styles['Heading1']),
72
+ Paragraph('Valor do imóvel (R$)', styles['Heading2']),
73
+ Paragraph(f"R$ {round(pred[0][0] * ATOTAL, -2)}", styles['Normal']),
74
+ ]
75
+
76
+ doc.build(story)
77
+
78
+
79
+
80
+ def execute(ANO_CONST, RH, X, Y, ATOTAL, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023):
81
+ df = pd.DataFrame.from_dict({'ANO_CONST': [ANO_CONST],
82
+ 'RH': [RH],
83
+ 'X': [X],
84
+ 'Y': [Y],
85
+ 'ATOTAL': np.log(ATOTAL),
86
+ 'ANO_2019': 1 if ANO_2019 else 0,
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
+ })
92
+
93
+ print(df)
94
+ print(ATOTAL)
95
+
96
+ input_scaler = joblib.load("dados/boxes/input_scaler_boxes_2023_VU_v3.save")
97
+ df = input_scaler.transform(df)
98
+ cols = ['ANO_CONST', 'RH', 'X', 'Y', 'ATOTAL', 'ANO_2019', 'ANO_2020', 'ANO_2021', 'ANO_2022', 'ANO_2023']
99
+ aval = pd.DataFrame(df, columns = cols)
100
+ df = xgb.DMatrix(aval)
101
+ loaded_model = xgb.Booster()
102
+ loaded_model.load_model("dados/boxes/boxes_2020_2021_2022_2023_2024_VU_v3.model")
103
+ pred = loaded_model.predict(df)
104
+ output_scaler = joblib.load("dados/boxes/output_scaler_boxes_2023_VU_v3.save")
105
+ pred = output_scaler.inverse_transform(np.array(pred).reshape(-1,1))
106
+ pred = np.exp(pred)
107
+
108
+ get_report(ANO_CONST, RH, X, Y, ATOTAL, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, pred)
109
+
110
+ return f"""R${round(pred[0][0] * ATOTAL, -2)}""", 'report.pdf'
111
+
112
+ def load_inputs():
113
+ ANO_CONST = gr.Number(value=2020, label='Ano de Construção (Conforme Cadastro Imobiliário)')
114
+ RH = gr.Number(value=120, label='Região Homogênea')
115
+ X = gr.Number(label='Coordenada X (TM-POA)', value=281554.)
116
+ Y = gr.Number(label='Coordenada Y (TM-POA)', value=1675418.)
117
+ ATOTAL = gr.Number(label='Área Total (Conforme Cadastro Imobiliário)', value=12.)
118
+ ANO_2019 = gr.Checkbox(label='Ano 2019 - Carga Geral 2020', value=False)
119
+ ANO_2020 = gr.Checkbox(label='Ano 2020 - Carga Geral 2021', value=False)
120
+ ANO_2021 = gr.Checkbox(label='Ano 2021 - Carga Geral 2022', value=False)
121
+ ANO_2022 = gr.Checkbox(label='Ano 2022 - Carga Geral 2023', value=False)
122
+ ANO_2023 = gr.Checkbox(label='Ano 2023 - Carga Geral 2024', value=True)
123
+ return [ANO_CONST, RH, X, Y, ATOTAL, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023]
124
+
125
+ title = 'Boxes - XGBoost Regressor - 2024'
126
+
127
+
128
+ description = f"""
129
+ # <p style="text-align: center;">Modelo para Boxes de Estacionamento - XGBoost Regressor - 2024</p>
130
+ <p style="text-align: center;">7.479 dados efetivamente utilizados, referentes aos anos 2019 a 2023.</p>
131
+ <hr style="color: #333; background-color: #333; height: 1px; border: none;">
132
+ """