Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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=['
|
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=['
|
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="
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
146 |
-
|
147 |
else:
|
148 |
-
if
|
149 |
-
coef_pe =
|
150 |
else:
|
151 |
-
if
|
152 |
-
coef_pe = round((
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
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',
|
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.
|
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,
|