DavidSB commited on
Commit
f6ff046
1 Parent(s): acef649

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +190 -130
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
- caract_avaliando='Defina o item 1 de Fundamentação', ident_dados='Defina o item 3 de Fundamentação'):
 
 
 
 
120
 
121
- # INPUT AVALIANDO
 
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
- # INPUT DADOS
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' se você não precisar dela mais
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
- # concatemando o dataframe principal com as dataframes dos fatores
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
- # para plotar o gráfico na interface
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 ( Intervalo admissível de ajuste para o conjunto de fatores)
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
- # OUTPUTS
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- #mapa = criar_mapa(df_avaliando) #novo
903
 
904
- #-----------------#
905
 
906
- # para gerar um gráfico de dispersão na interface
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
- # Retorna tanto a planilha quanto os resultados formatados
924
- return output_file, 'resultados.pdf', df_interface, resultados_formatados, intervalo_confiança, valores_finais, mapa, 'scatter_plot.png'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
925
 
926
- # Interface do Gradio com input como arquivo XLS ou XLSX
 
 
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.components.File(label="Download planilha"),
945
- gr.components.File(label="Download Relatório em PDF"),
 
 
 
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,