DavidSB commited on
Commit
0fe789b
1 Parent(s): 49e37a7

Create aap.py

Browse files
Files changed (1) hide show
  1. aap.py +412 -0
aap.py ADDED
@@ -0,0 +1,412 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # instalando biblioteca necessária
2
+ !pip install XlsxWriter
3
+ !pip install gradio --upgrade --quiet
4
+
5
+ # importando bibliotecas necessárias
6
+ import pandas as pd
7
+ import numpy as np
8
+ import gradio as gr
9
+ from gradio import outputs
10
+
11
+ # função da tratamento de dados por fatores
12
+ def avaliacao_imovel(planilha):
13
+ # Lendo a aba 'avaliando' da planilha
14
+ df_avaliando = pd.read_excel(planilha.name, 'avaliando')
15
+ df_dados = pd.read_excel(planilha.name, 'dados')
16
+
17
+
18
+ # fator de atratividade local (fal)
19
+ df_transp = df_dados.copy()
20
+ df_transp = df_transp[['Atratividade local']]
21
+ df_transp['fal'] = round(df_avaliando['Atratividade local'][0] / df_transp['Atratividade local'], 2)
22
+ df_transp = df_transp[['fal']]
23
+
24
+ #-----------------#
25
+
26
+ # fator de correção da área construída (fac)
27
+ df_area_const = df_dados.copy()
28
+ df_area_const = df_area_const[['Área Construída']]
29
+ df_area_const['razao'] = (df_area_const['Área Construída'] / df_avaliando['Área Construída'][0])
30
+ df_area_const['dif'] = abs(df_area_const['Área Construída'] - df_avaliando['Área Construída'][0])
31
+ # 30% da área do terreno do avaliando
32
+ x_ac = 0.3 * df_avaliando['Área Construída'][0]
33
+ # coeficiente n conforme a diferença entre a área do avaliando e dos dados
34
+ df_area_const['n'] = df_area_const['dif'].apply(lambda dif: 0.250 if dif <= x_ac else 0.125)
35
+ df_area_const['fac'] = round((df_area_const['razao']) ** (df_area_const['n']), 2)
36
+ df_area_const = df_area_const[['fac']]
37
+
38
+ #-----------------#
39
+
40
+ # fator de correção da área do terreno (fat)
41
+ df_area_terreno = df_dados.copy()
42
+ df_area_terreno = df_area_terreno[['Área Terreno']]
43
+ df_area_terreno['razao'] = (df_area_terreno['Área Terreno'] / df_avaliando['Área Terreno'][0])
44
+ df_area_terreno['dif'] = abs(df_area_terreno['Área Terreno'] - df_avaliando['Área Terreno'][0])
45
+ # 30% da área do terreno do avaliando
46
+ x_at = 0.3 * df_avaliando['Área Terreno'][0]
47
+ # coeficiente n conforme a diferença entre a área do avaliando e dos dados
48
+ df_area_terreno['n'] = df_area_terreno['dif'].apply(lambda dif: 0.250 if dif <= x_at else 0.125)
49
+ df_area_terreno['fat'] = round((df_area_terreno['razao']) ** (df_area_terreno['n']), 2)
50
+ df_area_terreno = df_area_terreno[['fat']]
51
+
52
+ #-----------------#
53
+
54
+ # fator idade aparente e conservação (fic)
55
+ # dicionário padrão construtivo
56
+ dict_ic = {
57
+ 'id<5 / ótimo': 1.00,
58
+ 'id<5 / bom': 0.95,
59
+ 'id<5 / regular': 0.90,
60
+ 'id<5 / precário': 0.80,
61
+ '6<id<10 / ótimo': 0.85,
62
+ '6<id<10 / bom': 0.75,
63
+ '6<id<10 / regular': 0.70,
64
+ '6<id<10 / precário': 0.60,
65
+ '11<id<30 / ótimo': 0.70,
66
+ '11<id<30 / bom': 0.65,
67
+ '11<id<30 / regular': 0.60,
68
+ '11<id<30 / precário': 0.50,
69
+ 'id>30 / ótimo': 0.50,
70
+ 'id>30 / bom': 0.45,
71
+ 'id>30 / regular': 0.40,
72
+ 'id>30 / precário': 0.30
73
+ }
74
+ # cria dataframe apenas com as colunas necessárias a partir do dataframe dos dados
75
+ df_idade_cons = df_dados.copy()
76
+ df_idade_cons = df_idade_cons[['Idade aparente e conservação']]
77
+ # cria dataframe apenas com as colunas necessárias a partir do dataframe do avaliando
78
+ df_idade_cons_aval = df_avaliando.copy()
79
+ df_idade_cons_aval = df_idade_cons_aval[['Idade aparente e conservação']]
80
+ # Função para mapear os valores de idade aparente e conservação para cod_id_cons usando o dicionário
81
+ def mapear_cod_id_cons(id_cons):
82
+ return dict_ic.get(id_cons, 0)
83
+ # Aplicando a função para criar a coluna cod_topo em df_dados e df_avaliando
84
+ df_idade_cons['coef_ic'] = df_idade_cons['Idade aparente e conservação'].apply(mapear_cod_id_cons)
85
+ df_idade_cons_aval['coef_ic'] = df_idade_cons_aval['Idade aparente e conservação'].apply(mapear_cod_id_cons)
86
+ df_idade_cons['fic'] = round(df_idade_cons_aval['coef_ic'][0] / df_idade_cons['coef_ic'],2)
87
+ df_idade_cons = df_idade_cons[['fic']]
88
+
89
+ #-----------------#
90
+
91
+ # fator padrão construtivo (fpd)
92
+ # dicionário padrão construtivo
93
+ dict_pad = {
94
+ 'baixo_residencial': 1.00,
95
+ 'medio/baixo_residencial': 1.15,
96
+ 'medio_residencial': 1.30,
97
+ 'médio/alto_residencial': 1.45,
98
+ 'alto_residencial': 1.65,
99
+ 'baixo_comercial': 1.00,
100
+ 'medio/baixo_comercial': 1.08,
101
+ 'medio_comercial': 1.15,
102
+ 'medio/alto_comercial': 1.25,
103
+ 'alto_comercial': 1.4
104
+ }
105
+ # cria dataframe apenas com as colunas necessárias a partir do dataframe dos dados
106
+ df_padrao = df_dados.copy()
107
+ df_padrao = df_padrao[['Padrão construtivo']]
108
+ # cria dataframe apenas com as colunas necessárias a partir do dataframe do avaliando
109
+ df_padrao_aval = df_avaliando.copy()
110
+ df_padrao_aval = df_padrao_aval[['Padrão construtivo']]
111
+ # Função para mapear os valores de padrão construtivo para cod_pad usando o dicionário
112
+ def mapear_cod_pad(padrao):
113
+ return dict_pad.get(padrao, 0) # 0 como valor padrão caso a topografia não esteja no dicionário
114
+ # Aplicando a função para criar a coluna cod_topo em df_dados e df_avaliando
115
+ df_padrao['coef_pd'] = df_padrao['Padrão construtivo'].apply(mapear_cod_pad)
116
+ df_padrao_aval['coef_pd'] = df_padrao_aval['Padrão construtivo'].apply(mapear_cod_pad)
117
+ df_padrao['fpd'] = round(df_padrao_aval['coef_pd'][0]/df_padrao['coef_pd'],2)
118
+ df_padrao = df_padrao[['fpd']]
119
+
120
+ #-----------------#
121
+
122
+ # fator vagas de estacionamento (fvg)
123
+ df_vaga = df_dados[['Vagas']].copy()
124
+ df_vaga_aval = df_avaliando[['Vagas']].copy()
125
+ # Calcular a diferença entre as colunas 'Vagas' nos dois DataFrames
126
+ df_vaga['dif'] = df_vaga['Vagas'] - df_vaga_aval['Vagas'][0]
127
+ # Definir a função para o cálculo da coluna 'fvg'
128
+ def calculate_fcg(dif, vagas):
129
+ if dif == 0:
130
+ return 1
131
+ else:
132
+ return 1 - 0.067 * dif
133
+ # Aplicar a função para calcular a coluna 'fcg'
134
+ df_vaga['fvg'] = round(df_vaga.apply(lambda row: calculate_fcg(row['dif'], row['Vagas']), axis=1), 2)
135
+ df_vaga = df_vaga[['fvg']]
136
+
137
+ #-----------------#
138
+
139
+ # fator extra (à critério do avaliador) (fex)
140
+ df_exc = df_dados.copy()
141
+ df_exc = df_exc[['Coeficiente extra']]
142
+ df_exc['fex'] = round(df_avaliando['Coeficiente extra'][0] / df_exc['Coeficiente extra'], 2)
143
+ df_exc = df_exc[['fex']]
144
+
145
+ #-----------------#
146
+
147
+ # concatemando o dataframe principal com as dataframes dos fatores
148
+ result = pd.concat([df_dados, df_transp, df_area_const, df_area_terreno, df_idade_cons, df_padrao, df_vaga, df_exc], axis=1)
149
+ result['Valor_desc'] = round(result['Valor']*(result['fof']), 2)
150
+ result['Vunit'] = round((result['Valor_desc']/result['Área Construída']), 2)
151
+ result = result[['Atratividade local', 'Área Construída', 'Área Terreno',
152
+ 'Idade aparente e conservação', 'Padrão construtivo', 'Vagas',
153
+ 'Coeficiente extra', 'Valor', 'fof','Valor_desc', 'Vunit','fal', 'fac', 'fat', 'fic',
154
+ 'fpd', 'fvg', 'fex']]
155
+ result['Vunit_hom'] = round(result['Vunit'] * result['fal'] * \
156
+ result['fac'] * \
157
+ result['fat'] * \
158
+ result['fic'] * \
159
+ result['fpd'] * \
160
+ result['fvg'] * \
161
+ result['fex'], 2)
162
+
163
+
164
+ # RESULTADOS ESTATÍSTICOS INICIAIS
165
+ num = len(result)
166
+ media = round(result['Vunit_hom'].mean(), 2)
167
+ valor_hom_máximo = round(result['Vunit_hom'].max(), 2)
168
+ valor_hom_mínimo = round(result['Vunit_hom'].min(), 2)
169
+ limite_superior = round(media * 1.3 ,2)
170
+ limite_inferior = round(media * 0.7 ,2)
171
+ desvio_padrao = round(result['Vunit_hom'].std(), 2)
172
+ coef_variacao = round((desvio_padrao / media)*100, 2)
173
+
174
+ # CRITÉRIO DE CHAUVENET
175
+ dict_vc = {
176
+ 2: 1.15,3: 1.38,4: 1.54,5: 1.65,6: 1.73,7: 1.80,8: 1.85,9: 1.91,10: 1.96,11: 1.99,
177
+ 12: 2.03,13: 2.06,14: 2.10,15: 2.13,16: 2.16,17: 2.18,18: 2.20,19: 2.21,20: 2.24,
178
+ 21: 2.26,22: 2.28,23: 2.30,24: 2.31,25: 2.33,26: 2.35,27: 2.36,28: 2.37,29: 2.38,
179
+ 30: 2.93
180
+ }
181
+ vc = dict_vc[num]
182
+ vc
183
+ result['z-score'] = abs((result['Vunit_hom'] - media) / desvio_padrao)
184
+ result['Status'] = np.where(result['z-score'] > vc, 'rejeitado', 'aceito')
185
+
186
+ # DADOS REMOVIDOS
187
+ outliers = result[result['Status'] == 'rejeitado']
188
+
189
+ # REMOÇÃO DE OUTLIERS PELO CRITÉRIO DE CHAUVENET
190
+ result = result[result['Status'] != 'rejeitado']
191
+
192
+ # RESULTADOS ESTATÍSTICOS FINAIS
193
+
194
+ num = len(result)
195
+ dados_outliers = len(outliers)
196
+ media = round(result['Vunit_hom'].mean(), 2)
197
+ valor_hom_máximo = round(result['Vunit_hom'].max(), 2)
198
+ valor_hom_mínimo = round(result['Vunit_hom'].min(), 2)
199
+ limite_superior = round(media * 1.3 ,2)
200
+ limite_inferior = round(media * 0.7 ,2)
201
+ desvio_padrao = round(result['Vunit_hom'].std(), 2)
202
+ coef_variacao = round((desvio_padrao / media)*100, 2)
203
+ # Crie uma string formatada com os RESULTADOS ESTATÍSTICOS FINAIS
204
+ resultados_formatados = f"""
205
+ Número de dados: {num} dados
206
+ Valor Crítico (Chauvenet): {vc}
207
+ Outliers: {dados_outliers} dado(s)
208
+ Média saneada: {media} R$/m²
209
+ Valor máximo: {valor_hom_máximo} R$/m²
210
+ Valor mínimo: {valor_hom_mínimo} R$/m²
211
+ Lim superior (Média*1,3): {limite_superior} R$/m²
212
+ Lim inferior (Média*0,7): {limite_inferior} R$/m²
213
+ Desvio padrão: {desvio_padrao} R$/m²
214
+ Coeficiente variação: {coef_variacao}%
215
+ """
216
+
217
+ # INTEREVALO DE CONFIANÇA DE 80%
218
+ # importando a tabela de t de student
219
+ df_t = pd.read_excel('tabelas.xlsx','t')
220
+ # número de dados
221
+ n = result.shape[0]-1
222
+ # "t" de student
223
+ gl = df_t[df_t['gl (n-1)'] == n]
224
+ tc = gl.iloc[0, 3]
225
+ # limites infeiror e superior do IC de 80% e amplitude
226
+ li_IC = round(media - tc * ((desvio_padrao/(num-1)**0.5)), 2)
227
+ ls_IC = round(media + tc * ((desvio_padrao/(num-1)**0.5)), 2)
228
+ A = round(ls_IC - li_IC, 2)
229
+ A_perc = round((A / media)*100, 2)
230
+ # Crie uma string formatada com o INTEREVALO DE CONFIANÇA DE 80%
231
+ intervalo_confiança = f"""
232
+ t student: {tc}
233
+ Média saneada: {media} R$/m²
234
+ limite infeiror IC_80%: {li_IC} R$/m²
235
+ limite superior IC_80%: {ls_IC} R$/m²
236
+ Aplitude: {A} R$/m²
237
+ Aplitude %: {A_perc} %
238
+ """
239
+
240
+ # VALOR CALCULADO A PARTIR DOS VALORES HOMOGENEIZADOS UTILIZANDO O CRITÉRIO DE CLASSAS D0 ABUNAHMAN
241
+ # dividindo a amplitude em 3 classes
242
+ C = round((A / 3), 2)
243
+ # calculando os intervalos das 3 classes
244
+ C1 = round(result[(result['Vunit_hom'] >= li_IC) & (result['Vunit_hom'] <= li_IC + C)]['Vunit_hom'].count(), 2)
245
+ C2 = round(result[(result['Vunit_hom'] >= li_IC + C) & (result['Vunit_hom'] <= ls_IC - C)]['Vunit_hom'].count(), 2)
246
+ C3 = round(result[(result['Vunit_hom'] >= ls_IC - C) & (result['Vunit_hom'] <= ls_IC)]['Vunit_hom'].count(), 2)
247
+ # crinado listas com os valores encontrados nos intervalos
248
+ list_C1 = result[(result['Vunit_hom'] >= li_IC) & (result['Vunit_hom'] <= li_IC + C)]['Vunit_hom'].tolist()
249
+ list_C2 = result[(result['Vunit_hom'] >= li_IC + C) & (result['Vunit_hom'] <= ls_IC - C)]['Vunit_hom'].tolist()
250
+ list_C3 = result[(result['Vunit_hom'] >= ls_IC - C) & (result['Vunit_hom'] <= ls_IC)]['Vunit_hom'].tolist()
251
+ # ponderação
252
+ pesos = [C1 * elemento for elemento in list_C1] + [C2 * elemento for elemento in list_C2] + [C3 * elemento for elemento in list_C3]
253
+ soma_valores = round(sum(pesos), 2)
254
+ nC1 = 1 if C1 == 0 else C1
255
+ nC2 = 1 if C2 == 0 else C2
256
+ nC3 = 1 if C3 == 0 else C3
257
+ nC = nC1 + nC2 + nC3
258
+ media_pond = round(soma_valores / nC, 2)
259
+
260
+ # VALORES CALCULADOS
261
+ Valor_imóvel = round(media * df_avaliando['Área Construída'], 2).item()
262
+ Valor_imóvel_2 = round((media_pond) * df_avaliando['Área Construída'], 2).item()
263
+ # Crie uma string formatada com os VALORES CALCULADOS
264
+ valores_finais = f"""
265
+ Área avaliando: {df_avaliando['Área Construída'].item()} m²
266
+ Valor (média simples): R$ {Valor_imóvel}
267
+ Vu (média simples): R$ {media}
268
+ Valor (critério classes): R$ {Valor_imóvel_2}
269
+ Vu (critério classes): R$ {media_pond}
270
+ """
271
+ #-----------------#
272
+
273
+ # OUTPUTS
274
+
275
+ # Crie um objeto ExcelWriter para escrever no arquivo Excel
276
+ output_file = 'relatório.xlsx'
277
+ with pd.ExcelWriter(output_file, engine='xlsxwriter') as writer:
278
+
279
+ # Salve o DataFrame 'avaliando' na planilha 'relatório'
280
+ df_avaliando.to_excel(writer, sheet_name='avaliando', index=False)
281
+
282
+ #-----------------#
283
+
284
+ # Salve o DataFrame 'result' na planilha 'relatório'
285
+ df_dados.to_excel(writer, sheet_name='dados', index=False)
286
+
287
+ #-----------------#
288
+
289
+ # Salve o DataFrame 'dado_hom' na planilha 'relatório'
290
+ result.to_excel(writer, sheet_name='dados_hom', index=False)
291
+
292
+ #-----------------#
293
+
294
+ # Salve o DataFrame 'outliers' na planilha 'relatório'
295
+ outliers.to_excel(writer, sheet_name='outliers', index=False)
296
+
297
+ #-----------------#
298
+
299
+ # Crie um novo DataFrame com os resultados estatísticos
300
+ result_estatisticos = pd.DataFrame({
301
+ 'Número de dados': [num],
302
+ 'Média': [media],
303
+ 'Valor homogeneizado máximo': [valor_hom_máximo],
304
+ 'Valor homogeneizado mínimo': [valor_hom_mínimo],
305
+ 'Limite superior (Média x 1,3)': [limite_superior],
306
+ 'Limite inferior (Média x 0,7)': [limite_inferior],
307
+ 'Desvio padrão': [desvio_padrao],
308
+ 'Coeficiente_variacao (%)': [coef_variacao]
309
+ })
310
+
311
+ # Transponha o DataFrame
312
+ result_estatisticos = result_estatisticos.T.reset_index()
313
+ # Defina os nomes das colunas do novo DataFrame
314
+ result_estatisticos.columns = ['Nome da Coluna', 'Valor']
315
+ result_estatisticos.to_excel(writer, sheet_name='resultados', index=False)
316
+
317
+ #-----------------#
318
+
319
+ # Crie um novo DataFrame com os resultados do IC
320
+ result_ic = pd.DataFrame({
321
+ 'Número de dados': [n],
322
+ 't student': [tc],
323
+ 'Limite superior do IC de 80%': [ls_IC],
324
+ 'Limite inferior do IC de 80%': [li_IC],
325
+ 'Amplitude': [A],
326
+ 'Amplitude%':[A_perc]
327
+ })
328
+
329
+ # Transponha o DataFrame
330
+ result_ic = result_ic.T.reset_index()
331
+ # Defina os nomes das colunas do novo DataFrame
332
+ result_ic.columns = ['Nome da Coluna', 'Valor']
333
+ result_ic.to_excel(writer, sheet_name='IC', index=False)
334
+
335
+ #-----------------#
336
+
337
+ # Crie um novo DataFrame com os resultados do cálculo das classes de Abunahman
338
+ result_classes = pd.DataFrame({
339
+ 'C = Amplitude / 3': [round(C, 2)],
340
+ 'li_IC = limite inferior do IC': [round(li_IC, 2)],
341
+ 'li_IC + C = limite inferior do IC + C': [round(li_IC + C, 2)],
342
+ 'ls_IC - C = limite superior do IC + C': [round(ls_IC - C, 2)],
343
+ 'ls_IC = limite superior do IC': [round(ls_IC, 2)],
344
+ 'C1 = quantidade de dados na classe 1': [C1],
345
+ 'C2 = quantidade de dados na classe 2': [C2],
346
+ 'C3 = quantidade de dados na classe 3': [C3],
347
+ 'list_C1 = listagem de dados na classe 1': [list_C1],
348
+ 'list_C2 = listagem de dados na classe 2': [list_C2],
349
+ 'list_C3 = listagem de dados na classe 3': [list_C3],
350
+ 'Pesos - ponderações por classes': [pesos],
351
+ 'Soma dos valores ponderados': [soma_valores],
352
+ #'nC1': [nC1],
353
+ #'nC2': [nC2],
354
+ #'nC3': [nC3],
355
+ 'Soma dos pesos': [nC],
356
+ 'Média ponderada': [media_pond]
357
+ })
358
+
359
+ # Transponha o DataFrame
360
+ result_classes = result_classes.T.reset_index()
361
+ # Defina os nomes das colunas do novo DataFrame
362
+ result_classes.columns = ['Nome da Coluna', 'Valor']
363
+ result_classes.to_excel(writer, sheet_name='classes', index=False)
364
+
365
+ #-----------------#
366
+
367
+ # Crie um novo DataFrame com os resultados do valor do imóvel
368
+ result_valores = pd.DataFrame({
369
+ 'Valor total critério de ABUNAHMAN' : [Valor_imóvel_2],
370
+ 'Valor total média simples' : [Valor_imóvel]
371
+ })
372
+
373
+ # Transponha o DataFrame
374
+ result_valores = result_valores.T.reset_index()
375
+ # Defina os nomes das colunas do novo DataFrame
376
+ result_valores.columns = ['Nome da Coluna', 'Valor']
377
+ result_valores.to_excel(writer, sheet_name='valor', index=False)
378
+
379
+ #-----------------#
380
+
381
+ # Salve o DataFrame 'result' em uma planilha
382
+ result.to_excel('relatório.xlsx', index=False)
383
+
384
+ #-----------------#
385
+
386
+ # Retorna tanto a planilha quanto os resultados formatados
387
+ return 'relatório.xlsx', resultados_formatados, intervalo_confiança, valores_finais
388
+
389
+
390
+ # Interface do Gradio com input como arquivo XLS ou XLSX
391
+ interface = gr.Interface(
392
+ fn=avaliacao_imovel,
393
+ inputs=[
394
+ gr.inputs.File(label="Upload planilha", type="file"),
395
+ ],
396
+ outputs=[
397
+ gr.outputs.File(label="Download planilha"),
398
+ gr.outputs.Textbox(label="Resultados estatísticos"),
399
+ gr.outputs.Textbox(label="Intervalo de confiança de 80%"),
400
+ gr.outputs.Textbox(label="Valores Calculados"),
401
+
402
+ ],
403
+ live=True,
404
+ capture_session=True,
405
+ theme=gr.themes.Soft(),
406
+ title="avaliaFACTOR",
407
+ description="Aplicativo MCDDM com tratamento por fatores / Faça o upload de uma planilha XLS ou XLSX com os dados"
408
+ )
409
+
410
+ # Executar o aplicativo Gradio
411
+ if __name__ == "__main__":
412
+ interface.launch(share=True, debug=True)