Spaces:
Runtime error
Runtime error
File size: 5,884 Bytes
9a69862 22db0a8 9a69862 b926461 056f01c b926461 9a69862 59fb896 22db0a8 db0d9d5 59fb896 e954efa 59fb896 9a69862 59fb896 e954efa 9a69862 fa7e9e4 9a69862 fa7e9e4 9a69862 22db0a8 9a69862 b926461 59fb896 9a69862 22db0a8 b926461 22db0a8 9a69862 fa7e9e4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
import joblib
import pandas as pd
import numpy as np
import gradio as gr
# Carregar os modelos
model_LayAway = joblib.load('model_class_layaway_0.pkl')
model_LayAway_calibrated = joblib.load('platt_scaled_model_class_layaway_0.pkl')
model_LayHome = joblib.load('model_class_layhome_1.pkl')
# Faixas de precisão
precision_by_bin = pd.DataFrame({
'Faixa': [
'0-5%', '5-10%', '10-15%', '15-20%', '20-25%',
'25-30%', '30-35%', '35-40%', '40-45%', '45-50%',
'50-55%', '55-60%', '60-65%', '65-70%', '70-75%',
'75-80%', '80-85%', '85-90%', '90-95%', '95-100%'
],
'Precision': [
0.592715, 0.519316, 0.524543, 0.636364, 0.666905, 0.678614, 0.694686,
0.727428, 0.732558, 0.750000, 0.784753, 0.788012, 0.786517, 0.793349,
0.818182, 0.853535, 0.822222, 0.841962, 0.853618, 0.902997
]
})
# Calcular odds_minima
precision_by_bin['odds_minima'] = round(1 / precision_by_bin['Precision'],3)
# Filtrar apenas faixas com >= 50%
precision_filtered = precision_by_bin[precision_by_bin['Faixa'].str.contains('50-') |
precision_by_bin['Faixa'].str.contains('60-') |
precision_by_bin['Faixa'].str.contains('70-') |
precision_by_bin['Faixa'].str.contains('80-') |
precision_by_bin['Faixa'].str.contains('90-') |
precision_by_bin['Faixa'].str.contains('95-100%')]
def converter_para_float(valor):
return float(valor.replace(',', '.'))
def calcular_percentual_recomendado(probabilidade, max_percent, min_percent, precision):
b = 1 # Supondo odds justas
p = probabilidade / 100
q = 1 - p
f_star = (b * p - q) / b
f_star = max(min(f_star, max_percent / 100), min_percent / 100)
if f_star < min_percent / 100:
f_star = min_percent / 100
return round(f_star * 100, 2)
def determinar_faixa(probabilidade):
bins = np.arange(0, 1.05, 0.05) # Faixas de 0% a 100% com passos de 5%
labels = precision_by_bin['Faixa'].tolist()
# Encontrar o índice da faixa correspondente
bin_index = np.digitize([probabilidade / 100], bins, right=False) - 1
# Corrigir para caso onde a probabilidade esteja exatamente no limite superior
if bin_index[0] == len(labels):
return labels[-1] # Retorna '95-100%' se estiver no limite máximo
return labels[bin_index[0]]
def fazer_previsao(ODD_H, ODD_D, ODD_A, min_percent, max_percent):
ODD_H = converter_para_float(ODD_H)
ODD_D = converter_para_float(ODD_D)
ODD_A = converter_para_float(ODD_A)
data = pd.DataFrame(
{'H/A': [ODD_H / ODD_A], 'Diff': [(ODD_H / ODD_D) - (ODD_H / ODD_A)]})
previsao_LayAway = model_LayAway.predict(data)[0]
previsao_LayHome = model_LayHome.predict(data)[0]
probabilidade_LayAway = round(
100 * model_LayAway.predict_proba(data)[0][1], 2)
probabilidade_LayAway_calibrated = round(
100 * model_LayAway_calibrated.predict_proba(probabilidade_LayAway.reshape(-1, 1))[0][1], 2)
probabilidade_LayHome = round(
100 * model_LayHome.predict_proba(data)[0][1], 2)
if previsao_LayAway == previsao_LayHome:
resultado = f"Não entre! (Probabilidade LayAway: {probabilidade_LayAway_calibrated}%, Probabilidade LayHome: {probabilidade_LayHome}%)"
else:
if previsao_LayAway == 1:
entrada_LayAway = 'SIM'
else:
entrada_LayAway = 'NAO'
# Determinar faixa de probabilidade e precisão correspondente
faixa = determinar_faixa(probabilidade_LayAway_calibrated)
precision = precision_by_bin.loc[precision_by_bin['Faixa'] == faixa, 'Precision'].values[0]
# Calcular percentual recomendado e odds mínima
percentual_recomendado = calcular_percentual_recomendado(
probabilidade_LayAway_calibrated, max_percent, min_percent, precision
)
odds_minima = round(1 / precision, 2)
resultado = f"entrada LayAway (se Odd> 1.17): {entrada_LayAway}\n" \
f"---> probabilidade: {probabilidade_LayAway}%\n" \
f"---> probabilidade calibrada: {probabilidade_LayAway_calibrated}%\n" \
f"---> Percentual recomendado da banca: {percentual_recomendado}%\n" \
f"---> Odds mínima necessária: {odds_minima}\n" \
f"\n" \
f"entrada Home: {'SIM' if probabilidade_LayAway > 68.2 else 'NAO'}\n" \
f"obs: Muito risco, apenas 67% de acerto (odds>1.489)\n" \
f"\n" \
f"entrada LayHome (se Odd> 1.28): {'SIM' if previsao_LayHome == 1 else 'NAO'}\n" \
f"---> probabilidade: {probabilidade_LayHome}%\n" \
f"---> Percentual recomendado da banca: {percentual_recomendado}%\n"
return resultado, precision_filtered
# Criar a interface Gradio
iface = gr.Interface(
fn=fazer_previsao,
inputs=[
gr.Textbox(label="Odds para CASA vencer"),
gr.Textbox(label="Odds para EMPATE"),
gr.Textbox(label="Odds para VISITANTE vencer"),
gr.Slider(1, 40, label="Percentual Mínimo da Banca (%)", value=1), # Slider mínimo com valor inicial 1
gr.Slider(10, 100, label="Percentual Máximo da Banca (%)", value=100) # Slider máximo com valor inicial 100
],
outputs=[
gr.Textbox(label="Recomendação"),
gr.Dataframe(label="Tabela de Precision por Faixa >= 50%", value=precision_filtered)
],
title="Redução de Risco em Apostas",
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."
)
iface.launch(share=True)
|