DavidSB commited on
Commit
60086a7
·
verified ·
1 Parent(s): c12aba0

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +873 -0
app.py ADDED
@@ -0,0 +1,873 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+ import gradio as gr
3
+ from gradio import components
4
+ from gradio import Interface
5
+ import numpy as np
6
+ import statsmodels
7
+ import statsmodels.api as sm
8
+ from statsmodels.stats.stattools import jarque_bera
9
+ import plotly.express as px
10
+ import plotly.graph_objects as go
11
+ import matplotlib.pyplot as plt
12
+ import seaborn as sns
13
+ import sklearn
14
+ from sklearn.preprocessing import MinMaxScaler
15
+ from sklearn.ensemble import ExtraTreesRegressor
16
+ #%matplotlib inline
17
+
18
+ # função para conversão da escala das variáveis:
19
+ def aplicar_operacao(df, scv, col_index):
20
+ if scv == 'x':
21
+ pass
22
+ elif scv == 'lnx':
23
+ df.iloc[:, col_index] = round(np.log(df.iloc[:, col_index]), 8)
24
+ elif scv == '1/x':
25
+ df.iloc[:, col_index] = round(1 / df.iloc[:, col_index], 8)
26
+ elif scv == 'x²':
27
+ df.iloc[:, col_index] = round(df.iloc[:, col_index] ** 2, 8)
28
+ elif scv == 'y':
29
+ pass
30
+ elif scv == 'lny':
31
+ df.iloc[:, col_index] = round(np.log(df.iloc[:, col_index]), 8)
32
+ elif scv == '1/y':
33
+ df.iloc[:, col_index] = round(1 / df.iloc[:, col_index], 8)
34
+ elif scv == 'y²':
35
+ df.iloc[:, col_index] = round(df.iloc[:, col_index] ** 2, 8)
36
+
37
+ # função para renomear as colunas com as escalas:
38
+ def renomeia_colunas(df_dados, posicao_coluna, scv):
39
+ if posicao_coluna < len(df_dados.columns):
40
+ old_column_name = df_dados.columns[posicao_coluna]
41
+
42
+ new_column_name = old_column_name # Inicializa com o mesmo nome da coluna original
43
+ if scv == 'x':
44
+ pass
45
+ elif scv == 'lnx':
46
+ new_column_name = 'ln(' + old_column_name + ')'
47
+ elif scv == '1/x':
48
+ new_column_name = '1/(' + old_column_name + ')'
49
+ elif scv == 'x²':
50
+ new_column_name = '(' + old_column_name + ')²'
51
+ if scv == 'y':
52
+ pass
53
+ elif scv == 'lny':
54
+ new_column_name = 'ln(' + old_column_name + ')'
55
+ elif scv == '1/y':
56
+ new_column_name = '1/(' + old_column_name + ')'
57
+ elif scv == 'y²':
58
+ new_column_name = '(' + old_column_name + ')²'
59
+
60
+ df_dados.rename(columns={old_column_name: new_column_name}, inplace=True)
61
+
62
+ # função para plotagem dos gráficos de dispersão:
63
+ def criar_grafico_dispersao(df, x_column, y_column, hover_name, trendline_color):
64
+ # Calculando a correlação entre as variáveis x e y
65
+ correlacao = df[x_column].corr(df[y_column])
66
+
67
+ # Criando o gráfico de dispersão com a linha de tendência
68
+ fig = px.scatter(df, x=x_column, y=y_column, hover_name=hover_name, trendline="ols", height=300)
69
+ # Definindo a cor de fundo e do papel
70
+ fig.update_layout(
71
+ plot_bgcolor='rgb(240, 240, 240)',
72
+ paper_bgcolor='rgb(240, 240, 240)',
73
+
74
+ )
75
+ # Definindo a cor dos pontos
76
+ fig.update_traces(marker=dict(color=trendline_color, size=5))
77
+ # Definindo a cor da linha de tendência
78
+ fig.update_traces(line=dict(color="black"))
79
+ # Adicionando o texto com a correlação na linha de tendência
80
+ fig.add_annotation(
81
+ x=df[x_column].max(),
82
+ y=df[y_column].max(),
83
+ text=f"Correlação: {correlacao:.2f}",
84
+ showarrow=False,
85
+ font=dict(color="black")
86
+ )
87
+ return fig
88
+
89
+ # função para a regressão linear
90
+ def avaliacao_imovel(planilha, v_d, scv_d,
91
+ v_1, scv_1, v_2, scv_2,
92
+ v_3, scv_3, v_4, scv_4,
93
+ v_5, scv_5, v_6, scv_6,
94
+ v_7, scv_7, v_8, scv_8,
95
+ v_9, scv_9, v_10, scv_10,
96
+ v_11, scv_11, v_12, scv_12,
97
+ v_13, scv_13, v_14, scv_14,
98
+ v_15, scv_15, v_16, scv_16,
99
+ out):
100
+
101
+ # ---------------------------------Planilha------------------------------#
102
+
103
+ # Carregando os dados
104
+ df_dados = pd.read_excel(planilha.name)
105
+ df_dados = df_dados.round(4)
106
+
107
+ # Convertendo os cabeçalhos para strings
108
+ df_dados.columns = [str(col) for col in df_dados.columns]
109
+
110
+ df_dados[df_dados.columns[1]] = df_dados[df_dados.columns[1]].astype(float)
111
+ df_dados[df_dados.columns[2]] = df_dados[df_dados.columns[2]].astype(float)
112
+ df_original = df_dados.copy()
113
+
114
+ # ---------------------------Nome das variáveis--------------------------#
115
+
116
+ # Obtenha os nomes das colunas, excluindo a primeira ou a segunda
117
+
118
+ if v_d == "Valor total":
119
+ nomes_colunas = df_original.drop(columns=[df_original.columns[0], df_original.columns[2]]).columns
120
+ else:
121
+ nomes_colunas = df_original.drop(columns=[df_original.columns[0], df_original.columns[1]]).columns
122
+
123
+ # Crie a lista de strings com os cabeçalhos formatados
124
+ colunas = [f'Var dependente = {nomes_colunas[0]}'] + [f'Var {i} = {coluna}' for i, coluna in enumerate(nomes_colunas[1:], start=1)]
125
+ # Transformando a lista em uma string separada por vírgula
126
+ string_colunas = ", ".join(colunas)
127
+
128
+ #-----------------------------------Escalas------------------------------#
129
+ # dados
130
+ if v_d == "Valor total":
131
+ aplicar_operacao(df_dados, scv_d, 1)
132
+ else:
133
+ aplicar_operacao(df_dados, scv_d, 2)
134
+ aplicar_operacao(df_dados, scv_1, 3)
135
+ aplicar_operacao(df_dados, scv_2, 4)
136
+ aplicar_operacao(df_dados, scv_3, 5)
137
+ aplicar_operacao(df_dados, scv_4, 6)
138
+ aplicar_operacao(df_dados, scv_5, 7)
139
+ aplicar_operacao(df_dados, scv_6, 8)
140
+ aplicar_operacao(df_dados, scv_7, 9)
141
+ aplicar_operacao(df_dados, scv_8, 10)
142
+ aplicar_operacao(df_dados, scv_9, 11)
143
+ aplicar_operacao(df_dados, scv_10, 12)
144
+ aplicar_operacao(df_dados, scv_11, 13)
145
+ aplicar_operacao(df_dados, scv_12, 14)
146
+ aplicar_operacao(df_dados, scv_13, 15)
147
+ aplicar_operacao(df_dados, scv_14, 16)
148
+ aplicar_operacao(df_dados, scv_15, 17)
149
+ aplicar_operacao(df_dados, scv_16, 18)
150
+
151
+ #----------------------------Renomear colunas----------------------------#
152
+
153
+ #dados
154
+ if v_d == "Valor total":
155
+ renomeia_colunas(df_dados, 1, scv_d)
156
+ else:
157
+ renomeia_colunas(df_dados, 2, scv_d)
158
+ renomeia_colunas(df_dados, 3, scv_1)
159
+ renomeia_colunas(df_dados, 4, scv_2)
160
+ renomeia_colunas(df_dados, 5, scv_3)
161
+ renomeia_colunas(df_dados, 6, scv_4)
162
+ renomeia_colunas(df_dados, 7, scv_5)
163
+ renomeia_colunas(df_dados, 8, scv_6)
164
+ renomeia_colunas(df_dados, 9, scv_7)
165
+ renomeia_colunas(df_dados, 10, scv_8)
166
+ renomeia_colunas(df_dados, 11, scv_9)
167
+ renomeia_colunas(df_dados, 12, scv_10)
168
+ renomeia_colunas(df_dados, 13, scv_11)
169
+ renomeia_colunas(df_dados, 14, scv_12)
170
+ renomeia_colunas(df_dados, 15, scv_13)
171
+ renomeia_colunas(df_dados, 16, scv_14)
172
+ renomeia_colunas(df_dados, 17, scv_15)
173
+ renomeia_colunas(df_dados, 18, scv_16)
174
+
175
+ #----------------Manipulação das linhas (dados / outiliers----------------#
176
+
177
+ #num_linhas = df_dados.shape[0]
178
+ #linhas_selecionadas = [int(linha) - 1 for linha in linhas if int(linha) - 1 < num_linhas]
179
+ #df_filtrado = df_dados.iloc[linhas_selecionadas]
180
+ #df_outliers = df_dados.drop(linhas_selecionadas)
181
+ #df_filtrado.sort_values(by=df_filtrado.columns[0], inplace=True)
182
+
183
+ # Convertendo a entrada em uma lista de inteiros
184
+ dados_out = [int(num.strip()) for num in out.split(",") if num.strip()]
185
+
186
+ # Filtrando o DataFrame para obter os outliers
187
+ df_outliers = df_dados[df_dados.iloc[:, 0].isin(dados_out)]
188
+
189
+ # Removendo os outliers do DataFrame original
190
+ df_filtrado = df_dados[~df_dados.iloc[:, 0].isin(dados_out)]
191
+
192
+ # Resetando o índice de ambos os DataFrames
193
+ df_filtrado.reset_index(drop=True, inplace=True)
194
+ df_outliers.reset_index(drop=True, inplace=True)
195
+
196
+ # Contagem de linhas no DataFrame resultante
197
+ num_outliers = df_outliers.shape[0]
198
+
199
+ #----------------Manipulação das Colunas (variáveis)-----------------------#
200
+
201
+ # Variáveis independentes
202
+ X = pd.DataFrame()
203
+
204
+ # Iterar sobre as colunas do DataFrame df_filtrado
205
+ for i, col in enumerate(df_filtrado.columns):
206
+ # Verificar se a coluna atual deve ser adicionada com base na condição e se ela existe no DataFrame
207
+ if (i == 3 and v_1) or \
208
+ (i == 4 and v_2) or \
209
+ (i == 5 and v_3) or \
210
+ (i == 6 and v_4) or \
211
+ (i == 7 and v_5) or \
212
+ (i == 8 and v_6) or \
213
+ (i == 9 and v_7) or \
214
+ (i == 10 and v_8) or \
215
+ (i == 11 and v_9) or \
216
+ (i == 12 and v_10) or \
217
+ (i == 13 and v_11) or \
218
+ (i == 14 and v_12) or \
219
+ (i == 15 and v_13) or \
220
+ (i == 16 and v_14) or \
221
+ (i == 17 and v_15) or \
222
+ (i == 18 and v_16):
223
+ if i < len(df_filtrado.columns):
224
+ X[col] = df_filtrado.iloc[:, i]
225
+
226
+ #X.to_excel("X.xlsx", index=False) ---> Linha de verificação
227
+
228
+ #---------------------------Gráficos de dispersão--------------------------#
229
+
230
+ fig_v1 = None
231
+ fig_v2 = None
232
+ fig_v3 = None
233
+ fig_v4 = None
234
+ fig_v5 = None
235
+ fig_v6 = None
236
+ fig_v7 = None
237
+ fig_v8 = None
238
+ fig_v9 = None
239
+ fig_v10 = None
240
+ fig_v11 = None
241
+ fig_v12 = None
242
+ fig_v13 = None
243
+ fig_v14 = None
244
+ fig_v15 = None
245
+ fig_v16 = None
246
+
247
+ if v_1:
248
+ if v_d == "Valor total":
249
+ fig_v1 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[3], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
250
+ else:
251
+ fig_v1 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[3], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
252
+ if v_2:
253
+ if v_d == "Valor total":
254
+ fig_v2 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[4], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
255
+ else:
256
+ fig_v2 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[4], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
257
+ if v_3:
258
+ if v_d == "Valor total":
259
+ fig_v3 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[5], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
260
+ else:
261
+ fig_v3 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[5], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
262
+ if v_4:
263
+ if v_d == "Valor total":
264
+ fig_v4 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[6], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
265
+ else:
266
+ fig_v4 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[6], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
267
+ if v_5:
268
+ if v_d == "Valor total":
269
+ fig_v5 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[7], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
270
+ else:
271
+ fig_v5 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[7], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
272
+ if v_6:
273
+ if v_d == "Valor total":
274
+ fig_v6 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[8], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
275
+ else:
276
+ fig_v6 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[8], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
277
+ if v_7:
278
+ if v_d == "Valor total":
279
+ fig_v7 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[9], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
280
+ else:
281
+ fig_v7 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[9], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
282
+ if v_8:
283
+ if v_d == "Valor total":
284
+ fig_v8 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[10], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
285
+ else:
286
+ fig_v8 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[10], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
287
+ if v_9:
288
+ if v_d == "Valor total":
289
+ fig_v9 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[11], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
290
+ else:
291
+ fig_v9 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[11], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
292
+ if v_10:
293
+ if v_d == "Valor total":
294
+ fig_v10 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[12], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
295
+ else:
296
+ fig_v10 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[12], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
297
+ if v_11:
298
+ if v_d == "Valor total":
299
+ fig_v11 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[13], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
300
+ else:
301
+ fig_v11 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[13], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
302
+ if v_12:
303
+ if v_d == "Valor total":
304
+ fig_v12 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[14], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
305
+ else:
306
+ fig_v12 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[14], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
307
+ if v_13:
308
+ if v_d == "Valor total":
309
+ fig_v13 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[15], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
310
+ else:
311
+ fig_v13 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[15], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
312
+ if v_14:
313
+ if v_d == "Valor total":
314
+ fig_v14 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[16], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
315
+ else:
316
+ fig_v14 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[16], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
317
+ if v_15:
318
+ if v_d == "Valor total":
319
+ fig_v15 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[17], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
320
+ else:
321
+ fig_v15 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[17], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
322
+ if v_16:
323
+ if v_d == "Valor total":
324
+ fig_v16 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[18], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
325
+ else:
326
+ fig_v16 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[18], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
327
+
328
+ #--------------------------Regressão Linerar------------------------------#
329
+
330
+ # Variável dependente
331
+ if v_d == "Valor total":
332
+ y = df_filtrado.iloc[:, 1:2]
333
+ else:
334
+ y = df_filtrado.iloc[:, 2:3]
335
+
336
+ #y.to_excel("y.xlsx", index=False) ---> Linha de verificação
337
+
338
+ #---------------------ExtraTreesRegressor--------------------#
339
+
340
+ scaler_x = MinMaxScaler()
341
+ scaler_y = MinMaxScaler()
342
+
343
+ input_scaler = scaler_x.fit(X)
344
+ output_scaler = scaler_y.fit(y)
345
+
346
+ x_norm = input_scaler.transform(X)
347
+ y_norm = output_scaler.transform(np.array(y).reshape(-1, 1))
348
+
349
+ x_norm = pd.DataFrame(x_norm, columns=X.columns)
350
+
351
+ new_y = np.ravel(y_norm)
352
+
353
+ model = ExtraTreesRegressor()
354
+ model.fit(x_norm,new_y)
355
+
356
+ # Criando o gráfico de influência das variáveis
357
+ feat_importances = pd.Series(model.feature_importances_, index=X.columns)
358
+ feat_importances.nlargest(16).plot(kind='barh', color = 'orange')
359
+ plt.title('Influência das Variáveis')
360
+ plt.xlabel('Importância')
361
+ plt.ylabel('Variáveis')
362
+ plt.gca().set_facecolor('#f0f0f5')
363
+ plt.tight_layout()
364
+ plt.grid(True)
365
+
366
+ # Salvar o gráfico como imagem
367
+ plt.savefig('influencia_variaveis.png')
368
+
369
+ #----------------------------Modelo----------------------------#
370
+
371
+ # Adicionando uma constante às variáveis independentes (intercepto)
372
+ X = sm.add_constant(X)
373
+
374
+ # Inicializando o modelo de regressão linear
375
+ modelo = sm.OLS(y, X)
376
+
377
+ # Ajustando o modelo aos dados
378
+ resultado = modelo.fit()
379
+
380
+ # Calculando os resíduos do modelo
381
+ residuos = resultado.resid
382
+ # Calculando Desvio Padrão dos Resíduos
383
+ #desvio_padrao_residuos = round(np.std(resultado.resid), 8)
384
+ desvio_padrao_residuos = round(np.std(residuos), 8)
385
+ # Calculando Estatística F
386
+ estatistica_F = round(resultado.fvalue, 8)
387
+ # Obtendo Nível de Significância do Modelo
388
+ nivel_significancia = round(resultado.f_pvalue, 8)
389
+ # Calculando R²
390
+ r_squared = round(resultado.rsquared, 8)
391
+ # Calculando R² ajustado
392
+ r_squared_adjusted = round(resultado.rsquared_adj, 8)
393
+ # Obtendo Número de Observações
394
+ num_observacoes = int(round(resultado.nobs, 0))
395
+ # Calculando Coeficiente de Correlação
396
+ coef_correlacao = round(np.sqrt(r_squared), 8)
397
+ # Calculando o teste de Jarque-Bera para os resíduos
398
+ jarque_bera_test, p_value, skewness, kurtosis = jarque_bera(residuos)
399
+ # Formatando os resultados com 4 casas decimais
400
+ jarque_bera_test = round(jarque_bera_test, 8)
401
+ p_value = round(p_value, 8)
402
+ skewness = round(skewness, 8)
403
+ kurtosis = round(kurtosis, 8)
404
+ # Extrair os coeficientes da regressão
405
+ coeficientes = resultado.params
406
+ # Calcular a distância de Cook
407
+ distancia_cook = resultado.get_influence().cooks_distance[0]
408
+
409
+ # String com os resultados
410
+ resultados_gerais = f"""
411
+ Desvio Padrão: {desvio_padrao_residuos}
412
+ Estatística F: {estatistica_F}
413
+ Nível de Significância do Modelo: {nivel_significancia}
414
+
415
+ R²: {r_squared}
416
+ R² ajustado: {r_squared_adjusted}
417
+ Correlação: {coef_correlacao}
418
+ Número de observações: {num_observacoes}
419
+ Número de dados não utilizados: {num_outliers}
420
+
421
+ Teste de Jarque-Bera:
422
+ - Estatística do teste: {jarque_bera_test}
423
+ - Valor-p: {p_value}
424
+ - Assimetria (Skewness): {skewness}
425
+ - Curtose (Kurtosis): {kurtosis}
426
+ """
427
+ # Equação do modelo
428
+ if v_d == "Valor total":
429
+ equacao_modelo = df_filtrado.columns[1] + '='
430
+ else:
431
+ equacao_modelo = df_filtrado.columns[2] + '='
432
+
433
+ # Iterar sobre os coeficientes estimados
434
+ for nome_coluna, coeficiente in zip(X.columns, coeficientes):
435
+ # Se o nome da coluna for 'const', adicione apenas o coeficiente
436
+ if nome_coluna == 'const':
437
+ equacao_modelo += f" {coeficiente:.8f} +"
438
+ else:
439
+ # Adicionar o termo à equação do modelo
440
+ equacao_modelo += f" {coeficiente:.8f} * {nome_coluna} +"
441
+
442
+ # Remover o último sinal de adição
443
+ equacao_modelo = equacao_modelo[:-1]
444
+ # Exibindo estatísticas do modelo
445
+ resultado_summary = resultado.summary()
446
+ resultado_html = resultado.summary().tables[1].as_html()
447
+ # Obtenha as estatísticas do modelo em formato de DataFrame
448
+ #resultado_summary_df = pd.DataFrame(resultado_summary.tables[1])
449
+
450
+ #----------------------------df_final (regressão)----------------------------#
451
+
452
+ # Adicionando a primeira coluna de df_filtrado ao início de df_final
453
+ ordem = df_filtrado[[df_filtrado.columns[0]]].copy()
454
+ df_final = pd.concat([ordem, y, X], axis=1)
455
+ df_final = df_final.drop(columns=['const'])
456
+
457
+ #--------------------df_final (adiciona o erro_padronizado)------------------#
458
+
459
+ # Calculando o erro padronizado
460
+ erro_padronizado = round(residuos / desvio_padrao_residuos, 5)
461
+ # Adicionando a coluna de erro padronizado ao df_final
462
+ df_final['Erro Padronizado'] = erro_padronizado
463
+
464
+ #-------------------df_maiores_que_2 (possíveis outliers)--------------------#
465
+
466
+ # Criar DataFrame apenas com os dados cujo erro padronizado é maior que 2
467
+ df_maiores_que_2 = df_final[abs(df_final['Erro Padronizado']) > 2]
468
+ df_maiores_que_2['Erro Abs'] = abs(df_maiores_que_2['Erro Padronizado'])
469
+
470
+ # Listagem de pontos com resíduos > 2
471
+ Listagem_df_maiores_que_2 = ", ".join(map(str, df_maiores_que_2.iloc[:, 0].tolist()))
472
+
473
+ #------------df_correl (Valores Ajustados x Preços Observados)---------------#
474
+
475
+ # Obtendo os valores previstos
476
+ # Dados
477
+ valores_previstos = resultado.predict(X)
478
+
479
+ # Adicionando os valores previstos como uma nova coluna ao df_final
480
+ df_final['Valores Ajustados'] = round(valores_previstos, 8)
481
+ # Criando uma dataframe para os Valores Ajustados x Preços Observados
482
+ if v_d == "Valor total":
483
+ df_correl = df_final[[df_filtrado.columns[0], df_filtrado.columns[1], 'Valores Ajustados']]
484
+ df_correl = df_correl.rename(columns={df_filtrado.columns[1]: 'Preços Observados'})
485
+ else:
486
+ df_correl = df_final[[df_filtrado.columns[0], df_filtrado.columns[2], 'Valores Ajustados']]
487
+ df_correl = df_correl.rename(columns={df_filtrado.columns[2]: 'Preços Observados'})
488
+
489
+ df_correl_grafico = df_correl.copy()
490
+ # Desfazendo a conversão da escala
491
+ if scv_d == 'lny':
492
+ df_correl['Valores Ajustados'] = round(np.exp(df_correl['Valores Ajustados']), 8)
493
+ df_correl['Preços Observados'] = round(np.exp(df_correl['Preços Observados']), 8)
494
+ elif scv_d == '1/y':
495
+ df_correl['Valores Ajustados'] = round(1 / df_correl['Valores Ajustados'], 8)
496
+ df_correl['Preços Observados'] = round(1 / df_correl['Preços Observados'], 8)
497
+ elif scv_d == 'y²':
498
+ df_correl['Valores Ajustados'] = round(np.sqrt(df_correl['Valores Ajustados']), 8)
499
+ df_correl['Preços Observados'] = round(np.sqrt(df_correl['Preços Observados']), 8)
500
+ else:
501
+ pass # Nenhuma transformação é necessária
502
+
503
+ df_correl['Diferença %'] = round(((df_correl['Valores Ajustados']/df_correl['Preços Observados'])-1)*100, 8)
504
+
505
+ #----------------------------------Avaliação--------------------------------#
506
+
507
+ try:
508
+ # Carregando o(s) avaliando(s)
509
+ df_aval = pd.read_excel(planilha.name, 'avaliando')
510
+ df_aval_original = df_aval.copy()
511
+
512
+ # avaliando(s)
513
+ if v_d == "Valor total":
514
+ aplicar_operacao(df_aval, scv_d, 1)
515
+ else:
516
+ aplicar_operacao(df_aval, scv_d, 2)
517
+ aplicar_operacao(df_aval, scv_1, 3)
518
+ aplicar_operacao(df_aval, scv_2, 4)
519
+ aplicar_operacao(df_aval, scv_3, 5)
520
+ aplicar_operacao(df_aval, scv_4, 6)
521
+ aplicar_operacao(df_aval, scv_5, 7)
522
+ aplicar_operacao(df_aval, scv_6, 8)
523
+ aplicar_operacao(df_aval, scv_7, 9)
524
+ aplicar_operacao(df_aval, scv_8, 10)
525
+ aplicar_operacao(df_aval, scv_9, 11)
526
+ aplicar_operacao(df_aval, scv_10, 12)
527
+ aplicar_operacao(df_aval, scv_11, 13)
528
+ aplicar_operacao(df_aval, scv_12, 14)
529
+ aplicar_operacao(df_aval, scv_13, 15)
530
+ aplicar_operacao(df_aval, scv_14, 16)
531
+ aplicar_operacao(df_aval, scv_15, 17)
532
+ aplicar_operacao(df_aval, scv_16, 18)
533
+
534
+ X_aval = pd.DataFrame()
535
+
536
+ # Iterar sobre as colunas do DataFrame df_filtrado
537
+ for i, col in enumerate(df_aval.columns):
538
+ # Verificar se a coluna atual deve ser adicionada com base na condição e se ela existe no DataFrame
539
+ if (i == 3 and v_1) or \
540
+ (i == 4 and v_2) or \
541
+ (i == 5 and v_3) or \
542
+ (i == 6 and v_4) or \
543
+ (i == 7 and v_5) or \
544
+ (i == 8 and v_6) or \
545
+ (i == 9 and v_7) or \
546
+ (i == 10 and v_8) or \
547
+ (i == 11 and v_9) or \
548
+ (i == 12 and v_10) or \
549
+ (i == 13 and v_11) or \
550
+ (i == 14 and v_12) or \
551
+ (i == 15 and v_13) or \
552
+ (i == 16 and v_14) or \
553
+ (i == 17 and v_15) or \
554
+ (i == 18 and v_16):
555
+ if i < len(df_aval.columns):
556
+ X_aval[col] = df_aval.iloc[:, i]
557
+
558
+ X_aval.insert(0, 'const', 1)
559
+
560
+ # Avaliando(s)
561
+ valores_previstos_aval = resultado.predict(X_aval)
562
+ df_aval_original['VALOR'] = round(valores_previstos_aval, 8)
563
+
564
+ if scv_d == 'lny':
565
+ df_aval_original['VALOR'] = round(np.exp(df_aval_original['VALOR']), 8)
566
+ elif scv_d == '1/y':
567
+ df_aval_original['VALOR'] = round(1 / df_aval_original['VALOR'], 8)
568
+ elif scv_d == 'y²':
569
+ df_aval_original['VALOR'] = round(np.sqrt(df_aval_original['VALOR']), 8)
570
+ else:
571
+ pass # Nenhuma transformação é necessária
572
+
573
+ # Campo de arbítrio
574
+ df_aval_original['LI_CA'] = round((df_aval_original['VALOR']*0.85), 2)
575
+ df_aval_original['LS_CA'] = round((df_aval_original['VALOR']*1.15), 2)
576
+
577
+ # Intervalo de Confiança de 80%
578
+ # Calcular os intervalos de confiança para a média prevista
579
+ intervalo_confianca = resultado.get_prediction(X_aval).summary_frame(alpha=0.2)
580
+ # Extrair os limites inferior e superior do intervalo de confiança
581
+ limite_inferior = intervalo_confianca['mean_ci_lower']
582
+ limite_superior = intervalo_confianca['mean_ci_upper']
583
+ # Adicionar as colunas ao DataFrame df_aval_original
584
+ df_aval_original['LI_IC'] = limite_inferior.values
585
+ df_aval_original['LS_IC'] = limite_superior.values
586
+
587
+ if scv_d == 'lny':
588
+ df_aval_original['LI_IC'] = round(np.exp(df_aval_original['LI_IC']), 2)
589
+ df_aval_original['LS_IC'] = round(np.exp(df_aval_original['LS_IC']), 2)
590
+ elif scv_d == '1/y':
591
+ df_aval_original['LI_IC'] = round(1 / df_aval_original['LI_IC'], 2)
592
+ df_aval_original['LS_IC'] = round(1 / df_aval_original['LS_IC'], 2)
593
+ elif scv_d == 'y²':
594
+ df_aval_original['LI_IC'] = round(np.sqrt(df_aval_original['LI_IC']), 2)
595
+ df_aval_original['LS_IC'] = round(np.sqrt(df_aval_original['LS_IC']), 2)
596
+ else:
597
+ pass # Nenhuma transformação é necessária
598
+
599
+ df_aval_original['LI_IC_%'] = round(((df_aval_original['VALOR']-df_aval_original['LI_IC'])/df_aval_original['VALOR'])*100, 2)
600
+ df_aval_original['LS_IC_%'] = round(((df_aval_original['LS_IC']-df_aval_original['VALOR'])/df_aval_original['VALOR'])*100, 2)
601
+ df_aval_original['TOTAL_IC_%'] = round(df_aval_original['LI_IC_%'] + df_aval_original['LS_IC_%'], 2)
602
+
603
+ # Aplicação das condições para determinar 'PRECISÃO'
604
+ df_aval_original['PRECISÃO'] = "" # Inicializa a coluna 'PRECISÃO'
605
+ df_aval_original.loc[df_aval_original['TOTAL_IC_%'] <= 30, 'PRECISÃO'] = "Grau III"
606
+ df_aval_original.loc[(df_aval_original['TOTAL_IC_%'] > 30) & (df_aval_original['TOTAL_IC_%'] <= 40), 'PRECISÃO'] = "Grau II"
607
+ df_aval_original.loc[(df_aval_original['TOTAL_IC_%'] > 40) & (df_aval_original['TOTAL_IC_%'] <= 50), 'PRECISÃO'] = "Grau I"
608
+ df_aval_original.loc[df_aval_original['TOTAL_IC_%'] > 50, 'PRECISÃO'] = "Fora dos critérios"
609
+
610
+ # Retirando as colunas valor total e valor unitário
611
+ df_aval_original = df_aval_original.drop(df_aval_original.columns[[1, 2]], axis=1)
612
+ # Salve o DataFrame 'result' em uma planilha
613
+ df_aval_original.to_excel("planilha_aval.xlsx", index=False)
614
+
615
+ except:
616
+ # Se a aba não existir, crie um DataFrame vazio
617
+ df_aval_original = pd.DataFrame()
618
+
619
+ # Salve o DataFrame 'result' em uma planilha
620
+ df_aval_original.to_excel("planilha_aval.xlsx", index=False)
621
+
622
+ #-----------------------------------------------Gráficos-------------------------------------------------#
623
+
624
+ # Criando subplots
625
+ fig, (ax1, ax2, ax3, ax4) = plt.subplots(4, 1, figsize=(10, 16))
626
+
627
+ # Gráfico dos resíduos padronizados
628
+ ax1.scatter(df_final['Valores Ajustados'], erro_padronizado, color='orange', alpha=0.6)
629
+ ax1.axhline(y=0, color='black', linestyle='--', linewidth=1) # Linha zero
630
+ ax1.axhline(y=2, color='red', linestyle='-', linewidth=1) # Linhas vermelhas em ±2
631
+ ax1.axhline(y=-2, color='red', linestyle='-', linewidth=1)
632
+ ax1.set_title('Gráfico de Resíduos Padronizados')
633
+ ax1.set_xlabel('Valores Ajustados')
634
+ ax1.set_ylabel('Resíduos Padronizados')
635
+ ax1.grid(True)
636
+ # Adicionando rótulos aos pontos com resíduos padronizados > 2
637
+ # for i, txt in enumerate(df_final.iloc[:, 0]):
638
+ # if abs(erro_padronizado[i]) > 2:
639
+ # ax1.annotate(txt, (df_final['Valores Ajustados'][i], erro_padronizado[i]), color='black')
640
+
641
+ # Histograma dos resíduos padronizados
642
+ sns.histplot(erro_padronizado, kde=True, color='orange', alpha=0.6, ax=ax2)
643
+ ax2.set_title('Histograma dos Resíduos Padronizados')
644
+ ax2.set_xlabel('Resíduos Padronizados')
645
+ ax2.set_ylabel('Frequência')
646
+ ax2.grid(True)
647
+
648
+ # Gráfico da distância de Cook
649
+ ax3.plot(distancia_cook, marker='o', linestyle='None', color='orange')
650
+ ax3.axhline(y=1, color='red', linestyle='--', linewidth=1)
651
+ ax3.set_title('Gráfico da Distância de Cook')
652
+ ax3.set_xlabel('Número da Observação')
653
+ ax3.set_ylabel('Distância de Cook')
654
+ ax3.grid(True)
655
+ # Adicionando rótulos aos pontos
656
+ for i, txt in enumerate(df_final.iloc[:, 0]):
657
+ ax3.annotate(txt, (i, distancia_cook[i]))
658
+
659
+ # Gráfico Valores Ajustados vs Preços Observados
660
+ # Extrair os valores dos dados
661
+ x_values = df_correl_grafico['Preços Observados']
662
+ y_values = df_correl_grafico['Valores Ajustados']
663
+ # Calcular a linha de tendência (regressão linear)
664
+ slope, intercept = np.polyfit(x_values, y_values, 1)
665
+
666
+ # Plotar o gráfico de dispersão no eixo ax4
667
+ ax4.scatter(x_values, y_values, color='black')
668
+ # Plotar a linha de tendência no eixo ax4
669
+ ax4.plot(x_values, slope * x_values + intercept, color='orange', linestyle='--', linewidth=2)
670
+ # Adicionar título e rótulos dos eixos em ax4
671
+ ax4.set_title('Valores Ajustados vs Preços Observados')
672
+ ax4.set_xlabel('Preços Observados')
673
+ ax4.set_ylabel('Valores Ajustados')
674
+ ax4.grid(True)
675
+
676
+ # Ajustando a posição dos subplots
677
+ plt.tight_layout()
678
+
679
+ # Exibindo os subplots
680
+ plt.show()
681
+
682
+ #----------------------------------------------Pontos Influenciantes-------------------------------------------------#
683
+
684
+ # Listagem de pontos discrepantes
685
+ limite_cook = 4 / (len(df_final) - len(resultado.params))
686
+ pontos_discrepantes = []
687
+ for i, cook_dist in enumerate(distancia_cook):
688
+ if cook_dist > limite_cook:
689
+ pontos_discrepantes.append(df_final.iloc[i, 0]) # Usando a primeira coluna como rótulo
690
+ # Listagem de pontos influentes
691
+ limite_cook = 1
692
+ pontos_influentes = []
693
+ for i, cook_dist in enumerate(distancia_cook):
694
+ if cook_dist > limite_cook:
695
+ pontos_influentes.append(df_final.iloc[i, 0]) # Usando a primeira coluna como rótulo
696
+
697
+ # Transformando a lista em uma string separada por vírgula
698
+ string_pontos_influentes = ", ".join(map(str, pontos_influentes))
699
+
700
+ #---------------------------------------Outputs----------------------------------#
701
+
702
+ return (
703
+ df_original,
704
+ string_colunas,
705
+ resultados_gerais,
706
+ equacao_modelo,
707
+ resultado_html,
708
+ df_final,
709
+ Listagem_df_maiores_que_2,
710
+ string_pontos_influentes,
711
+ df_maiores_que_2,
712
+ df_outliers,
713
+ df_correl,
714
+ fig_v1,
715
+ fig_v2,
716
+ fig_v3,
717
+ fig_v4,
718
+ fig_v5,
719
+ fig_v6,
720
+ fig_v7,
721
+ fig_v8,
722
+ fig_v9,
723
+ fig_v10,
724
+ fig_v11,
725
+ fig_v12,
726
+ fig_v13,
727
+ fig_v14,
728
+ fig_v15,
729
+ fig_v16,
730
+ 'influencia_variaveis.png',
731
+ plt,
732
+ df_aval_original,
733
+ 'planilha_aval.xlsx',
734
+
735
+ #X_aval,
736
+ #X,
737
+ #y,
738
+ #'X.xlsx',
739
+ #'y.xlsx',
740
+ )
741
+
742
+ #--------------------------------------Interface---------------------------------#
743
+
744
+ #numeros = [str(i) for i in range(0, 501)]
745
+
746
+ with gr.Blocks(theme=gr.themes.Monochrome(primary_hue="yellow", secondary_hue="yellow",)) as interface:
747
+ gr.Markdown(f"""
748
+ <p style="text-align: left; font-family: 'Quicksand', sans-serif; font-weight: bold;">
749
+ <b><span style='color: grey; font-size: 48px;'>aval</span></b>
750
+ <b><span style='color: orange; font-size: 48px;'>ia</span></b>
751
+ <b><span style='color: grey; font-size: 48px;'>.se</span></b>
752
+ </p>
753
+ <p style="text-align: left;"><b><span style='color: grey; font-size: 30px;'>Regressão Linear</span></b></p>
754
+ <p style="text-align: left;"></span>Aplicativo MCDDM com tratamento científico / Você pode fazer um download de uma planilha de exemplo <a href='https://huggingface.co/spaces/DavidSB/RL/resolve/main/sample_data.xlsx' download='sample_data.xlsx'>aqui</a><br><br></p>
755
+ """)
756
+
757
+ with gr.Row():
758
+ with gr.Column():
759
+ with gr.Row():
760
+ #inp_1 = gr.File(label="Upload planilha", type="file", scale=2, height=100)
761
+ imp_1 = gr.File(label="Upload planilha", type="filepath", scale=2, height=100)
762
+ with gr.Row():
763
+ inp_2 = gr.Dropdown(['Valor total', 'Valor unitário',], label="VARIÁVEL DEPENDENTE", value='Valor unitário')
764
+ inp_3 = gr.Dropdown(['y', 'lny', '1/y', 'y²'], label="Escala VARIÁVEL DEPENDENTE", value='y')
765
+ button_1 = gr.Button("Calcular")
766
+ with gr.Row():
767
+ inp_4 = gr.Checkbox(value=True, label="Var 1", scale=1)
768
+ inp_5 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
769
+ inp_6 = gr.Checkbox(value=True, label="Var 2", scale=1)
770
+ inp_7 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
771
+ with gr.Row():
772
+ inp_8 = gr.Checkbox(value=False, label="Var 3", scale=1)
773
+ inp_9 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
774
+ inp_10 = gr.Checkbox(value=False, label="Var 4", scale=1)
775
+ inp_11 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
776
+ with gr.Row():
777
+ inp_12 = gr.Checkbox(value=False, label="Var 5", scale=1)
778
+ inp_13 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
779
+ inp_14 = gr.Checkbox(value=False, label="Var 6", scale=1)
780
+ inp_15 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
781
+ with gr.Row():
782
+ inp_16 = gr.Checkbox(value=False, label="Var 7", scale=1)
783
+ inp_17 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
784
+ inp_18 = gr.Checkbox(value=False, label="Var 8", scale=1)
785
+ inp_19 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
786
+ with gr.Row():
787
+ inp_20 = gr.Checkbox(value=False, label="Var 9", scale=1)
788
+ inp_21 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
789
+ inp_22 = gr.Checkbox(value=False, label="Var 10", scale=1)
790
+ inp_23 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
791
+ with gr.Row():
792
+ inp_24 = gr.Checkbox(value=False, label="Var 11", scale=1)
793
+ inp_25 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
794
+ inp_26 = gr.Checkbox(value=False, label="Var 12", scale=1)
795
+ inp_27 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
796
+ with gr.Row():
797
+ inp_28 = gr.Checkbox(value=False, label="Var 13", scale=1)
798
+ inp_29 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
799
+ inp_30 = gr.Checkbox(value=False, label="Var 14", scale=1)
800
+ inp_31 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
801
+ with gr.Row():
802
+ inp_32 = gr.Checkbox(value=False, label="Var 15", scale=1)
803
+ inp_33 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
804
+ inp_34 = gr.Checkbox(value=False, label="Var 16", scale=1)
805
+ inp_35 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
806
+ button_2 = gr.Button("Calcular")
807
+ #inp_36 = gr.CheckboxGroup(numeros, value=numeros[1:501], label="Selecionar dados", type="index")
808
+ inp_36 = gr.Textbox(label="Manipular dados (separados por vírgula)", type="text", info = "Após rodar o modelo a primeira vez, por meio deste campo podem ser retirados outliers, pontos influenciantes, etc")
809
+ button_3 = gr.Button("Calcular")
810
+
811
+ with gr.Column():
812
+ out_1 = gr.Dataframe(label="Planilha de dados original", height=300)
813
+ out_2 = gr.Textbox(label="Colunas", scale=1)
814
+ with gr.Row():
815
+ out_3 = gr.Textbox(label="Resultados Gerais do Modelo", scale=1)
816
+ out_4 = gr.Textbox(label="Equação do Modelo")
817
+ out_5 = gr.HTML(label="Resultados por variável")
818
+ out_6 = gr.Dataframe(label="Planilha Regressão Linear (Variáveis e escalas escolhidas e sem outliers)", height=300)
819
+ out_7 = gr.Textbox(label="Listagem de dados com resíduos padronizados > 2")
820
+ out_8 = gr.Textbox(label="Listagem de pontos Influenciantes (Distância de Cook > 1)")
821
+ out_9 = gr.Dataframe(label="Resíduos Padronizados > 2", height=300)
822
+ out_10 = gr.Dataframe(label="Outliers (retirados)", height=300)
823
+ out_11 = gr.Dataframe(label="Valores Ajustados x Preços Observados", height=300)
824
+ button_4 = gr.Button("Calcular")
825
+ out_12 = gr.Plot(label="Gráfico Dispersão var 1")
826
+ out_13 = gr.Plot(label="Gráfico Dispersão var 2")
827
+ out_14 = gr.Plot(label="Gráfico Dispersão var 3")
828
+ out_15 = gr.Plot(label="Gráfico Dispersão var 4")
829
+ out_16 = gr.Plot(label="Gráfico Dispersão var 5")
830
+ out_17 = gr.Plot(label="Gráfico Dispersão var 6")
831
+ out_18 = gr.Plot(label="Gráfico Dispersão var 7")
832
+ out_19 = gr.Plot(label="Gráfico Dispersão var 8")
833
+ out_20 = gr.Plot(label="Gráfico Dispersão var 9")
834
+ out_21 = gr.Plot(label="Gráfico Dispersão var 10")
835
+ out_22 = gr.Plot(label="Gráfico Dispersão var 11")
836
+ out_23 = gr.Plot(label="Gráfico Dispersão var 12")
837
+ out_24 = gr.Plot(label="Gráfico Dispersão var 13")
838
+ out_25 = gr.Plot(label="Gráfico Dispersão var 14")
839
+ out_26 = gr.Plot(label="Gráfico Dispersão var 15")
840
+ out_27 = gr.Plot(label="Gráfico Dispersão var 16")
841
+ out_28 = gr.Image(label='Gráfico de Influência das Variáveis')
842
+ out_29 = gr.Plot(label="Análise Gráfica do Modelo de Regressão")
843
+ out_30 = gr.Dataframe(label="Avaliação", height=300)
844
+ out_31 = gr.components.File(label="Resultado da Avaliação")
845
+
846
+ # outputs de verificação
847
+ #out_off_1 = gr.Dataframe(label="X_aval", height=300)
848
+ #out_off_2 = gr.Dataframe(label="X", height=300)
849
+ #out_off_3 = gr.Dataframe(label="y", height=300)
850
+ #out_off_4 = gr.components.File(label="X")
851
+ #out_off_5 = gr.components.File(label="y")
852
+
853
+ inputs = [
854
+ inp_1, inp_2, inp_3, inp_4, inp_5, inp_6, inp_7, inp_8, inp_9, inp_10,
855
+ inp_11, inp_12, inp_13, inp_14, inp_15, inp_16, inp_17, inp_18, inp_19, inp_20,
856
+ inp_21, inp_22, inp_23, inp_24, inp_25, inp_26, inp_27, inp_28, inp_29, inp_30,
857
+ inp_31, inp_32, inp_33, inp_34, inp_35, inp_36
858
+ ]
859
+
860
+ outputs = [
861
+ out_1, out_2, out_3, out_4, out_5, out_6, out_7, out_8, out_9, out_10,
862
+ out_11, out_12, out_13, out_14, out_15, out_16, out_17, out_18, out_19, out_20,
863
+ out_21, out_22, out_23, out_24, out_25, out_26, out_27, out_28, out_29, out_30,
864
+ out_31
865
+ ] #[out_off_1, out_off_2, out_off_3, out_off_4, out_off_5]
866
+
867
+ button_1.click(avaliacao_imovel, inputs=inputs, outputs=outputs)
868
+ button_2.click(avaliacao_imovel, inputs=inputs, outputs=outputs)
869
+ button_3.click(avaliacao_imovel, inputs=inputs, outputs=outputs)
870
+ button_4.click(avaliacao_imovel, inputs=inputs, outputs=outputs)
871
+
872
+ if __name__ == "__main__":
873
+ interface.launch(debug=True)