Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -6,49 +6,18 @@ import gradio as gr
|
|
6 |
from gradio import components
|
7 |
from gradio import Interface
|
8 |
import xlsxwriter
|
9 |
-
from reportlab.lib.units import inch
|
10 |
-
from reportlab.lib.pagesizes import letter
|
11 |
-
from reportlab.platypus import SimpleDocTemplate, Spacer, Image, Frame, PageTemplate, BaseDocTemplate, Table, Paragraph, NextPageTemplate, PageBreak
|
12 |
-
from reportlab.lib.styles import getSampleStyleSheet
|
13 |
import shutil
|
14 |
import os
|
15 |
import plotly.express as px
|
16 |
import ast
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
|
18 |
#-----------------#
|
19 |
-
|
20 |
-
#função para relatórios em pdf
|
21 |
-
def save_results_to_pdf(results_formatados, intervalo_confiança, valores_finais, image):
|
22 |
-
doc = SimpleDocTemplate("resultados.pdf", pagesize=letter)
|
23 |
-
styles = getSampleStyleSheet()
|
24 |
-
story = [
|
25 |
-
Image('avaliase.jpg', width=3.33 * inch, height=1.28 * inch),
|
26 |
-
Spacer(1, 36),
|
27 |
-
Paragraph('Relatório', styles['Heading1']),
|
28 |
-
Spacer(1, 36),
|
29 |
-
Paragraph('Resultados Estatísticos', styles['Heading2'])]
|
30 |
-
|
31 |
-
lines = results_formatados.splitlines()
|
32 |
-
# Create a paragraph for each line
|
33 |
-
for line in lines:
|
34 |
-
story.append(Paragraph(line, styles['Normal']))
|
35 |
-
story.append(Spacer(1, 36))
|
36 |
-
story.append(Paragraph('Intervalo de Confiança', styles['Heading2']))
|
37 |
-
lines = intervalo_confiança.splitlines()
|
38 |
-
for line in lines:
|
39 |
-
story.append(Paragraph(line, styles['Normal']))
|
40 |
-
story.append(Spacer(1, 36))
|
41 |
-
story.append(Paragraph('Valores Finais', styles['Heading2']))
|
42 |
-
lines = valores_finais.splitlines()
|
43 |
-
for line in lines:
|
44 |
-
story.append(Paragraph(line, styles['Normal']))
|
45 |
-
story.append(Spacer(1, 36))
|
46 |
-
story.append(Image('scatter_plot.png', width=4 * inch, height=4 * inch))
|
47 |
-
|
48 |
-
doc.build(story)
|
49 |
-
|
50 |
-
|
51 |
-
#-----------------#
|
52 |
|
53 |
#função para criar um mapa no plotly
|
54 |
def plotar_mapa_com_dois_dataframes(df1, df2):
|
@@ -79,12 +48,15 @@ def plotar_mapa_com_dois_dataframes(df1, df2):
|
|
79 |
)
|
80 |
# Mostrar o mapa
|
81 |
fig1.show()
|
|
|
|
|
|
|
82 |
|
83 |
-
return fig1
|
84 |
|
85 |
#-----------------#
|
86 |
|
87 |
-
|
88 |
def grafico_barras(data):
|
89 |
# Calcular a média da coluna 'Vunit_hom'
|
90 |
media = data['Vunit_hom'].mean()
|
@@ -113,12 +85,15 @@ def grafico_barras(data):
|
|
113 |
|
114 |
#-----------------#
|
115 |
|
116 |
-
|
117 |
-
# Função de avaliação do imóvel
|
118 |
def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo de imovel',
|
119 |
-
|
|
|
|
|
|
|
|
|
120 |
|
121 |
-
|
|
|
122 |
|
123 |
# Lendo a aba 'avaliando' da planilha
|
124 |
df_avaliando = pd.read_excel(planilha.name, 'avaliando')
|
@@ -133,7 +108,7 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
133 |
# Excluindo a coluna 'Coordenadas' se você não precisar dela mais
|
134 |
df_avaliando = df_avaliando.drop('Coordenadas', axis=1)
|
135 |
|
136 |
-
|
137 |
|
138 |
# Lendo a aba 'dados' da planilha, limitando o número de linhas
|
139 |
df_dados = pd.read_excel(planilha.name, 'dados').iloc[:int(num_linhas_desejadas)]
|
@@ -145,11 +120,10 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
145 |
df_dados['lat'] = df_dados['Coordenadas'].apply(lambda x: round(x[0], 5) if not pd.isna(x) else np.nan)
|
146 |
df_dados['lon'] = df_dados['Coordenadas'].apply(lambda x: round(x[1], 5) if not pd.isna(x) else np.nan)
|
147 |
|
148 |
-
# Excluindo a coluna 'Coordenadas'
|
149 |
df_dados = df_dados.drop('Coordenadas', axis=1)
|
150 |
|
151 |
-
|
152 |
-
|
153 |
|
154 |
# fator de atratividade local (fal)
|
155 |
df_transp = df_dados.copy()
|
@@ -163,8 +137,7 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
163 |
|
164 |
df_transp = df_transp[['fal']]
|
165 |
|
166 |
-
|
167 |
-
#-----------------#
|
168 |
|
169 |
# fator de correção da área construída (fac)
|
170 |
df_area_const = df_dados.copy()
|
@@ -184,8 +157,7 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
184 |
|
185 |
df_area_const = df_area_const[['fac']]
|
186 |
|
187 |
-
|
188 |
-
#-----------------#
|
189 |
|
190 |
# fator de correção da área do terreno (fat)
|
191 |
df_area_terreno = df_dados.copy()
|
@@ -205,8 +177,7 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
205 |
|
206 |
df_area_terreno = df_area_terreno[['fat']]
|
207 |
|
208 |
-
|
209 |
-
#-----------------#
|
210 |
|
211 |
# fator profundidade (fpe)
|
212 |
# Define a função coeficiente_profundidade antes de criar os DataFrames
|
@@ -248,7 +219,7 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
248 |
df_profundidade['fpe'] = round(df_profundidade_aval['coef_pe'][0]/df_profundidade['coef_pe'],2)
|
249 |
df_profundidade = df_profundidade[['fpe']]
|
250 |
|
251 |
-
|
252 |
|
253 |
# fator topografia (ftp)
|
254 |
# dicionário topografia
|
@@ -277,8 +248,7 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
277 |
df_topografia['ftp'] = round(df_topografia_aval['coef_tp'][0]/df_topografia['coef_tp'],2)
|
278 |
df_topografia = df_topografia[['ftp']]
|
279 |
|
280 |
-
|
281 |
-
|
282 |
|
283 |
# fator relevo (frv)
|
284 |
# dicionário relevo
|
@@ -305,7 +275,7 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
305 |
df_relevo['frv'] = round(df_relevo_aval['coef_rv'][0]/df_relevo['coef_rv'],2)
|
306 |
df_relevo = df_relevo[['frv']]
|
307 |
|
308 |
-
|
309 |
|
310 |
# fator superfície (fsp)
|
311 |
# dicionário superfície
|
@@ -333,7 +303,7 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
333 |
df_superficie['fsp'] = round(df_superficie_aval['coef_sp'][0]/df_superficie['coef_sp'],2)
|
334 |
df_superficie = df_superficie[['fsp']]
|
335 |
|
336 |
-
|
337 |
|
338 |
# fator aproveitamento (fap)
|
339 |
# dicionário aproveitamento
|
@@ -360,7 +330,7 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
360 |
df_aproveitamento['fap'] = round(df_aproveitamento_aval['coef_ap'][0]/df_aproveitamento['coef_ap'],2)
|
361 |
df_aproveitamento = df_aproveitamento[['fap']]
|
362 |
|
363 |
-
|
364 |
|
365 |
# fator acessibilidade viária (fav)
|
366 |
# dicionário acessibilidade
|
@@ -390,8 +360,7 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
390 |
df_acesso['fav'] = round(df_acesso_aval['coef_av'][0]/df_acesso['coef_av'],2)
|
391 |
df_acesso = df_acesso[['fav']]
|
392 |
|
393 |
-
|
394 |
-
|
395 |
|
396 |
# fator idade aparente e conservação (fic)
|
397 |
# dicionário padrão construtivo
|
@@ -434,7 +403,7 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
434 |
df_idade_cons['fic'] = round(df_idade_cons_aval['coef_ic'][0] / df_idade_cons['coef_ic'],2)
|
435 |
df_idade_cons = df_idade_cons[['fic']]
|
436 |
|
437 |
-
|
438 |
|
439 |
# fator padrão construtivo (fpd)
|
440 |
# dicionário padrão construtivo
|
@@ -467,7 +436,7 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
467 |
df_padrao['fpd'] = round(df_padrao_aval['coef_pd'][0]/df_padrao['coef_pd'],2)
|
468 |
df_padrao = df_padrao[['fpd']]
|
469 |
|
470 |
-
|
471 |
|
472 |
# fator vagas de estacionamento (fvg)
|
473 |
df_vaga = df_dados[['Vagas']].copy()
|
@@ -484,7 +453,7 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
484 |
df_vaga['fvg'] = round(df_vaga.apply(lambda row: calculate_fcg(row['dif'], row['Vagas']), axis=1), 2)
|
485 |
df_vaga = df_vaga[['fvg']]
|
486 |
|
487 |
-
|
488 |
|
489 |
# fator extra (à critério do avaliador) (fex)
|
490 |
df_exc = df_dados.copy()
|
@@ -498,11 +467,9 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
498 |
|
499 |
df_exc = df_exc[['fex']]
|
500 |
|
501 |
-
|
502 |
-
|
503 |
-
|
504 |
|
505 |
-
|
506 |
result = pd.concat([df_dados, df_transp, df_area_const, df_area_terreno, df_profundidade, df_topografia, df_relevo,
|
507 |
df_superficie,df_aproveitamento, df_acesso, df_idade_cons, df_padrao, df_vaga, df_exc], axis=1)
|
508 |
result['Valor_desc'] = round(result['Valor']*(result['fof']), 2)
|
@@ -518,16 +485,6 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
518 |
'Coeficiente extra', 'Valor', 'fof','Valor_desc', 'Vunit','fal', 'fac', 'fat','fpe', 'ftp','frv','fsp',
|
519 |
'fap','fav', 'fic','fpd', 'fvg', 'fex']]
|
520 |
|
521 |
-
#if finalidade == "Tipologias com área construída":
|
522 |
-
|
523 |
-
#result = result[['lat','lon','Atratividade local', 'Área Construída', 'Área Terreno',
|
524 |
-
#'Idade aparente e conservação', 'Padrão construtivo', 'Vagas','Coeficiente extra', 'Valor',
|
525 |
-
#'fof','Valor_desc', 'Vunit','fal', 'fac', 'fat', 'fic','fpd', 'fvg', 'fex']]
|
526 |
-
#else:
|
527 |
-
|
528 |
-
#result = result[['lat','lon','Atratividade local', 'Área Terreno', 'Testada', 'Topografia', 'Superfície',
|
529 |
-
#'Coeficiente extra', 'Valor', 'fof','Valor_desc','Vunit','fal', 'fat','fpe', 'ftp','fsp', 'fex']]
|
530 |
-
|
531 |
|
532 |
result['Vunit_hom'] = round(result['Vunit'] * result['fal'] * \
|
533 |
result['fac'] * \
|
@@ -543,26 +500,8 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
543 |
result['fvg'] * \
|
544 |
result['fex'], 2)
|
545 |
|
546 |
-
|
547 |
-
#if finalidade == "Tipologias com área construída":
|
548 |
-
#result['Vunit_hom'] = round(result['Vunit'] * result['fal'] * \
|
549 |
-
#result['fac'] * \
|
550 |
-
#result['fat'] * \
|
551 |
-
#result['fic'] * \
|
552 |
-
#result['fpd'] * \
|
553 |
-
#result['fvg'] * \
|
554 |
-
#result['fex'], 2)
|
555 |
-
|
556 |
-
#else:
|
557 |
-
#result['Vunit_hom'] = round(result['Vunit'] * result['fal'] * \
|
558 |
-
#result['fat'] * \
|
559 |
-
#result['fpe'] * \
|
560 |
-
#result['ftp'] * \
|
561 |
-
#result['fsp'] * \
|
562 |
-
#result['fex'], 2)
|
563 |
-
#-----------------#
|
564 |
|
565 |
-
|
566 |
# RESULTADOS ESTATÍSTICOS INICIAIS
|
567 |
num = len(result)
|
568 |
media = round(result['Vunit_hom'].mean(), 2)
|
@@ -594,11 +533,10 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
594 |
# REMOÇÃO DE OUTLIERS PELO CRITÉRIO DE CHAUVENET
|
595 |
result = result[result['Status'] != 'rejeitado']
|
596 |
|
597 |
-
#
|
598 |
df_grafico = result.copy()
|
599 |
|
600 |
# GRAU DE FUNDAMENTAÇÃO
|
601 |
-
|
602 |
# item_1 - Graus de Fundamentação (Caracterização do imóvel avaliando)
|
603 |
if caract_avaliando == "Completa quanto a todos os fatores analisados":
|
604 |
item_1 = 3
|
@@ -625,7 +563,7 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
625 |
else:
|
626 |
item_3 = 1
|
627 |
|
628 |
-
# item_4 - Graus de Fundamentação (
|
629 |
max = result.iloc[:, 21:34].max().max()
|
630 |
min = result.iloc[:, 21:34].min().min()
|
631 |
if num >= 5:
|
@@ -737,7 +675,6 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
737 |
|
738 |
media_pond = round((pC1 + pC2 + pC3) / divisor, 2)
|
739 |
|
740 |
-
|
741 |
# VALORES CALCULADOS
|
742 |
|
743 |
if finalidade == "Tipologias com área construída":
|
@@ -775,7 +712,58 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
775 |
"""
|
776 |
#-----------------#
|
777 |
|
778 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
779 |
|
780 |
# Crie um objeto ExcelWriter para escrever no arquivo Excel
|
781 |
nome_com_extensao = os.path.basename(planilha.name)
|
@@ -789,22 +777,22 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
789 |
# Salve o DataFrame 'avaliando' na planilha 'relatório'
|
790 |
df_avaliando.to_excel(writer, sheet_name='avaliando', index=False)
|
791 |
|
792 |
-
|
793 |
|
794 |
# Salve o DataFrame 'result' na planilha 'relatório'
|
795 |
df_dados.to_excel(writer, sheet_name='dados', index=False)
|
796 |
|
797 |
-
|
798 |
|
799 |
# Salve o DataFrame 'dado_hom' na planilha 'relatório'
|
800 |
result.to_excel(writer, sheet_name='dados_hom', index=False)
|
801 |
|
802 |
-
|
803 |
|
804 |
# Salve o DataFrame 'outliers' na planilha 'relatório'
|
805 |
outliers.to_excel(writer, sheet_name='outliers', index=False)
|
806 |
|
807 |
-
|
808 |
|
809 |
# Crie um novo DataFrame com os resultados estatísticos
|
810 |
result_estatisticos = pd.DataFrame({
|
@@ -827,7 +815,7 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
827 |
result_estatisticos.columns = ['Nome da Coluna', 'Valor']
|
828 |
result_estatisticos.to_excel(writer, sheet_name='resultados', index=False)
|
829 |
|
830 |
-
|
831 |
|
832 |
# Crie um novo DataFrame com os resultados do IC
|
833 |
result_ic = pd.DataFrame({
|
@@ -847,7 +835,7 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
847 |
result_ic.columns = ['Nome da Coluna', 'Valor']
|
848 |
result_ic.to_excel(writer, sheet_name='IC', index=False)
|
849 |
|
850 |
-
|
851 |
|
852 |
# Crie um novo DataFrame com os resultados do cálculo das classes de Abunahman
|
853 |
result_classes = pd.DataFrame({
|
@@ -876,7 +864,7 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
876 |
result_classes.columns = ['Nome da Coluna', 'Valor']
|
877 |
result_classes.to_excel(writer, sheet_name='classes', index=False)
|
878 |
|
879 |
-
|
880 |
|
881 |
# Crie um novo DataFrame com os resultados do valor do imóvel
|
882 |
result_valores = pd.DataFrame({
|
@@ -896,42 +884,109 @@ def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo
|
|
896 |
result_valores.columns = ['Nome da Coluna', 'Valor']
|
897 |
result_valores.to_excel(writer, sheet_name='valor', index=False)
|
898 |
|
899 |
-
|
900 |
|
901 |
mapa = plotar_mapa_com_dois_dataframes(result, df_avaliando)
|
902 |
-
|
903 |
|
904 |
-
|
905 |
|
906 |
-
# para gerar um gráfico
|
907 |
-
#scatter_plot_with_percent_labels(df_grafico)
|
908 |
grafico_barras(df_grafico)
|
909 |
|
910 |
-
|
911 |
-
#-----------------#
|
912 |
|
913 |
# Salve o DataFrame 'result' em uma planilha
|
914 |
result.to_excel(output_file, index=False)
|
915 |
-
|
916 |
-
#-----------------#
|
917 |
-
|
918 |
-
save_results_to_pdf(resultados_formatados, intervalo_confiança, valores_finais, 'scatter_plot.png')
|
919 |
-
result.to_excel(output_file, index=False)
|
920 |
|
921 |
-
|
922 |
-
|
923 |
-
#
|
924 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
925 |
|
926 |
-
|
|
|
|
|
927 |
interface = gr.Interface(
|
928 |
fn=avaliacao_imovel,
|
929 |
inputs=[
|
|
|
|
|
930 |
gr.components.File(label="Upload planilha", type="file", info="Importação de planilha padrão com o avaliando e os dados"),
|
931 |
-
#gr.components.Number(label="Número de linhas desejadas", default=10),
|
932 |
gr.Slider(3, 26, value=26, label="Número de dados", info="Escolha o número de dados", step=1),
|
933 |
-
#gr.components.Dropdown(label="Tipo de imóvel", choices=["Terrenos e glebas","Tipologias com área construída"], default="Tipologias com área construída"),
|
934 |
gr.Radio(["Terrenos e glebas", "Tipologias com área construída"], label="Tipo de Imóvel", info="Escolha o tipo de imóvel"),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
935 |
gr.Radio(["Completa p/ todos fatores analisados", "Completa p/ os fatores utilizados", "Situação paradigma"],
|
936 |
label="Caracterização do avaliando", info="Para enquadramento quanto a fundamentação - ítem 1 da tabela 6 do anexo 2 - NBR 14.653-2"),
|
937 |
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",
|
@@ -941,14 +996,19 @@ interface = gr.Interface(
|
|
941 |
)
|
942 |
],
|
943 |
outputs=[
|
944 |
-
gr.
|
945 |
-
gr.
|
|
|
|
|
|
|
946 |
gr.Dataframe(label="Dados homogeneizados"),
|
947 |
gr.components.Textbox(label="Resultados estatísticos"),
|
948 |
gr.components.Textbox(label="Intervalo de confiança de 80%"),
|
949 |
gr.components.Textbox(label="Valores Calculados"),
|
950 |
gr.Plot(label="Geolocalização da amostra"),
|
951 |
gr.Image(label="Gráfico"),
|
|
|
|
|
952 |
|
953 |
],
|
954 |
live=False,
|
|
|
6 |
from gradio import components
|
7 |
from gradio import Interface
|
8 |
import xlsxwriter
|
|
|
|
|
|
|
|
|
9 |
import shutil
|
10 |
import os
|
11 |
import plotly.express as px
|
12 |
import ast
|
13 |
+
from docx import Document
|
14 |
+
from docx.shared import Pt
|
15 |
+
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
|
16 |
+
from docx.shared import Inches
|
17 |
+
import plotly.io as pio
|
18 |
+
from pandas.plotting import table
|
19 |
|
20 |
#-----------------#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |
|
22 |
#função para criar um mapa no plotly
|
23 |
def plotar_mapa_com_dois_dataframes(df1, df2):
|
|
|
48 |
)
|
49 |
# Mostrar o mapa
|
50 |
fig1.show()
|
51 |
+
|
52 |
+
#Salvar a figura como um arquivo PNG
|
53 |
+
pio.write_image(fig1, 'fig2.png')
|
54 |
|
55 |
+
return fig1 #, fig2
|
56 |
|
57 |
#-----------------#
|
58 |
|
59 |
+
#função para criação de um gráfio
|
60 |
def grafico_barras(data):
|
61 |
# Calcular a média da coluna 'Vunit_hom'
|
62 |
media = data['Vunit_hom'].mean()
|
|
|
85 |
|
86 |
#-----------------#
|
87 |
|
|
|
|
|
88 |
def avaliacao_imovel(planilha, num_linhas_desejadas=3, finalidade='Defina o tipo de imovel',
|
89 |
+
nome="-", prof="Engenheiro Civil", ent="CREA", reg="-",
|
90 |
+
lograd="-", munic="-", tipo_imo="-", solic="-", final_espec="-", objetivo="-", press="-",
|
91 |
+
infra="Água Potável", serv="Coleta de Lixo", uso="Residencial", pad_reg="-", tipo_via="-", obs_gerais="-",
|
92 |
+
per="Sem destaque", ofe="Sem destaque", liq="Sem destaque",
|
93 |
+
caract_avaliando='Defina o item 1 de Fundamentação', ident_dados='Defina o item 3 de Fundamentação'):
|
94 |
|
95 |
+
|
96 |
+
#-------------------------------------------------INPUT AVALIANDO-------------------------------------------------------#
|
97 |
|
98 |
# Lendo a aba 'avaliando' da planilha
|
99 |
df_avaliando = pd.read_excel(planilha.name, 'avaliando')
|
|
|
108 |
# Excluindo a coluna 'Coordenadas' se você não precisar dela mais
|
109 |
df_avaliando = df_avaliando.drop('Coordenadas', axis=1)
|
110 |
|
111 |
+
#--------------------------------------------------INPUT DAODS----------------------------------------------------------#
|
112 |
|
113 |
# Lendo a aba 'dados' da planilha, limitando o número de linhas
|
114 |
df_dados = pd.read_excel(planilha.name, 'dados').iloc[:int(num_linhas_desejadas)]
|
|
|
120 |
df_dados['lat'] = df_dados['Coordenadas'].apply(lambda x: round(x[0], 5) if not pd.isna(x) else np.nan)
|
121 |
df_dados['lon'] = df_dados['Coordenadas'].apply(lambda x: round(x[1], 5) if not pd.isna(x) else np.nan)
|
122 |
|
123 |
+
# Excluindo a coluna 'Coordenadas'
|
124 |
df_dados = df_dados.drop('Coordenadas', axis=1)
|
125 |
|
126 |
+
#-----------------------------------------------------FATORES-----------------------------------------------------------#
|
|
|
127 |
|
128 |
# fator de atratividade local (fal)
|
129 |
df_transp = df_dados.copy()
|
|
|
137 |
|
138 |
df_transp = df_transp[['fal']]
|
139 |
|
140 |
+
#-----------------#
|
|
|
141 |
|
142 |
# fator de correção da área construída (fac)
|
143 |
df_area_const = df_dados.copy()
|
|
|
157 |
|
158 |
df_area_const = df_area_const[['fac']]
|
159 |
|
160 |
+
#-----------------#
|
|
|
161 |
|
162 |
# fator de correção da área do terreno (fat)
|
163 |
df_area_terreno = df_dados.copy()
|
|
|
177 |
|
178 |
df_area_terreno = df_area_terreno[['fat']]
|
179 |
|
180 |
+
#-----------------#
|
|
|
181 |
|
182 |
# fator profundidade (fpe)
|
183 |
# Define a função coeficiente_profundidade antes de criar os DataFrames
|
|
|
219 |
df_profundidade['fpe'] = round(df_profundidade_aval['coef_pe'][0]/df_profundidade['coef_pe'],2)
|
220 |
df_profundidade = df_profundidade[['fpe']]
|
221 |
|
222 |
+
#-----------------#
|
223 |
|
224 |
# fator topografia (ftp)
|
225 |
# dicionário topografia
|
|
|
248 |
df_topografia['ftp'] = round(df_topografia_aval['coef_tp'][0]/df_topografia['coef_tp'],2)
|
249 |
df_topografia = df_topografia[['ftp']]
|
250 |
|
251 |
+
#-----------------#
|
|
|
252 |
|
253 |
# fator relevo (frv)
|
254 |
# dicionário relevo
|
|
|
275 |
df_relevo['frv'] = round(df_relevo_aval['coef_rv'][0]/df_relevo['coef_rv'],2)
|
276 |
df_relevo = df_relevo[['frv']]
|
277 |
|
278 |
+
#-----------------#
|
279 |
|
280 |
# fator superfície (fsp)
|
281 |
# dicionário superfície
|
|
|
303 |
df_superficie['fsp'] = round(df_superficie_aval['coef_sp'][0]/df_superficie['coef_sp'],2)
|
304 |
df_superficie = df_superficie[['fsp']]
|
305 |
|
306 |
+
#-----------------#
|
307 |
|
308 |
# fator aproveitamento (fap)
|
309 |
# dicionário aproveitamento
|
|
|
330 |
df_aproveitamento['fap'] = round(df_aproveitamento_aval['coef_ap'][0]/df_aproveitamento['coef_ap'],2)
|
331 |
df_aproveitamento = df_aproveitamento[['fap']]
|
332 |
|
333 |
+
#-----------------#
|
334 |
|
335 |
# fator acessibilidade viária (fav)
|
336 |
# dicionário acessibilidade
|
|
|
360 |
df_acesso['fav'] = round(df_acesso_aval['coef_av'][0]/df_acesso['coef_av'],2)
|
361 |
df_acesso = df_acesso[['fav']]
|
362 |
|
363 |
+
#-----------------#
|
|
|
364 |
|
365 |
# fator idade aparente e conservação (fic)
|
366 |
# dicionário padrão construtivo
|
|
|
403 |
df_idade_cons['fic'] = round(df_idade_cons_aval['coef_ic'][0] / df_idade_cons['coef_ic'],2)
|
404 |
df_idade_cons = df_idade_cons[['fic']]
|
405 |
|
406 |
+
#-----------------#
|
407 |
|
408 |
# fator padrão construtivo (fpd)
|
409 |
# dicionário padrão construtivo
|
|
|
436 |
df_padrao['fpd'] = round(df_padrao_aval['coef_pd'][0]/df_padrao['coef_pd'],2)
|
437 |
df_padrao = df_padrao[['fpd']]
|
438 |
|
439 |
+
#-----------------#
|
440 |
|
441 |
# fator vagas de estacionamento (fvg)
|
442 |
df_vaga = df_dados[['Vagas']].copy()
|
|
|
453 |
df_vaga['fvg'] = round(df_vaga.apply(lambda row: calculate_fcg(row['dif'], row['Vagas']), axis=1), 2)
|
454 |
df_vaga = df_vaga[['fvg']]
|
455 |
|
456 |
+
#-----------------#
|
457 |
|
458 |
# fator extra (à critério do avaliador) (fex)
|
459 |
df_exc = df_dados.copy()
|
|
|
467 |
|
468 |
df_exc = df_exc[['fex']]
|
469 |
|
470 |
+
#-----------------#
|
|
|
|
|
471 |
|
472 |
+
# concatemando o dataframe principal com as dataframes dos fatores
|
473 |
result = pd.concat([df_dados, df_transp, df_area_const, df_area_terreno, df_profundidade, df_topografia, df_relevo,
|
474 |
df_superficie,df_aproveitamento, df_acesso, df_idade_cons, df_padrao, df_vaga, df_exc], axis=1)
|
475 |
result['Valor_desc'] = round(result['Valor']*(result['fof']), 2)
|
|
|
485 |
'Coeficiente extra', 'Valor', 'fof','Valor_desc', 'Vunit','fal', 'fac', 'fat','fpe', 'ftp','frv','fsp',
|
486 |
'fap','fav', 'fic','fpd', 'fvg', 'fex']]
|
487 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
488 |
|
489 |
result['Vunit_hom'] = round(result['Vunit'] * result['fal'] * \
|
490 |
result['fac'] * \
|
|
|
500 |
result['fvg'] * \
|
501 |
result['fex'], 2)
|
502 |
|
503 |
+
#-----------------------------------------------------RESULTADOS---------------------------------------------------------#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
504 |
|
|
|
505 |
# RESULTADOS ESTATÍSTICOS INICIAIS
|
506 |
num = len(result)
|
507 |
media = round(result['Vunit_hom'].mean(), 2)
|
|
|
533 |
# REMOÇÃO DE OUTLIERS PELO CRITÉRIO DE CHAUVENET
|
534 |
result = result[result['Status'] != 'rejeitado']
|
535 |
|
536 |
+
# CÓPIA DO DATAFRAME ORIGINAL PARA PLOTAGEM NA INTERFACE
|
537 |
df_grafico = result.copy()
|
538 |
|
539 |
# GRAU DE FUNDAMENTAÇÃO
|
|
|
540 |
# item_1 - Graus de Fundamentação (Caracterização do imóvel avaliando)
|
541 |
if caract_avaliando == "Completa quanto a todos os fatores analisados":
|
542 |
item_1 = 3
|
|
|
563 |
else:
|
564 |
item_3 = 1
|
565 |
|
566 |
+
# item_4 - Graus de Fundamentação (Intervalo admissível de ajuste para o conjunto de fatores)
|
567 |
max = result.iloc[:, 21:34].max().max()
|
568 |
min = result.iloc[:, 21:34].min().min()
|
569 |
if num >= 5:
|
|
|
675 |
|
676 |
media_pond = round((pC1 + pC2 + pC3) / divisor, 2)
|
677 |
|
|
|
678 |
# VALORES CALCULADOS
|
679 |
|
680 |
if finalidade == "Tipologias com área construída":
|
|
|
712 |
"""
|
713 |
#-----------------#
|
714 |
|
715 |
+
# criação de strings p/ relatórios (interface/word) dos campos do responsável, introdução, região, diagnóstico e avalaliando.
|
716 |
+
dados_resp = f"""
|
717 |
+
Responsável Técnico: {nome}
|
718 |
+
Profissão: {prof}
|
719 |
+
Entidade de Classe: {ent}
|
720 |
+
Número do registro: {reg}
|
721 |
+
"""
|
722 |
+
introd = f"""
|
723 |
+
Logradouro e número: {lograd}
|
724 |
+
Município: {munic}
|
725 |
+
Tipo de imóvel: {tipo_imo}
|
726 |
+
Solicitante: {solic}
|
727 |
+
Finalidade: {final_espec}
|
728 |
+
Objetivo: {objetivo}
|
729 |
+
Pressupostos, Ressalvas e Fatores Limitantes: {press}
|
730 |
+
"""
|
731 |
+
aval_infos = f"""
|
732 |
+
Latitude: {df_avaliando['lat'].iloc[0]}
|
733 |
+
Longitude: {df_avaliando['lon'].iloc[0]}
|
734 |
+
Atratividade local: {df_avaliando['Atratividade local'].iloc[0]}
|
735 |
+
Área Construída: {df_avaliando['Área Construída'].iloc[0]}
|
736 |
+
Área Terreno: {df_avaliando['Área Terreno'].iloc[0]}
|
737 |
+
Testada: {df_avaliando['Testada'].iloc[0]}
|
738 |
+
Topografia: {df_avaliando['Topografia'].iloc[0]}
|
739 |
+
Relevo: {df_avaliando['Relevo'].iloc[0]}
|
740 |
+
Superfície: {df_avaliando['Superfície'].iloc[0]}
|
741 |
+
Aproveitamento: {df_avaliando['Aproveitamento'].iloc[0]}
|
742 |
+
Acessibilidade: {df_avaliando['Acessibilidade'].iloc[0]}
|
743 |
+
Idade aparente e conservação: {df_avaliando['Idade aparente e conservação'].iloc[0]}
|
744 |
+
Padrão construtivo: {df_avaliando['Padrão construtivo'].iloc[0]}
|
745 |
+
Vagas: {df_avaliando['Vagas'].iloc[0]}
|
746 |
+
Coeficiente extra: {df_avaliando['Coeficiente extra'].iloc[0]}
|
747 |
+
"""
|
748 |
+
regiao = f"""
|
749 |
+
Infraestrutura: {infra}
|
750 |
+
Serviços públicos: {serv}
|
751 |
+
Uso: {uso}
|
752 |
+
Padrão predominante na região: {pad_reg}
|
753 |
+
Tipo de via de acesso: {tipo_via}
|
754 |
+
Outras observações: {obs_gerais}
|
755 |
+
"""
|
756 |
+
diag = f"""
|
757 |
+
Performance: {per}
|
758 |
+
Nível de Ofertas do Segmento: {ofe}
|
759 |
+
Liquidez: {liq}
|
760 |
+
"""
|
761 |
+
assinatura = f"""
|
762 |
+
{nome} | {prof}
|
763 |
+
{ent}{reg}
|
764 |
+
"""
|
765 |
+
|
766 |
+
#-------------------------------------------------------ANEXO EXCEL----------------------------------------------------#
|
767 |
|
768 |
# Crie um objeto ExcelWriter para escrever no arquivo Excel
|
769 |
nome_com_extensao = os.path.basename(planilha.name)
|
|
|
777 |
# Salve o DataFrame 'avaliando' na planilha 'relatório'
|
778 |
df_avaliando.to_excel(writer, sheet_name='avaliando', index=False)
|
779 |
|
780 |
+
#-----------------#
|
781 |
|
782 |
# Salve o DataFrame 'result' na planilha 'relatório'
|
783 |
df_dados.to_excel(writer, sheet_name='dados', index=False)
|
784 |
|
785 |
+
#-----------------#
|
786 |
|
787 |
# Salve o DataFrame 'dado_hom' na planilha 'relatório'
|
788 |
result.to_excel(writer, sheet_name='dados_hom', index=False)
|
789 |
|
790 |
+
#-----------------#
|
791 |
|
792 |
# Salve o DataFrame 'outliers' na planilha 'relatório'
|
793 |
outliers.to_excel(writer, sheet_name='outliers', index=False)
|
794 |
|
795 |
+
#-----------------#
|
796 |
|
797 |
# Crie um novo DataFrame com os resultados estatísticos
|
798 |
result_estatisticos = pd.DataFrame({
|
|
|
815 |
result_estatisticos.columns = ['Nome da Coluna', 'Valor']
|
816 |
result_estatisticos.to_excel(writer, sheet_name='resultados', index=False)
|
817 |
|
818 |
+
#-----------------#
|
819 |
|
820 |
# Crie um novo DataFrame com os resultados do IC
|
821 |
result_ic = pd.DataFrame({
|
|
|
835 |
result_ic.columns = ['Nome da Coluna', 'Valor']
|
836 |
result_ic.to_excel(writer, sheet_name='IC', index=False)
|
837 |
|
838 |
+
#-----------------#
|
839 |
|
840 |
# Crie um novo DataFrame com os resultados do cálculo das classes de Abunahman
|
841 |
result_classes = pd.DataFrame({
|
|
|
864 |
result_classes.columns = ['Nome da Coluna', 'Valor']
|
865 |
result_classes.to_excel(writer, sheet_name='classes', index=False)
|
866 |
|
867 |
+
#-----------------#
|
868 |
|
869 |
# Crie um novo DataFrame com os resultados do valor do imóvel
|
870 |
result_valores = pd.DataFrame({
|
|
|
884 |
result_valores.columns = ['Nome da Coluna', 'Valor']
|
885 |
result_valores.to_excel(writer, sheet_name='valor', index=False)
|
886 |
|
887 |
+
#-----------------#
|
888 |
|
889 |
mapa = plotar_mapa_com_dois_dataframes(result, df_avaliando)
|
890 |
+
plt.savefig('mapa_rel.png')
|
891 |
|
892 |
+
#-----------------#
|
893 |
|
894 |
+
# para gerar um gráfico
|
|
|
895 |
grafico_barras(df_grafico)
|
896 |
|
897 |
+
#-----------------#
|
|
|
898 |
|
899 |
# Salve o DataFrame 'result' em uma planilha
|
900 |
result.to_excel(output_file, index=False)
|
|
|
|
|
|
|
|
|
|
|
901 |
|
902 |
+
#-------------------------------------------------------RELATÓRIO NO WORD----------------------------------------------------#
|
903 |
+
|
904 |
+
# Criação de um relatório da avaliação no word
|
905 |
+
# Criar um novo documento do Word
|
906 |
+
doc = Document()
|
907 |
+
|
908 |
+
# Definir o título do documento
|
909 |
+
doc.add_heading('Relatório de Avaliação de Imóvel', level=1)
|
910 |
+
|
911 |
+
# Definir as seções do relatório
|
912 |
+
sections = [
|
913 |
+
(dados_resp, "Informações do Responsável Técnico"),
|
914 |
+
(introd, "Introdução"),
|
915 |
+
(aval_infos, "Informações do avaliando"),
|
916 |
+
(regiao, "Características da Região"),
|
917 |
+
(diag, "Diagmóstico de Mercado"),
|
918 |
+
('Ver anexo', "Dados homogeneizados"),
|
919 |
+
(resultados_formatados, "Resultados estatísticos"),
|
920 |
+
(intervalo_confiança, "Intervalo de confiança de 80%"),
|
921 |
+
(valores_finais, "Valores Calculados"),
|
922 |
+
('fig2.png', "Geolocalização da amostra"),
|
923 |
+
('scatter_plot.png', "Gráfico"),
|
924 |
+
(assinatura,""),
|
925 |
+
]
|
926 |
+
|
927 |
+
for content, title in sections:
|
928 |
+
doc.add_heading(title, level=2)
|
929 |
+
p = doc.add_paragraph()
|
930 |
+
if title == "Geolocalização da amostra": # Adiciona mapa como imagem
|
931 |
+
doc.add_picture('fig2.png', width=Inches(4)) # Substitua 'mapa.png' pelo seu caminho e nome do arquivo
|
932 |
+
elif title == "Gráfico": # Adiciona gráfico como imagem
|
933 |
+
doc.add_picture('scatter_plot.png', width=Inches(4)) # Substitua 'scatter_plot.png' pelo seu caminho e nome do arquivo
|
934 |
+
else: # Adiciona outros tipos de conteúdo
|
935 |
+
run = p.add_run(content)
|
936 |
+
run.font.size = Pt(12)
|
937 |
+
p.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT # Define o alinhamento para à esquerda
|
938 |
+
|
939 |
+
# Salvar o documento em um arquivo .doc
|
940 |
+
doc.save('relatorio_avaliacao.doc')
|
941 |
+
|
942 |
+
#---------------------------------------------------------OUTPUTS-----------------------------------------------------------#
|
943 |
+
|
944 |
+
# OUPUTS
|
945 |
+
return dados_resp, introd, aval_infos, regiao, diag, df_interface, resultados_formatados, intervalo_confiança, valores_finais, mapa, 'scatter_plot.png', 'relatorio_avaliacao.doc', output_file
|
946 |
|
947 |
+
#---------------------------------------------------------DEPLOY------------------------------------------------------------#
|
948 |
+
|
949 |
+
# Interface do Gradio
|
950 |
interface = gr.Interface(
|
951 |
fn=avaliacao_imovel,
|
952 |
inputs=[
|
953 |
+
|
954 |
+
# Imput da planilha
|
955 |
gr.components.File(label="Upload planilha", type="file", info="Importação de planilha padrão com o avaliando e os dados"),
|
|
|
956 |
gr.Slider(3, 26, value=26, label="Número de dados", info="Escolha o número de dados", step=1),
|
|
|
957 |
gr.Radio(["Terrenos e glebas", "Tipologias com área construída"], label="Tipo de Imóvel", info="Escolha o tipo de imóvel"),
|
958 |
+
|
959 |
+
# Informações do Responsável Técnico
|
960 |
+
gr.Textbox(label="Responsável Técnico", value="-"),
|
961 |
+
gr.Dropdown(["Engenheiro Civil", "Arquiteto e Urbanista", "Corretor de Imóveis"],label="Profissão", value="-"),
|
962 |
+
gr.Dropdown(["CREA", "CAU", "CRECI"],label="Entidade de Classe", value="-"),
|
963 |
+
gr.Number(label="Nº do registro", value="0"),
|
964 |
+
|
965 |
+
# Introdução
|
966 |
+
gr.Textbox(label="Endereço (Logradouro, nº e bairro)", value="-"),
|
967 |
+
gr.Textbox(label="Município", value="-"),
|
968 |
+
gr.Textbox(label="Tipo de Imóvel", value="-"),
|
969 |
+
gr.Textbox(label="Solicitante", value="-"),
|
970 |
+
gr.Textbox(label="Finalidade", value="-"),
|
971 |
+
gr.Textbox(label="Objetivo", value="-"),
|
972 |
+
|
973 |
+
# Características da Região
|
974 |
+
gr.Textbox(label="Pressupostos, Ressalvas e Fatores Limitantes", value="-"),
|
975 |
+
gr.Dropdown(["Água Potável", "Energia Elétrica", "Telefone", "Pavimentação", "Esgoto Pluvial",
|
976 |
+
"Iluminação Pública"], value=["Água Potável"], multiselect=True, label="Infraestrutura Urbana"),
|
977 |
+
gr.Dropdown(["Coleta de Lixo", "Transporte Coletivo", "Comércio", "Educação", "Saúde"],
|
978 |
+
value=["Coleta de Lixo"], multiselect=True, label="Serviços Públicos"),
|
979 |
+
gr.Radio(["Residencial", "Comercial", "Misto"], label="Uso",value="Residencial"),
|
980 |
+
gr.Radio(["Baixo", "Normal", "Alto"], label="Padrão predominante na região",value="Normal"),
|
981 |
+
gr.Radio(["Local", "Coletora", "Arterial"], label="Tipo de via de acesso ao imóvel",value="Local"),
|
982 |
+
gr.Textbox(label="Outras informação", value="-"),
|
983 |
+
|
984 |
+
# Diagnóstico de Mercado
|
985 |
+
gr.Radio(["Aparentemente aquecido", "Sem destaque", "Aparentemente recessivo"], label="Performance",value="Sem destaque"),
|
986 |
+
gr.Radio(["Aparentemente alto", "Sem destaque", "Aparentemente baixo"], label="Nível de Ofertas do Segmento",value="Sem destaque"),
|
987 |
+
gr.Radio(["Provavelmente alto", "Sem destaque", "Provavelmente baixo"], label="Liquidez",value="Sem destaque"),
|
988 |
+
|
989 |
+
# Para enquadramento
|
990 |
gr.Radio(["Completa p/ todos fatores analisados", "Completa p/ os fatores utilizados", "Situação paradigma"],
|
991 |
label="Caracterização do avaliando", info="Para enquadramento quanto a fundamentação - ítem 1 da tabela 6 do anexo 2 - NBR 14.653-2"),
|
992 |
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",
|
|
|
996 |
)
|
997 |
],
|
998 |
outputs=[
|
999 |
+
gr.Textbox(label ="Informações do Responsável Técnico"),
|
1000 |
+
gr.Textbox(label ="Introdução"),
|
1001 |
+
gr.Textbox(label ="Informações do Avaliando"),
|
1002 |
+
gr.Textbox(label ="Características da Região"),
|
1003 |
+
gr.Textbox(label ="Diagnóstico de Mercado"),
|
1004 |
gr.Dataframe(label="Dados homogeneizados"),
|
1005 |
gr.components.Textbox(label="Resultados estatísticos"),
|
1006 |
gr.components.Textbox(label="Intervalo de confiança de 80%"),
|
1007 |
gr.components.Textbox(label="Valores Calculados"),
|
1008 |
gr.Plot(label="Geolocalização da amostra"),
|
1009 |
gr.Image(label="Gráfico"),
|
1010 |
+
gr.File(label="Laudo de Avaliação"),
|
1011 |
+
gr.components.File(label="Anexos"),
|
1012 |
|
1013 |
],
|
1014 |
live=False,
|