joaomaia commited on
Commit
9a69862
·
verified ·
1 Parent(s): 36dc115

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +128 -0
app.py ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import joblib
2
+ import pandas as pd
3
+ import numpy as np
4
+ import gradio as gr
5
+
6
+ # Carregar os modelos
7
+ model_LayAway = joblib.load('model_class_layaway_0.pkl')
8
+ model_LayAway_calibrated = joblib.load('platt_scaled_model_class_layaway_0.pkl')
9
+ model_LayHome = joblib.load('model_class_layhome_1.pkl')
10
+
11
+ # Faixas de precisão
12
+ precision_by_bin = {
13
+ '0-5%': 0.592715,
14
+ '5-10%': 0.519316,
15
+ '10-15%': 0.524543,
16
+ '15-20%': 0.636364,
17
+ '20-25%': 0.666905,
18
+ '25-30%': 0.678614,
19
+ '30-35%': 0.694686,
20
+ '35-40%': 0.727428,
21
+ '40-45%': 0.732558,
22
+ '45-50%': 0.750000,
23
+ '50-55%': 0.784753,
24
+ '55-60%': 0.788012,
25
+ '60-65%': 0.786517,
26
+ '65-70%': 0.793349,
27
+ '70-75%': 0.818182,
28
+ '75-80%': 0.853535,
29
+ '80-85%': 0.822222,
30
+ '85-90%': 0.841962,
31
+ '90-95%': 0.853618,
32
+ '95-100%': 0.902997
33
+ }
34
+
35
+ def converter_para_float(valor):
36
+ return float(valor.replace(',', '.'))
37
+
38
+ def calcular_percentual_recomendado(probabilidade, max_percent, min_percent, precision):
39
+ b = 1 # Supondo odds justas
40
+ p = probabilidade / 100
41
+ q = 1 - p
42
+ f_star = (b * p - q) / b
43
+ f_star = max(min(f_star, max_percent / 100), min_percent / 100)
44
+ if f_star < min_percent / 100:
45
+ f_star = min_percent / 100
46
+ return round(f_star * 100, 2)
47
+
48
+ def determinar_faixa(probabilidade):
49
+ bins = [
50
+ '0-5%', '5-10%', '10-15%', '15-20%', '20-25%',
51
+ '25-30%', '30-35%', '35-40%', '40-45%', '45-50%',
52
+ '50-55%', '55-60%', '60-65%', '65-70%', '70-75%',
53
+ '75-80%', '80-85%', '85-90%', '90-95%', '95-100%'
54
+ ]
55
+ bin_width = 5
56
+ for b in bins:
57
+ lower, upper = map(int, b.split('-'))
58
+ if lower <= probabilidade < upper:
59
+ return b
60
+ return '95-100%'
61
+
62
+ def fazer_previsao(ODD_H, ODD_D, ODD_A, min_percent, max_percent):
63
+ ODD_H = converter_para_float(ODD_H)
64
+ ODD_D = converter_para_float(ODD_D)
65
+ ODD_A = converter_para_float(ODD_A)
66
+
67
+ data = pd.DataFrame(
68
+ {'H/A': [ODD_H / ODD_A], 'Diff': [(ODD_H / ODD_D) - (ODD_H / ODD_A)]})
69
+
70
+ previsao_LayAway = model_LayAway.predict(data)[0]
71
+ previsao_LayHome = model_LayHome.predict(data)[0]
72
+
73
+ if previsao_LayAway == previsao_LayHome:
74
+ resultado = 'Não entre!'
75
+ else:
76
+ if previsao_LayAway == 1:
77
+ entrada_LayAway = 'SIM'
78
+ else:
79
+ entrada_LayAway = 'NAO'
80
+
81
+ probabilidade_LayAway = round(
82
+ 100 * model_LayAway.predict_proba(data)[0][1], 2)
83
+ probabilidade_LayAway_calibrated = round(
84
+ 100 * model_LayAway_calibrated.predict_proba(probabilidade_LayAway.reshape(-1, 1))[0][1], 2)
85
+ probabilidade_LayHome = round(
86
+ 100 * model_LayHome.predict_proba(data)[0][1], 2)
87
+
88
+ # Determinar faixa de probabilidade e precisão correspondente
89
+ faixa = determinar_faixa(probabilidade_LayAway_calibrated)
90
+ precision = precision_by_bin[faixa]
91
+
92
+ # Calcular percentual recomendado e odds mínima
93
+ percentual_recomendado = calcular_percentual_recomendado(
94
+ probabilidade_LayAway_calibrated, max_percent, min_percent, precision
95
+ )
96
+ odds_minima = round(1 / precision, 2)
97
+
98
+ resultado = f"entrada LayAway (se Odd> 1.17): {entrada_LayAway}\n" \
99
+ f"---> probabilidade: {probabilidade_LayAway}%\n" \
100
+ f"---> probabilidade calibrada: {probabilidade_LayAway_calibrated}%\n" \
101
+ f"---> Percentual recomendado da banca: {percentual_recomendado}%\n" \
102
+ f"---> Odds mínima necessária: {odds_minima}\n" \
103
+ f"\n" \
104
+ f"entrada Home: {'SIM' if probabilidade_LayAway > 68.2 else 'NAO'}\n" \
105
+ f"obs: Muito risco, apenas 67% de acerto (odds>1.489)\n" \
106
+ f"\n" \
107
+ f"entrada LayHome (se Odd> 1.28): {'SIM' if previsao_LayHome == 1 else 'NAO'}\n" \
108
+ f"---> probabilidade: {probabilidade_LayHome}%\n" \
109
+ f"---> Percentual recomendado da banca: {percentual_recomendado}%\n"
110
+
111
+ return resultado
112
+
113
+ # Criar a interface Gradio
114
+ iface = gr.Interface(
115
+ fn=fazer_previsao,
116
+ inputs=[
117
+ gr.Textbox(label="Odds para CASA vencer"),
118
+ gr.Textbox(label="Odds para EMPATE"),
119
+ gr.Textbox(label="Odds para VISITANTE vencer"),
120
+ gr.Slider(1, 40, label="Percentual Mínimo da Banca (%)", value=1), # Slider mínimo com valor inicial 1
121
+ gr.Slider(10, 100, label="Percentual Máximo da Banca (%)", value=100) # Slider máximo com valor inicial 100
122
+ ],
123
+ outputs="text",
124
+ title="Redução de Risco em Apostas",
125
+ description="Insira as Odds e obtenha uma sugestão para entradas LayAway (CASA vence ou EMPATA) e LayHome (VISITANTE vence ou EMPATA), juntamente com o percentual recomendado da banca e odds mínima."
126
+ )
127
+
128
+ iface.launch()