DavidSB commited on
Commit
6f32957
1 Parent(s): 736526e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +94 -39
app.py CHANGED
@@ -1,6 +1,7 @@
1
  # importando bibliotecas necessárias
2
  import pandas as pd
3
  import numpy as np
 
4
  import gradio as gr
5
  from gradio import components
6
  from gradio import Interface
@@ -33,21 +34,6 @@ def save_results_to_pdf(results_formatados, intervalo_confiança, valores_finais
33
  # Build the PDF
34
  doc.build(elements)
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
42
- df_html = df.to_html(classes='table table-striped',
43
- table_id='planilha',
44
- escape=False) # Não escapar caracteres especiais
45
- # Use uma div com estilo CSS para permitir a rolagem horizontal
46
- tabela_com_rolagem = f'<div style="overflow-x:auto;">{df_html}</div>'
47
- # Retorna a tabela com rolagem como HTML
48
- return tabela_com_rolagem
49
- except Exception as e:
50
- return f"Erro ao processar o DataFrame: {str(e)}"
51
 
52
  #-----------------#
53
 
@@ -59,7 +45,7 @@ def plotar_mapa_com_dois_dataframes(df1, df2):
59
  lon='lon',
60
  zoom=12.5,
61
  center={"lat": df1['lat'].mean(), "lon": df1['lon'].mean()},
62
- color_discrete_sequence=['#008B8B'],
63
  )
64
  fig1.update_traces(marker=dict(size=10)) # Define o tamanho dos marcadores para o DataFrame 1
65
 
@@ -67,7 +53,7 @@ def plotar_mapa_com_dois_dataframes(df1, df2):
67
  df2,
68
  lat='lat',
69
  lon='lon',
70
- color_discrete_sequence=['orange'],
71
  )
72
  fig2.update_traces(marker=dict(size=20)) # Define o tamanho dos marcadores para o DataFrame 2
73
 
@@ -76,7 +62,7 @@ def plotar_mapa_com_dois_dataframes(df1, df2):
76
  fig1.add_trace(data)
77
  # Personalize o layout do mapa, se desejar
78
  fig1.update_layout(
79
- mapbox_style="carto-positron",
80
  )
81
  # Mostrar o mapa
82
  fig1.show()
@@ -84,6 +70,36 @@ def plotar_mapa_com_dois_dataframes(df1, df2):
84
  return fig1
85
 
86
  #-----------------#
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87
 
88
  # Função de avaliação do imóvel
89
  def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo de imovel',
@@ -99,9 +115,16 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
99
  # fator de atratividade local (fal)
100
  df_transp = df_dados.copy()
101
  df_transp = df_transp[['Atratividade local']]
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)
@@ -113,9 +136,16 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
113
  x_ac = 0.3 * df_avaliando['Área Construída'][0]
114
  # coeficiente n conforme a diferença entre a área do avaliando e dos dados
115
  df_area_const['n'] = df_area_const['dif'].apply(lambda dif: 0.250 if dif <= x_ac else 0.125)
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)
@@ -127,9 +157,16 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
127
  x_at = 0.3 * df_avaliando['Área Terreno'][0]
128
  # coeficiente n conforme a diferença entre a área do avaliando e dos dados
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)
@@ -142,20 +179,23 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
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
 
@@ -410,7 +450,13 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
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
  #-----------------#
@@ -474,6 +520,7 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
474
  #result['fsp'] * \
475
  #result['fex'], 2)
476
  #-----------------#
 
477
 
478
  # RESULTADOS ESTATÍSTICOS INICIAIS
479
  num = len(result)
@@ -496,16 +543,19 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
496
  vc
497
  result['z-score'] = abs((result['Vunit_hom'] - media) / desvio_padrao)
498
  result['Status'] = np.where(result['z-score'] > vc, 'rejeitado', 'aceito')
499
-
500
- # para gerar uma tabela na interface
501
- result_render = renderizar_dataframe(result)
502
 
 
 
 
503
  # DADOS REMOVIDOS
504
  outliers = result[result['Status'] == 'rejeitado']
505
 
506
  # REMOÇÃO DE OUTLIERS PELO CRITÉRIO DE CHAUVENET
507
  result = result[result['Status'] != 'rejeitado']
508
 
 
 
 
509
  # GRAU DE FUNDAMENTAÇÃO
510
 
511
  # item_1 - Graus de Fundamentação (Caracterização do imóvel avaliando)
@@ -811,11 +861,15 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
811
  mapa = plotar_mapa_com_dois_dataframes(result, df_avaliando)
812
  #mapa = criar_mapa(df_avaliando) #novo
813
 
 
 
 
 
 
814
  #-----------------#
815
 
816
  # Salve o DataFrame 'result' em uma planilha
817
  result.to_excel(output_file, index=False)
818
- #result.to_excel('relatório.xlsx', index=False) (substituído pelo código acima)
819
 
820
  #-----------------#
821
 
@@ -825,7 +879,7 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
825
  #-----------------#
826
 
827
  # Retorna tanto a planilha quanto os resultados formatados
