Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -14,7 +14,7 @@ import plotly.express as px
|
|
14 |
|
15 |
#-----------------#
|
16 |
|
17 |
-
#
|
18 |
def save_results_to_pdf(results_formatados, intervalo_confiança, valores_finais):
|
19 |
doc = SimpleDocTemplate("resultados.pdf", pagesize=letter)
|
20 |
styles = getSampleStyleSheet()
|
@@ -35,6 +35,7 @@ def save_results_to_pdf(results_formatados, intervalo_confiança, valores_finais
|
|
35 |
|
36 |
#-----------------#
|
37 |
|
|
|
38 |
def renderizar_dataframe(df):
|
39 |
try:
|
40 |
# Renderize o DataFrame como uma tabela HTML com rolagem horizontal
|
@@ -49,7 +50,8 @@ def renderizar_dataframe(df):
|
|
49 |
return f"Erro ao processar o DataFrame: {str(e)}"
|
50 |
|
51 |
#-----------------#
|
52 |
-
|
|
|
53 |
def plotar_mapa_com_dois_dataframes(df1, df2):
|
54 |
fig1 = px.scatter_mapbox(
|
55 |
df1,
|
@@ -100,7 +102,7 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=10, finalidade='Defina o tip
|
|
100 |
df_transp['fal'] = round(df_avaliando['Atratividade local'][0] / df_transp['Atratividade local'], 2)
|
101 |
df_transp = df_transp[['fal']]
|
102 |
|
103 |
-
|
104 |
|
105 |
# fator de correção da área construída (fac)
|
106 |
df_area_const = df_dados.copy()
|
@@ -114,7 +116,7 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=10, finalidade='Defina o tip
|
|
114 |
df_area_const['fac'] = round((df_area_const['razao']) ** (df_area_const['n']), 2)
|
115 |
df_area_const = df_area_const[['fac']]
|
116 |
|
117 |
-
|
118 |
|
119 |
# fator de correção da área do terreno (fat)
|
120 |
df_area_terreno = df_dados.copy()
|
@@ -127,49 +129,48 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=10, finalidade='Defina o tip
|
|
127 |
df_area_terreno['n'] = df_area_terreno['dif'].apply(lambda dif: 0.250 if dif <= x_at else 0.125)
|
128 |
df_area_terreno['fat'] = round((df_area_terreno['razao']) ** (df_area_terreno['n']), 2)
|
129 |
df_area_terreno = df_area_terreno[['fat']]
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
# fator profundidade (fpe)
|
134 |
-
#
|
135 |
def coeficiente_profundidade(row):
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
|
|
|
|
|
|
145 |
else:
|
146 |
-
if
|
147 |
-
coef_pe = round(
|
|
|
|
|
|
|
|
|
148 |
else:
|
149 |
-
|
150 |
-
coef_pe = round((pe/20) ** 0.5, 3)
|
151 |
-
elif 20 <= pe < 33:
|
152 |
-
coef_pe = 1
|
153 |
-
elif 33 <= pe < 90:
|
154 |
-
coef_pe = round((33/pe) ** 0.5, 3)
|
155 |
-
else:
|
156 |
-
coef_pe = 0.6
|
157 |
-
|
158 |
-
return coef_pe
|
159 |
|
160 |
-
|
|
|
|
|
161 |
df_profundidade = df_dados[['Área Terreno','Testada']].copy()
|
162 |
df_profundidade['coef_pe'] = df_profundidade.apply(coeficiente_profundidade, axis=1)
|
163 |
|
164 |
-
# Crie o DataFrame df_profundidade_aval da mesma maneira, se necessário
|
165 |
df_profundidade_aval = df_avaliando[['Área Terreno','Testada']].copy()
|
166 |
df_profundidade_aval['coef_pe'] = df_profundidade_aval.apply(coeficiente_profundidade, axis=1)
|
167 |
|
168 |
df_profundidade['fpe'] = round(df_profundidade_aval['coef_pe'][0]/df_profundidade['coef_pe'],2)
|
169 |
df_profundidade = df_profundidade[['fpe']]
|
170 |
|
171 |
-
|
172 |
-
|
173 |
# fator topografia (ftp)
|
174 |
# dicionário topografia
|
175 |
dict_topo = {
|
@@ -181,11 +182,10 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=10, finalidade='Defina o tip
|
|
181 |
'não se aplica' : 1,
|
182 |
}
|
183 |
|
184 |
-
#
|
185 |
df_topografia = df_dados.copy()
|
186 |
df_topografia = df_topografia[['Topografia']]
|
187 |
|
188 |
-
# cria dataframe apenas com as colunas necessárias a partir do dataframe do avaliando
|
189 |
df_topografia_aval = df_avaliando.copy()
|
190 |
df_topografia_aval = df_topografia_aval[['Topografia']]
|
191 |
|
@@ -197,36 +197,122 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=10, finalidade='Defina o tip
|
|
197 |
df_topografia_aval['coef_tp'] = df_topografia_aval['Topografia'].apply(mapear_cod_topo)
|
198 |
df_topografia['ftp'] = round(df_topografia_aval['coef_tp'][0]/df_topografia['coef_tp'],2)
|
199 |
df_topografia = df_topografia[['ftp']]
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
#
|
205 |
-
|
|
|
206 |
'plana' : 1.1,
|
207 |
'ondulada': 1.00,
|
208 |
'montanhosa/acidentada': 0.80,
|
209 |
'não se aplica' : 1.00,
|
210 |
}
|
211 |
|
212 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
213 |
df_superficie = df_dados.copy()
|
214 |
df_superficie = df_superficie[['Superfície']]
|
215 |
|
216 |
-
# cria dataframe apenas com as colunas necessárias a partir do dataframe do avaliando
|
217 |
df_superficie_aval = df_avaliando.copy()
|
218 |
df_superficie_aval = df_superficie_aval[['Superfície']]
|
219 |
|
220 |
-
# Função para mapear os valores de
|
221 |
def mapear_cod_sup(superficie):
|
222 |
return dict_sup.get(superficie, 0) # 0 como valor padrão caso a superficie não esteja no dicionário
|
223 |
-
# Aplicando a função para criar a coluna
|
224 |
df_superficie['coef_sp'] = df_superficie['Superfície'].apply(mapear_cod_sup)
|
225 |
df_superficie_aval['coef_sp'] = df_superficie_aval['Superfície'].apply(mapear_cod_sup)
|
226 |
df_superficie['fsp'] = round(df_superficie_aval['coef_sp'][0]/df_superficie['coef_sp'],2)
|
227 |
-
df_superficie = df_superficie[['fsp']]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
228 |
|
229 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
230 |
|
231 |
# fator idade aparente e conservação (fic)
|
232 |
# dicionário padrão construtivo
|
@@ -253,22 +339,23 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=10, finalidade='Defina o tip
|
|
253 |
'id>50_reparos importantes': 0.10,
|
254 |
'não se aplica' : 1,
|
255 |
}
|
256 |
-
#
|
257 |
df_idade_cons = df_dados.copy()
|
258 |
df_idade_cons = df_idade_cons[['Idade aparente e conservação']]
|
259 |
-
|
260 |
df_idade_cons_aval = df_avaliando.copy()
|
261 |
df_idade_cons_aval = df_idade_cons_aval[['Idade aparente e conservação']]
|
|
|
262 |
# Função para mapear os valores de idade aparente e conservação para cod_id_cons usando o dicionário
|
263 |
def mapear_cod_id_cons(id_cons):
|
264 |
-
return dict_ic.get(id_cons, 0)
|
265 |
-
# Aplicando a função para criar a coluna
|
266 |
df_idade_cons['coef_ic'] = df_idade_cons['Idade aparente e conservação'].apply(mapear_cod_id_cons)
|
267 |
df_idade_cons_aval['coef_ic'] = df_idade_cons_aval['Idade aparente e conservação'].apply(mapear_cod_id_cons)
|
268 |
df_idade_cons['fic'] = round(df_idade_cons_aval['coef_ic'][0] / df_idade_cons['coef_ic'],2)
|
269 |
df_idade_cons = df_idade_cons[['fic']]
|
270 |
|
271 |
-
|
272 |
|
273 |
# fator padrão construtivo (fpd)
|
274 |
# dicionário padrão construtivo
|
@@ -285,23 +372,23 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=10, finalidade='Defina o tip
|
|
285 |
'alto_comercial': 1.40,
|
286 |
'não se aplica' : 1,
|
287 |
}
|
288 |
-
|
289 |
-
#
|
290 |
df_padrao = df_dados.copy()
|
291 |
df_padrao = df_padrao[['Padrão construtivo']]
|
292 |
-
|
293 |
df_padrao_aval = df_avaliando.copy()
|
294 |
df_padrao_aval = df_padrao_aval[['Padrão construtivo']]
|
295 |
# Função para mapear os valores de padrão construtivo para cod_pad usando o dicionário
|
296 |
def mapear_cod_pad(padrao):
|
297 |
-
return dict_pad.get(padrao, 0) # 0 como valor padrão caso
|
298 |
-
# Aplicando a função para criar a coluna
|
299 |
df_padrao['coef_pd'] = df_padrao['Padrão construtivo'].apply(mapear_cod_pad)
|
300 |
df_padrao_aval['coef_pd'] = df_padrao_aval['Padrão construtivo'].apply(mapear_cod_pad)
|
301 |
df_padrao['fpd'] = round(df_padrao_aval['coef_pd'][0]/df_padrao['coef_pd'],2)
|
302 |
df_padrao = df_padrao[['fpd']]
|
303 |
|
304 |
-
|
305 |
|
306 |
# fator vagas de estacionamento (fvg)
|
307 |
df_vaga = df_dados[['Vagas']].copy()
|
@@ -314,42 +401,78 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=10, finalidade='Defina o tip
|
|
314 |
return 1
|
315 |
else:
|
316 |
return 1 - 0.067 * dif
|
317 |
-
# Aplicar a função para calcular a coluna '
|
318 |
df_vaga['fvg'] = round(df_vaga.apply(lambda row: calculate_fcg(row['dif'], row['Vagas']), axis=1), 2)
|
319 |
df_vaga = df_vaga[['fvg']]
|
320 |
|
321 |
-
|
322 |
|
323 |
# fator extra (à critério do avaliador) (fex)
|
324 |
df_exc = df_dados.copy()
|
325 |
df_exc = df_exc[['Coeficiente extra']]
|
326 |
df_exc['fex'] = round(df_avaliando['Coeficiente extra'][0] / df_exc['Coeficiente extra'], 2)
|
327 |
df_exc = df_exc[['fex']]
|
328 |
-
|
329 |
-
|
|
|
|
|
330 |
|
331 |
# concatemando o dataframe principal com as dataframes dos fatores
|
332 |
-
result = pd.concat([df_dados, df_transp, df_area_const, df_area_terreno, df_profundidade, df_topografia,
|
|
|
333 |
result['Valor_desc'] = round(result['Valor']*(result['fof']), 2)
|
334 |
if finalidade == "Tipologias com área construída":
|
335 |
result['Vunit'] = round((result['Valor_desc']/result['Área Construída']), 2)
|
336 |
else:
|
337 |
result['Vunit'] = round((result['Valor_desc']/result['Área Terreno']), 2)
|
338 |
-
|
339 |
-
|
340 |
-
|
341 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
342 |
result['Vunit_hom'] = round(result['Vunit'] * result['fal'] * \
|
343 |
-
|
344 |
-
|
345 |
-
|
346 |
-
|
347 |
-
|
348 |
-
|
349 |
-
|
350 |
-
|
351 |
-
|
352 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
353 |
#-----------------#
|
354 |
|
355 |
# RESULTADOS ESTATÍSTICOS INICIAIS
|
@@ -412,8 +535,8 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=10, finalidade='Defina o tip
|
|
412 |
item_3 = 1
|
413 |
|
414 |
# item_4 - Graus de Fundamentação ( Intervalo admissível de ajuste para o conjunto de fatores)
|
415 |
-
max = result.iloc[:,
|
416 |
-
min = result.iloc[:,
|
417 |
if num >= 5:
|
418 |
if min >= 0.8 and max <= 1.2:
|
419 |
item_4 = 3
|
@@ -439,7 +562,7 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=10, finalidade='Defina o tip
|
|
439 |
fundamentacao = "Fora dos critérios"
|
440 |
|
441 |
# RESULTADOS ESTATÍSTICOS FINAIS
|
442 |
-
|
443 |
num = len(result)
|
444 |
dados_outliers = len(outliers)
|
445 |
media = round(result['Vunit_hom'].mean(), 2)
|
@@ -451,7 +574,8 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=10, finalidade='Defina o tip
|
|
451 |
coef_variacao = round((desvio_padrao / media)*100, 2)
|
452 |
# Crie uma string formatada com os RESULTADOS ESTATÍSTICOS FINAIS
|
453 |
resultados_formatados = f"""
|
454 |
-
Número de dados: {
|
|
|
455 |
Valor Crítico (Chauvenet): {vc}
|
456 |
Outliers: {dados_outliers} dado(s)
|
457 |
Média saneada: {media} R$/m²
|
@@ -593,7 +717,10 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=10, finalidade='Defina o tip
|
|
593 |
|
594 |
# Crie um novo DataFrame com os resultados estatísticos
|
595 |
result_estatisticos = pd.DataFrame({
|
596 |
-
'Número de dados': [num],
|
|
|
|
|
|
|
597 |
'Média': [media],
|
598 |
'Valor homogeneizado máximo': [valor_hom_máximo],
|
599 |
'Valor homogeneizado mínimo': [valor_hom_mínimo],
|
@@ -704,22 +831,25 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=10, finalidade='Defina o tip
|
|
704 |
interface = gr.Interface(
|
705 |
fn=avaliacao_imovel,
|
706 |
inputs=[
|
707 |
-
gr.components.File(label="Upload planilha", type="file"),
|
708 |
-
gr.
|
709 |
-
gr.
|
710 |
-
gr.
|
711 |
-
|
712 |
-
|
713 |
-
|
714 |
-
|
715 |
-
|
716 |
-
|
717 |
-
|
|
|
|
|
|
|
718 |
],
|
719 |
outputs=[
|
720 |
gr.components.File(label="Download planilha"),
|
721 |
gr.components.File(label="Download Relatório em PDF"),
|
722 |
-
gr.
|
723 |
gr.components.Textbox(label="Resultados estatísticos"),
|
724 |
gr.components.Textbox(label="Intervalo de confiança de 80%"),
|
725 |
gr.components.Textbox(label="Valores Calculados"),
|
@@ -728,10 +858,10 @@ interface = gr.Interface(
|
|
728 |
],
|
729 |
live=False,
|
730 |
capture_session=True,
|
731 |
-
theme=gr.themes.Soft(),
|
732 |
title="avaliaFACTOR",
|
733 |
description="Aplicativo MCDDM com tratamento por fatores / Faça o upload de uma planilha XLS ou XLSX com os dados / Para um exemplo de estrutura de planilha, você pode baixar <a href='https://huggingface.co/spaces/DavidSB/avaliaFACTOR/resolve/main/dados_entrada_factor.xlsx' download='dados_entrada_factor.xlsx'>aqui</a>.")
|
734 |
|
735 |
# Executar o aplicativo Gradio
|
736 |
if __name__ == "__main__":
|
737 |
-
interface.launch(debug=True)
|
|
|
14 |
|
15 |
#-----------------#
|
16 |
|
17 |
+
#função para relatórios em pdf
|
18 |
def save_results_to_pdf(results_formatados, intervalo_confiança, valores_finais):
|
19 |
doc = SimpleDocTemplate("resultados.pdf", pagesize=letter)
|
20 |
styles = getSampleStyleSheet()
|
|
|
35 |
|
36 |
#-----------------#
|
37 |
|
38 |
+
#função para renderizar um dataframe
|
39 |
def renderizar_dataframe(df):
|
40 |
try:
|
41 |
# Renderize o DataFrame como uma tabela HTML com rolagem horizontal
|
|
|
50 |
return f"Erro ao processar o DataFrame: {str(e)}"
|
51 |
|
52 |
#-----------------#
|
53 |
+
|
54 |
+
#função para criar um mapa no plotly
|
55 |
def plotar_mapa_com_dois_dataframes(df1, df2):
|
56 |
fig1 = px.scatter_mapbox(
|
57 |
df1,
|
|
|
102 |
df_transp['fal'] = round(df_avaliando['Atratividade local'][0] / df_transp['Atratividade local'], 2)
|
103 |
df_transp = df_transp[['fal']]
|
104 |
|
105 |
+
#-----------------#
|
106 |
|
107 |
# fator de correção da área construída (fac)
|
108 |
df_area_const = df_dados.copy()
|
|
|
116 |
df_area_const['fac'] = round((df_area_const['razao']) ** (df_area_const['n']), 2)
|
117 |
df_area_const = df_area_const[['fac']]
|
118 |
|
119 |
+
#-----------------#
|
120 |
|
121 |
# fator de correção da área do terreno (fat)
|
122 |
df_area_terreno = df_dados.copy()
|
|
|
129 |
df_area_terreno['n'] = df_area_terreno['dif'].apply(lambda dif: 0.250 if dif <= x_at else 0.125)
|
130 |
df_area_terreno['fat'] = round((df_area_terreno['razao']) ** (df_area_terreno['n']), 2)
|
131 |
df_area_terreno = df_area_terreno[['fat']]
|
132 |
+
|
133 |
+
#-----------------#
|
134 |
+
|
135 |
# fator profundidade (fpe)
|
136 |
+
# Define a função coeficiente_profundidade antes de criar os DataFrames
|
137 |
def coeficiente_profundidade(row):
|
138 |
+
A = row['Área Terreno']
|
139 |
+
t = row['Testada']
|
140 |
+
|
141 |
+
pe = round(A/t, 2)
|
142 |
+
hipotese_1 = A > 5000 and pe > 90
|
143 |
+
hipotese_2 = A <= 5000 or (A > 5000 and pe <= 90)
|
144 |
+
|
145 |
+
if finalidade == "Tipologias com área construída":
|
146 |
+
coef_pe = 1
|
147 |
+
else:
|
148 |
+
if hipotese_1:
|
149 |
+
coef_pe = round(4.8 * (t ** 0.2) * (A ** -0.4), 3)
|
150 |
else:
|
151 |
+
if pe < 20:
|
152 |
+
coef_pe = round((pe/20) ** 0.5, 3)
|
153 |
+
elif 20 <= pe < 33:
|
154 |
+
coef_pe = 1
|
155 |
+
elif 33 <= pe < 90:
|
156 |
+
coef_pe = round((33/pe) ** 0.5, 3)
|
157 |
else:
|
158 |
+
coef_pe = 0.6
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
159 |
|
160 |
+
return coef_pe
|
161 |
+
|
162 |
+
# Cria os DataFrames df_profundidade e df_profundidade_aval
|
163 |
df_profundidade = df_dados[['Área Terreno','Testada']].copy()
|
164 |
df_profundidade['coef_pe'] = df_profundidade.apply(coeficiente_profundidade, axis=1)
|
165 |
|
|
|
166 |
df_profundidade_aval = df_avaliando[['Área Terreno','Testada']].copy()
|
167 |
df_profundidade_aval['coef_pe'] = df_profundidade_aval.apply(coeficiente_profundidade, axis=1)
|
168 |
|
169 |
df_profundidade['fpe'] = round(df_profundidade_aval['coef_pe'][0]/df_profundidade['coef_pe'],2)
|
170 |
df_profundidade = df_profundidade[['fpe']]
|
171 |
|
172 |
+
#-----------------#
|
173 |
+
|
174 |
# fator topografia (ftp)
|
175 |
# dicionário topografia
|
176 |
dict_topo = {
|
|
|
182 |
'não se aplica' : 1,
|
183 |
}
|
184 |
|
185 |
+
# Cria os DataFrames df_topografia e df_topografia_aval
|
186 |
df_topografia = df_dados.copy()
|
187 |
df_topografia = df_topografia[['Topografia']]
|
188 |
|
|
|
189 |
df_topografia_aval = df_avaliando.copy()
|
190 |
df_topografia_aval = df_topografia_aval[['Topografia']]
|
191 |
|
|
|
197 |
df_topografia_aval['coef_tp'] = df_topografia_aval['Topografia'].apply(mapear_cod_topo)
|
198 |
df_topografia['ftp'] = round(df_topografia_aval['coef_tp'][0]/df_topografia['coef_tp'],2)
|
199 |
df_topografia = df_topografia[['ftp']]
|
200 |
+
|
201 |
+
#-----------------#
|
202 |
+
|
203 |
+
|
204 |
+
# fator relevo (frv)
|
205 |
+
# dicionário relevo
|
206 |
+
dict_rel = {
|
207 |
'plana' : 1.1,
|
208 |
'ondulada': 1.00,
|
209 |
'montanhosa/acidentada': 0.80,
|
210 |
'não se aplica' : 1.00,
|
211 |
}
|
212 |
|
213 |
+
# Cria os DataFrames df_relevo e df_relevo_aval
|
214 |
+
df_relevo = df_dados.copy()
|
215 |
+
df_relevo = df_relevo[['Relevo']]
|
216 |
+
|
217 |
+
df_relevo_aval = df_avaliando.copy()
|
218 |
+
df_relevo_aval = df_relevo_aval[['Relevo']]
|
219 |
+
|
220 |
+
# Função para mapear os valores de Relevo para cod_rel usando o dicionário
|
221 |
+
def mapear_cod_rel(relevo):
|
222 |
+
return dict_rel.get(relevo, 0) # 0 como valor padrão caso o relevo não esteja no dicionário
|
223 |
+
# Aplicando a função para criar a coluna cod_rel em df_dados e df_avaliando
|
224 |
+
df_relevo['coef_rv'] = df_relevo['Relevo'].apply(mapear_cod_rel)
|
225 |
+
df_relevo_aval['coef_rv'] = df_relevo_aval['Relevo'].apply(mapear_cod_rel)
|
226 |
+
df_relevo['frv'] = round(df_relevo_aval['coef_rv'][0]/df_relevo['coef_rv'],2)
|
227 |
+
df_relevo = df_relevo[['frv']]
|
228 |
+
|
229 |
+
#-----------------#
|
230 |
+
|
231 |
+
# fator superfície (fsp)
|
232 |
+
# dicionário superfície
|
233 |
+
dict_sup = {
|
234 |
+
'Seca': 1.00,
|
235 |
+
'Região inundável mas não atingida': 0.90,
|
236 |
+
'Região inundável mas atingida periodicamente': 0.70,
|
237 |
+
'Alagada': 0.60,
|
238 |
+
'não se aplica' : 1.00,
|
239 |
+
}
|
240 |
+
|
241 |
+
# Cria os DataFrames df_superficie e df_superficie_aval
|
242 |
df_superficie = df_dados.copy()
|
243 |
df_superficie = df_superficie[['Superfície']]
|
244 |
|
|
|
245 |
df_superficie_aval = df_avaliando.copy()
|
246 |
df_superficie_aval = df_superficie_aval[['Superfície']]
|
247 |
|
248 |
+
# Função para mapear os valores de Superfície para cod_sup usando o dicionário
|
249 |
def mapear_cod_sup(superficie):
|
250 |
return dict_sup.get(superficie, 0) # 0 como valor padrão caso a superficie não esteja no dicionário
|
251 |
+
# Aplicando a função para criar a coluna cod_sup em df_dados e df_avaliando
|
252 |
df_superficie['coef_sp'] = df_superficie['Superfície'].apply(mapear_cod_sup)
|
253 |
df_superficie_aval['coef_sp'] = df_superficie_aval['Superfície'].apply(mapear_cod_sup)
|
254 |
df_superficie['fsp'] = round(df_superficie_aval['coef_sp'][0]/df_superficie['coef_sp'],2)
|
255 |
+
df_superficie = df_superficie[['fsp']]
|
256 |
+
|
257 |
+
#-----------------#
|
258 |
+
|
259 |
+
# fator aproveitamento (fap)
|
260 |
+
# dicionário aproveitamento
|
261 |
+
dict_apr = {
|
262 |
+
'Loteamento': 1.00,
|
263 |
+
'Indústria': 0.90,
|
264 |
+
'Culturas': 0.80,
|
265 |
+
'não se aplica' : 1.00,
|
266 |
+
}
|
267 |
+
|
268 |
+
# Cria os DataFrames df_aproveitamento e df_aproveitamento_aval
|
269 |
+
df_aproveitamento = df_dados.copy()
|
270 |
+
df_aproveitamento = df_aproveitamento[['Aproveitamento']]
|
271 |
+
|
272 |
+
df_aproveitamento_aval = df_avaliando.copy()
|
273 |
+
df_aproveitamento_aval = df_aproveitamento_aval[['Aproveitamento']]
|
274 |
+
|
275 |
+
# Função para mapear os valores de Aproveitamento para cod_apr usando o dicionário
|
276 |
+
def mapear_cod_apr(aproveitamento):
|
277 |
+
return dict_apr.get(aproveitamento, 0) # 0 como valor padrão caso o aproveitamento não esteja no dicionário
|
278 |
+
# Aplicando a função para criar a coluna cod_apr em df_dados e df_avaliando
|
279 |
+
df_aproveitamento['coef_ap'] = df_aproveitamento['Aproveitamento'].apply(mapear_cod_apr)
|
280 |
+
df_aproveitamento_aval['coef_ap'] = df_aproveitamento_aval['Aproveitamento'].apply(mapear_cod_apr)
|
281 |
+
df_aproveitamento['fap'] = round(df_aproveitamento_aval['coef_ap'][0]/df_aproveitamento['coef_ap'],2)
|
282 |
+
df_aproveitamento = df_aproveitamento[['fap']]
|
283 |
+
|
284 |
+
#-----------------#
|
285 |
+
|
286 |
+
# fator acessibilidade viária (fav)
|
287 |
+
# dicionário acessibilidade
|
288 |
+
dict_ace = {
|
289 |
+
'Ótima': 1.00,
|
290 |
+
'Muito boa': 0.95,
|
291 |
+
'Boa': 0.90,
|
292 |
+
'Desfavorável': 0.80,
|
293 |
+
'Má': 0.75,
|
294 |
+
'Péssima': 0.70,
|
295 |
+
'não se aplica' : 1.00,
|
296 |
+
}
|
297 |
|
298 |
+
# Cria os DataFrames df_acesso e df_acesso_aval
|
299 |
+
df_acesso = df_dados.copy()
|
300 |
+
df_acesso = df_acesso[['Acessibilidade']]
|
301 |
+
|
302 |
+
df_acesso_aval = df_avaliando.copy()
|
303 |
+
df_acesso_aval = df_acesso_aval[['Acessibilidade']]
|
304 |
+
|
305 |
+
# Função para mapear os valores de Acessibilidade para cod_ace usando o dicionário
|
306 |
+
def mapear_cod_ace(acesso):
|
307 |
+
return dict_ace.get(acesso, 0) # 0 como valor padrão caso a acessibilidade não esteja no dicionário
|
308 |
+
# Aplicando a função para criar a coluna cod_ace em df_dados e df_avaliando
|
309 |
+
df_acesso['coef_av'] = df_acesso['Acessibilidade'].apply(mapear_cod_ace)
|
310 |
+
df_acesso_aval['coef_av'] = df_acesso_aval['Acessibilidade'].apply(mapear_cod_ace)
|
311 |
+
df_acesso['fav'] = round(df_acesso_aval['coef_av'][0]/df_acesso['coef_av'],2)
|
312 |
+
df_acesso = df_acesso[['fav']]
|
313 |
+
|
314 |
+
#-----------------#
|
315 |
+
|
316 |
|
317 |
# fator idade aparente e conservação (fic)
|
318 |
# dicionário padrão construtivo
|
|
|
339 |
'id>50_reparos importantes': 0.10,
|
340 |
'não se aplica' : 1,
|
341 |
}
|
342 |
+
# Cria os DataFrames df_idade_cons e df_idade_cons_aval
|
343 |
df_idade_cons = df_dados.copy()
|
344 |
df_idade_cons = df_idade_cons[['Idade aparente e conservação']]
|
345 |
+
|
346 |
df_idade_cons_aval = df_avaliando.copy()
|
347 |
df_idade_cons_aval = df_idade_cons_aval[['Idade aparente e conservação']]
|
348 |
+
|
349 |
# Função para mapear os valores de idade aparente e conservação para cod_id_cons usando o dicionário
|
350 |
def mapear_cod_id_cons(id_cons):
|
351 |
+
return dict_ic.get(id_cons, 0) # 0 como valor padrão caso a Idade e Conservação não esteja no dicionário
|
352 |
+
# Aplicando a função para criar a coluna cod_ic em df_dados e df_avaliando
|
353 |
df_idade_cons['coef_ic'] = df_idade_cons['Idade aparente e conservação'].apply(mapear_cod_id_cons)
|
354 |
df_idade_cons_aval['coef_ic'] = df_idade_cons_aval['Idade aparente e conservação'].apply(mapear_cod_id_cons)
|
355 |
df_idade_cons['fic'] = round(df_idade_cons_aval['coef_ic'][0] / df_idade_cons['coef_ic'],2)
|
356 |
df_idade_cons = df_idade_cons[['fic']]
|
357 |
|
358 |
+
#-----------------#
|
359 |
|
360 |
# fator padrão construtivo (fpd)
|
361 |
# dicionário padrão construtivo
|
|
|
372 |
'alto_comercial': 1.40,
|
373 |
'não se aplica' : 1,
|
374 |
}
|
375 |
+
|
376 |
+
# Cria os DataFrames df_padrao e df_padrao_aval
|
377 |
df_padrao = df_dados.copy()
|
378 |
df_padrao = df_padrao[['Padrão construtivo']]
|
379 |
+
|
380 |
df_padrao_aval = df_avaliando.copy()
|
381 |
df_padrao_aval = df_padrao_aval[['Padrão construtivo']]
|
382 |
# Função para mapear os valores de padrão construtivo para cod_pad usando o dicionário
|
383 |
def mapear_cod_pad(padrao):
|
384 |
+
return dict_pad.get(padrao, 0) # 0 como valor padrão caso o padrão não esteja no dicionário
|
385 |
+
# Aplicando a função para criar a coluna cod_pad em df_dados e df_avaliando
|
386 |
df_padrao['coef_pd'] = df_padrao['Padrão construtivo'].apply(mapear_cod_pad)
|
387 |
df_padrao_aval['coef_pd'] = df_padrao_aval['Padrão construtivo'].apply(mapear_cod_pad)
|
388 |
df_padrao['fpd'] = round(df_padrao_aval['coef_pd'][0]/df_padrao['coef_pd'],2)
|
389 |
df_padrao = df_padrao[['fpd']]
|
390 |
|
391 |
+
#-----------------#
|
392 |
|
393 |
# fator vagas de estacionamento (fvg)
|
394 |
df_vaga = df_dados[['Vagas']].copy()
|
|
|
401 |
return 1
|
402 |
else:
|
403 |
return 1 - 0.067 * dif
|
404 |
+
# Aplicar a função para calcular a coluna 'fvg'
|
405 |
df_vaga['fvg'] = round(df_vaga.apply(lambda row: calculate_fcg(row['dif'], row['Vagas']), axis=1), 2)
|
406 |
df_vaga = df_vaga[['fvg']]
|
407 |
|
408 |
+
#-----------------#
|
409 |
|
410 |
# fator extra (à critério do avaliador) (fex)
|
411 |
df_exc = df_dados.copy()
|
412 |
df_exc = df_exc[['Coeficiente extra']]
|
413 |
df_exc['fex'] = round(df_avaliando['Coeficiente extra'][0] / df_exc['Coeficiente extra'], 2)
|
414 |
df_exc = df_exc[['fex']]
|
415 |
+
|
416 |
+
#-----------------#
|
417 |
+
|
418 |
+
|
419 |
|
420 |
# concatemando o dataframe principal com as dataframes dos fatores
|
421 |
+
result = pd.concat([df_dados, df_transp, df_area_const, df_area_terreno, df_profundidade, df_topografia, df_relevo,
|
422 |
+
df_superficie,df_aproveitamento, df_acesso, df_idade_cons, df_padrao, df_vaga, df_exc], axis=1)
|
423 |
result['Valor_desc'] = round(result['Valor']*(result['fof']), 2)
|
424 |
if finalidade == "Tipologias com área construída":
|
425 |
result['Vunit'] = round((result['Valor_desc']/result['Área Construída']), 2)
|
426 |
else:
|
427 |
result['Vunit'] = round((result['Valor_desc']/result['Área Terreno']), 2)
|
428 |
+
|
429 |
+
result = result[['lat','lon','Atratividade local', 'Área Construída', 'Área Terreno', 'Testada', 'Topografia',
|
430 |
+
'Relevo','Superfície','Aproveitamento','Acessibilidade', 'Idade aparente e conservação', 'Padrão construtivo', 'Vagas',
|
431 |
+
'Coeficiente extra', 'Valor', 'fof','Valor_desc', 'Vunit','fal', 'fac', 'fat','fpe', 'ftp','frv','fsp',
|
432 |
+
'fap','fav', 'fic','fpd', 'fvg', 'fex']]
|
433 |
+
|
434 |
+
#if finalidade == "Tipologias com área construída":
|
435 |
+
|
436 |
+
#result = result[['lat','lon','Atratividade local', 'Área Construída', 'Área Terreno',
|
437 |
+
#'Idade aparente e conservação', 'Padrão construtivo', 'Vagas','Coeficiente extra', 'Valor',
|
438 |
+
#'fof','Valor_desc', 'Vunit','fal', 'fac', 'fat', 'fic','fpd', 'fvg', 'fex']]
|
439 |
+
#else:
|
440 |
+
|
441 |
+
#result = result[['lat','lon','Atratividade local', 'Área Terreno', 'Testada', 'Topografia', 'Superfície',
|
442 |
+
#'Coeficiente extra', 'Valor', 'fof','Valor_desc','Vunit','fal', 'fat','fpe', 'ftp','fsp', 'fex']]
|
443 |
+
|
444 |
+
|
445 |
result['Vunit_hom'] = round(result['Vunit'] * result['fal'] * \
|
446 |
+
result['fac'] * \
|
447 |
+
result['fat'] * \
|
448 |
+
result['fpe'] * \
|
449 |
+
result['ftp'] * \
|
450 |
+
result['frv'] * \
|
451 |
+
result['fsp'] * \
|
452 |
+
result['fap'] * \
|
453 |
+
result['fav'] * \
|
454 |
+
result['fic'] * \
|
455 |
+
result['fpd'] * \
|
456 |
+
result['fvg'] * \
|
457 |
+
result['fex'], 2)
|
458 |
+
|
459 |
+
|
460 |
+
#if finalidade == "Tipologias com área construída":
|
461 |
+
#result['Vunit_hom'] = round(result['Vunit'] * result['fal'] * \
|
462 |
+
#result['fac'] * \
|
463 |
+
#result['fat'] * \
|
464 |
+
#result['fic'] * \
|
465 |
+
#result['fpd'] * \
|
466 |
+
#result['fvg'] * \
|
467 |
+
#result['fex'], 2)
|
468 |
+
|
469 |
+
#else:
|
470 |
+
#result['Vunit_hom'] = round(result['Vunit'] * result['fal'] * \
|
471 |
+
#result['fat'] * \
|
472 |
+
#result['fpe'] * \
|
473 |
+
#result['ftp'] * \
|
474 |
+
#result['fsp'] * \
|
475 |
+
#result['fex'], 2)
|
476 |
#-----------------#
|
477 |
|
478 |
# RESULTADOS ESTATÍSTICOS INICIAIS
|
|
|
535 |
item_3 = 1
|
536 |
|
537 |
# item_4 - Graus de Fundamentação ( Intervalo admissível de ajuste para o conjunto de fatores)
|
538 |
+
max = result.iloc[:, 19:32].max().max()
|
539 |
+
min = result.iloc[:, 19:32].min().min()
|
540 |
if num >= 5:
|
541 |
if min >= 0.8 and max <= 1.2:
|
542 |
item_4 = 3
|
|
|
562 |
fundamentacao = "Fora dos critérios"
|
563 |
|
564 |
# RESULTADOS ESTATÍSTICOS FINAIS
|
565 |
+
num_dados = len(df_dados)
|
566 |
num = len(result)
|
567 |
dados_outliers = len(outliers)
|
568 |
media = round(result['Vunit_hom'].mean(), 2)
|
|
|
574 |
coef_variacao = round((desvio_padrao / media)*100, 2)
|
575 |
# Crie uma string formatada com os RESULTADOS ESTATÍSTICOS FINAIS
|
576 |
resultados_formatados = f"""
|
577 |
+
Número de dados iniciais: {num_dados} dados
|
578 |
+
Número de dados utilizados: {num} dados
|
579 |
Valor Crítico (Chauvenet): {vc}
|
580 |
Outliers: {dados_outliers} dado(s)
|
581 |
Média saneada: {media} R$/m²
|
|
|
717 |
|
718 |
# Crie um novo DataFrame com os resultados estatísticos
|
719 |
result_estatisticos = pd.DataFrame({
|
720 |
+
'Número de dados iniciais': [num],
|
721 |
+
'Número de dados utilizados': [num_dados],
|
722 |
+
'Valor Crítico (Chauvenet)': [vc],
|
723 |
+
'Outliers': [dados_outliers],
|
724 |
'Média': [media],
|
725 |
'Valor homogeneizado máximo': [valor_hom_máximo],
|
726 |
'Valor homogeneizado mínimo': [valor_hom_mínimo],
|
|
|
831 |
interface = gr.Interface(
|
832 |
fn=avaliacao_imovel,
|
833 |
inputs=[
|
834 |
+
gr.components.File(label="Upload planilha", type="file", info="Importação de planilha padrão com o avaliando e os dados"),
|
835 |
+
#gr.components.Number(label="Número de linhas desejadas", default=10),
|
836 |
+
gr.Slider(5, 30, value=10, label="Número de dados", info="Escolha o número de dados", step=1),
|
837 |
+
#gr.components.Dropdown(label="Tipo de imóvel", choices=["Terrenos e glebas","Tipologias com área construída"], default="Tipologias com área construída"),
|
838 |
+
gr.Radio(["Terrenos e glebas", "Tipologias com área construída"], label="Tipo de Imóvel", info="Escolha o tipo de imóvel"),
|
839 |
+
gr.Radio(["Completa p/ todos fatores analisados", "Completa p/ os fatores utilizados", "Situação paradigma"],
|
840 |
+
label="Caracterização do avaliando", info="Para enquadramento quanto a fundamentação - ítem 1 da tabela 6 do anexo 2 - NBR 14.653-2"),
|
841 |
+
|
842 |
+
|
843 |
+
gr.Radio(["Apresentação de informações relativas a todas as características dos dados analisados, com foto e características observadas pelo autor do laudo",
|
844 |
+
"Apresentação de informações relativas a todas as características dos dados analisados",
|
845 |
+
"Apresentação de informações relativas a todas as características dos dados correspondentes aos fatores analisados"],
|
846 |
+
label="Identificação dos dados",info="Para enquadramento quanto a fundamentação - ítem 3 da tabela 6 do anexo 2 - NBR 14.653-2",
|
847 |
+
)
|
848 |
],
|
849 |
outputs=[
|
850 |
gr.components.File(label="Download planilha"),
|
851 |
gr.components.File(label="Download Relatório em PDF"),
|
852 |
+
gr.components.HTML(label="Resultado Renderizado"),
|
853 |
gr.components.Textbox(label="Resultados estatísticos"),
|
854 |
gr.components.Textbox(label="Intervalo de confiança de 80%"),
|
855 |
gr.components.Textbox(label="Valores Calculados"),
|
|
|
858 |
],
|
859 |
live=False,
|
860 |
capture_session=True,
|
861 |
+
#theme=gr.themes.Soft(),
|
862 |
title="avaliaFACTOR",
|
863 |
description="Aplicativo MCDDM com tratamento por fatores / Faça o upload de uma planilha XLS ou XLSX com os dados / Para um exemplo de estrutura de planilha, você pode baixar <a href='https://huggingface.co/spaces/DavidSB/avaliaFACTOR/resolve/main/dados_entrada_factor.xlsx' download='dados_entrada_factor.xlsx'>aqui</a>.")
|
864 |
|
865 |
# Executar o aplicativo Gradio
|
866 |
if __name__ == "__main__":
|
867 |
+
interface.launch(debug=True)
|