ESJL commited on
Commit
cdcce9b
·
verified ·
1 Parent(s): b321220

Upload 14 files

Browse files
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
+ """