828
- return output_file, 'resultados.pdf', result_render, resultados_formatados, intervalo_confiança, valores_finais, mapa #novo
829
 
830
  # Interface do Gradio com input como arquivo XLS ou XLSX
831
  interface = gr.Interface(
@@ -847,11 +901,12 @@ interface = gr.Interface(
847
  outputs=[
848
  gr.components.File(label="Download planilha"),
849
  gr.components.File(label="Download Relatório em PDF"),
850
- gr.components.HTML(label="Resultado Renderizado"),
851
  gr.components.Textbox(label="Resultados estatísticos"),
852
  gr.components.Textbox(label="Intervalo de confiança de 80%"),
853
  gr.components.Textbox(label="Valores Calculados"),
854
  gr.Plot(label="Geolocalização da amostra"),
 
855
 
856
  ],
857
  live=False,
 
1
  # importando bibliotecas necessárias
2
  import pandas as pd
3
  import numpy as np
4
+ import matplotlib.pyplot as plt
5
  import gradio as gr
6
  from gradio import components
7
  from gradio import Interface
 
34
  # Build the PDF
35
  doc.build(elements)
36
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
 
38
  #-----------------#
39
 
 
45
  lon='lon',
46
  zoom=12.5,
47
  center={"lat": df1['lat'].mean(), "lon": df1['lon'].mean()},
48
+ color_discrete_sequence=['blue'],
49
  )
50
  fig1.update_traces(marker=dict(size=10)) # Define o tamanho dos marcadores para o DataFrame 1
51
 
 
53
  df2,
54
  lat='lat',
55
  lon='lon',
56
+ color_discrete_sequence=['red'],
57
  )
58
  fig2.update_traces(marker=dict(size=20)) # Define o tamanho dos marcadores para o DataFrame 2
59
 
 
62
  fig1.add_trace(data)
63
  # Personalize o layout do mapa, se desejar
64
  fig1.update_layout(
65
+ mapbox_style="open-street-map",
66
  )
67
  # Mostrar o mapa
68
  fig1.show()
 
70
  return fig1
71
 
72
  #-----------------#
73
+
74
+ def scatter_plot_with_percent_labels(data):
75
+ # Calcular a média da coluna 'Vunit_hom'
76
+ media = data['Vunit_hom'].mean()
77
+
78
+ # Calcular o percentual de distância à média para cada ponto
79
+ data['Percentual_Distancia'] = ((data['Vunit_hom'] - media) / media) * 100
80
+
81
+ # Criar o gráfico de dispersão em relação à média com rótulos
82
+ plt.figure(figsize=(8, 8)) # Define o tamanho da figura (opcional)
83
+ scatter = plt.scatter(range(len(data)), data['Vunit_hom'], marker='o', s=50, c='black', label='Vunit_hom')
84
+ plt.axhline(y=media, color='red', linestyle='--', label='Média')
85
+
86
+ # Adicionar rótulos com percentual de distância à média
87
+ for i, (x, y, pct) in enumerate(zip(range(len(data)), data['Vunit_hom'], data['Percentual_Distancia'])):
88
+ plt.annotate(f'{pct:.2f}%', (x, y), textcoords="offset points", xytext=(0, 10), ha='center')
89
+
90
+ # Configurações de gráfico
91
+ plt.title('Gráfico de Dispersão em Relação à Média de Vunit_hom com Rótulos de Percentual')
92
+ plt.xlabel('Índice dos Dados')
93
+ plt.ylabel('Vunit_hom')
94
+ plt.legend()
95
+
96
+ # Salvar o gráfico como uma imagem (por exemplo, em formato PNG)
97
+ plt.savefig('scatter_plot.png') # Escolha o nome e o formato do arquivo desejado
98
+ # Mostrar o gráfico
99
+ plt.show()
100
+
101
+ #-----------------#
102
+
103
 
104
  # Função de avaliação do imóvel
105
  def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo de imovel',
 
115
  # fator de atratividade local (fal)
116
  df_transp = df_dados.copy()
117
  df_transp = df_transp[['Atratividade local']]
118
+
119
+ # Verificação se o valor é zero
120
+ if df_avaliando['Atratividade local'][0] == 0:
121
+ df_transp['fal'] = 1
122
+ else:
123
+ df_transp['fal'] = round(df_avaliando['Atratividade local'][0] / df_transp['Atratividade local'], 2)
124
+
125
  df_transp = df_transp[['fal']]
126
 
127
+
128
  #-----------------#
129
 
130
  # fator de correção da área construída (fac)
 
136
  x_ac = 0.3 * df_avaliando['Área Construída'][0]
137
  # coeficiente n conforme a diferença entre a área do avaliando e dos dados
138
  df_area_const['n'] = df_area_const['dif'].apply(lambda dif: 0.250 if dif <= x_ac else 0.125)
139
+
140
+ # Verificação se o valor é zero
141
+ if df_avaliando['Área Construída'][0] == 0:
142
+ df_area_const['fac'] = 1
143
+ else:
144
+ df_area_const['fac'] = round((df_area_const['razao']) ** (df_area_const['n']), 2)
145
+
146
  df_area_const = df_area_const[['fac']]
