DavidSB commited on
Commit
f55356d
1 Parent(s): ba28f8d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +226 -96
app.py CHANGED
@@ -14,7 +14,7 @@ import plotly.express as px
14
 
15
  #-----------------#
16
 
17
- # Function to save results in a PDF file
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
- # Defina a função coeficiente_profundidade antes de criar os DataFrames
135
  def coeficiente_profundidade(row):
136
- A = row['Área Terreno']
137
- t = row['Testada']
138
-
139
- pe = round(A/t, 2)
140
- hipotese_1 = A > 5000 and pe > 90
141
- hipotese_2 = A <= 5000 or (A > 5000 and pe <= 90)
142
-
143
- if finalidade == "Tipologias com área construída":
144
- coef_pe = 1
 
 
 
145
  else:
146
- if hipotese_1:
147
- coef_pe = round(4.8 * (t ** 0.2) * (A ** -0.4), 3)
 
 
 
 
148
  else:
149
- if pe < 20:
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
- # Crie os DataFrames df_profundidade e df_profundidade_aval
 
 
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
- # cria dataframe apenas com as colunas necessárias a partir do dataframe dos dados
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
- # fator superfície (fsp)
204
- # dicionário topografia
205
- dict_sup = {
 
206
  'plana' : 1.1,
207
  'ondulada': 1.00,
208
  'montanhosa/acidentada': 0.80,
209
  'não se aplica' : 1.00,
210
  }
211
 
212
- # cria dataframe apenas com as colunas necessárias a partir do dataframe dos dados
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 Topografia para cod_topo usando o dicionário
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 cod_topo em df_dados e df_avaliando
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
- # cria dataframe apenas com as colunas necessárias a partir do dataframe dos dados
257
  df_idade_cons = df_dados.copy()
258
  df_idade_cons = df_idade_cons[['Idade aparente e conservação']]
259
- # cria dataframe apenas com as colunas necessárias a partir do dataframe do avaliando
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 cod_topo em df_dados e df_avaliando
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
- # cria dataframe apenas com as colunas necessárias a partir do dataframe dos dados
290
  df_padrao = df_dados.copy()
291
  df_padrao = df_padrao[['Padrão construtivo']]
292
- # cria dataframe apenas com as colunas necessárias a partir do dataframe do avaliando
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 a topografia não esteja no dicionário
298
- # Aplicando a função para criar a coluna cod_topo em df_dados e df_avaliando
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 'fcg'
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, df_superficie, df_idade_cons, df_padrao, df_vaga, df_exc], axis=1)
 
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
- result = result[['lat','lon','Atratividade local', 'Área Construída', 'Área Terreno', 'Testada', 'Topografia', 'Superfície',
339
- 'Idade aparente e conservação', 'Padrão construtivo', 'Vagas',
340
- 'Coeficiente extra', 'Valor', 'fof','Valor_desc', 'Vunit','fal', 'fac', 'fat','fpe', 'ftp','fsp', 'fic',
341
- 'fpd', 'fvg', 'fex']]
 
 
 
 
 
 
 
 
 
 
 
 
 
342
  result['Vunit_hom'] = round(result['Vunit'] * result['fal'] * \
343
- result['fac'] * \
344
- result['fat'] * \
345
- result['fpe'] * \
346
- result['ftp'] * \
347
- result['fsp'] * \
348
- result['fic'] * \
349
- result['fpd'] * \
350
- result['fvg'] * \
351
- result['fex'], 2)
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[:, 16:26].max().max()
416
- min = result.iloc[:, 16:26].min().min()
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: {num} 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.inputs.Number(label="Número de linhas desejadas", default=10),
709
- gr.inputs.Dropdown(label="Tipo de imóvel", choices=["Terrenos e glebas","Tipologias com área construída"],default="Tipologias com área construída"),
710
- gr.inputs.Dropdown(label="Caracterização do avaliando - Grau de Fundamentação", choices=["Completa quanto a todos os fatores analisados",
711
- "Completa quanto aos fatores utilizados no tratamento",
712
- "Adoção de situação paradigma"],
713
- default="Adoção de situação paradigma"),
714
- gr.inputs.Dropdown(label="Identificação dos dados - Grau de Fundamentação", choices=["Apresentação de informações relativas a todas as características dos dados analisados, com foto e características observadas pelo autor do laudo",
715
- "Apresentação de informações relativas a todas as características dos dados analisados",
716
- "Apresentação de informações relativas a todas as características dos dados correspondentes aos fatores analisados"],
717
- default="Apresentação de informações relativas a todas as características dos dados correspondentes aos fatores analisados")
 
 
 
718
  ],
719
  outputs=[
720
  gr.components.File(label="Download planilha"),
721
  gr.components.File(label="Download Relatório em PDF"),
722
- gr.outputs.HTML(label="Resultado Renderizado"),
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)