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,
|