147
 
148
+
149
  #-----------------#
150
 
151
  # fator de correção da área do terreno (fat)
 
157
  x_at = 0.3 * df_avaliando['Área Terreno'][0]
158
  # coeficiente n conforme a diferença entre a área do avaliando e dos dados
159
  df_area_terreno['n'] = df_area_terreno['dif'].apply(lambda dif: 0.250 if dif <= x_at else 0.125)
160
+
161
+ # Verificação se o valor é zero
162
+ if df_avaliando['Área Terreno'][0] == 0:
163
+ df_area_terreno['fat'] = 1
164
+ else:
165
+ df_area_terreno['fat'] = round((df_area_terreno['razao']) ** (df_area_terreno['n']), 2)
166
+
167
  df_area_terreno = df_area_terreno[['fat']]
168
 
169
+
170
  #-----------------#
171
 
172
  # fator profundidade (fpe)
 
179
  hipotese_1 = A > 5000 and pe > 90
180
  hipotese_2 = A <= 5000 or (A > 5000 and pe <= 90)
181
 
182
+ if t == 0:
183
+ coef_pe = 1
184
  else:
185
+ if finalidade == "Tipologias com área construída":
186
+ coef_pe = 1
187
  else:
188
+ if hipotese_1:
189
+ coef_pe = round(4.8 * (t ** 0.2) * (A ** -0.4), 3)
 
 
 
 
190
  else:
191
+ if pe < 20:
192
+ coef_pe = round((pe/20) ** 0.5, 3)
193
+ elif 20 <= pe < 33:
194
+ coef_pe = 1
195
+ elif 33 <= pe < 90:
196
+ coef_pe = round((33/pe) ** 0.5, 3)
197
+ else:
198
+ coef_pe = 0.6
199
 
200
  return coef_pe
201
 
 
450
  # fator extra (à critério do avaliador) (fex)
451
  df_exc = df_dados.copy()
452
  df_exc = df_exc[['Coeficiente extra']]
453
+
454
+ # Verificação se o valor é zero
455
+ if df_avaliando['Coeficiente extra'][0] == 0:
456
+ df_exc['fex'] = 1
457
+ else:
458
+ df_exc['fex'] = round(df_avaliando['Coeficiente extra'][0] / df_exc['Coeficiente extra'], 2)
459
+
460
  df_exc = df_exc[['fex']]
461
 
462
  #-----------------#
 
520
  #result['fsp'] * \
521
  #result['fex'], 2)
522
  #-----------------#
523
+
524
 
525
  # RESULTADOS ESTATÍSTICOS INICIAIS
526
  num = len(result)
 
543
  vc
544
  result['z-score'] = abs((result['Vunit_hom'] - media) / desvio_padrao)
545
  result['Status'] = np.where(result['z-score'] > vc, 'rejeitado', 'aceito')
 
 
 
546
 
547
+ # cópia para dataframe na interface
548
+ df_interface = result.copy()
549
+
550
  # DADOS REMOVIDOS
551
  outliers = result[result['Status'] == 'rejeitado']
552
 
553
  # REMOÇÃO DE OUTLIERS PELO CRITÉRIO DE CHAUVENET
554
  result = result[result['Status'] != 'rejeitado']
555
 
556
+ # para plotar o gráfico na interface
557
+ df_grafico = result.copy()
558
+
559
  # GRAU DE FUNDAMENTAÇÃO
560
 
561
  # item_1 - Graus de Fundamentação (Caracterização do imóvel avaliando)
 
861
  mapa = plotar_mapa_com_dois_dataframes(result, df_avaliando)
862
  #mapa = criar_mapa(df_avaliando) #novo
863
 
864
+ #-----------------#
865
+
866
+ # para gerar um gráfico de dispersão na interface
867
+ scatter_plot_with_percent_labels(df_grafico)
868
+
869
  #-----------------#
870
 
871
  # Salve o DataFrame 'result' em uma planilha
872
  result.to_excel(output_file, index=False)
 
873
 
874
  #-----------------#
875
 
 
879
  #-----------------#
880
 
881
  # Retorna tanto a planilha quanto os resultados formatados
882
+ return output_file, 'resultados.pdf', df_interface, resultados_formatados, intervalo_confiança, valores_finais, mapa, 'scatter_plot.png'
883
 
884
  # Interface do Gradio com input como arquivo XLS ou XLSX
885
  interface = gr.Interface(
 
901
  outputs=[
902
  gr.components.File(label="Download planilha"),
903
  gr.components.File(label="Download Relatório em PDF"),
904
+ gr.Dataframe(label="Dados homogeneizados"),
905
  gr.components.Textbox(label="Resultados estatísticos"),
906
  gr.components.Textbox(label="Intervalo de confiança de 80%"),
907
  gr.components.Textbox(label="Valores Calculados"),
908
  gr.Plot(label="Geolocalização da amostra"),
909
+ gr.Image(label="Gráfico de dipersão"),
910
 
911
  ],
912
  live=False,