Spaces:
Runtime error
Runtime error
Create app.py
Browse files
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()
|