File size: 3,435 Bytes
5fdfbc2
 
 
 
 
9c29563
5fdfbc2
 
 
 
 
9c29563
5fdfbc2
9c29563
5fdfbc2
9c29563
5fdfbc2
9c29563
5fdfbc2
 
 
266f5f5
 
 
 
 
 
5fdfbc2
56b83c4
266f5f5
 
 
9c29563
5fdfbc2
 
 
 
 
 
 
56b83c4
 
 
 
 
 
 
 
 
 
 
5fdfbc2
 
56b83c4
5fdfbc2
 
 
 
9c29563
5fdfbc2
 
 
 
 
56b83c4
 
5fdfbc2
 
 
 
56b83c4
1c6cf12
5fdfbc2
 
cc7a492
5fdfbc2
 
56b83c4
 
5fdfbc2
 
 
 
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
import pandas as pd
import gradio as gr

# Função para determinar a faixa de probabilidade
def determinar_faixa(prob):
    prob = float(prob)  # Garantir que probabilidade seja float
    if 0.95 <= prob <= 1.00:
        return "95-100%"
    elif 0.90 <= prob < 0.95:
        return "90-95%"
    elif 0.80 <= prob < 0.90:
        return "80-90%"
    elif 0.70 <= prob < 0.80:
        return "70-80%"
    elif 0.60 <= prob < 0.70:
        return "60-70%"
    elif 0.50 <= prob < 0.60:
        return "50-60%"
    else:
        return None

# Função para converter strings com vírgula em float
def converter_para_float(valor):
    if isinstance(valor, str):
        valor = valor.replace(",", ".")
    return float(valor)

# Função principal para calcular EV ajustado e proporção de aposta
def calcular(df_jogos, df_precisao, valor_distribuir):
    # Converter as colunas de probabilidade e retorno para float, lidando com vírgulas
    df_jogos['probabilidade'] = df_jogos['probabilidade'].apply(converter_para_float)
    df_jogos['retorno'] = df_jogos['retorno'].apply(converter_para_float)
    
    df_jogos['faixa'] = df_jogos['probabilidade'].apply(determinar_faixa)
    df_jogos = df_jogos.merge(df_precisao, left_on='faixa', right_on='Faixa', how='left')
    
    df_jogos['EV'] = df_jogos['probabilidade'] * df_jogos['retorno'] - (1 - df_jogos['probabilidade'])
    df_jogos['EV_ajustado'] = df_jogos['EV'] * df_jogos['Precisao']
    df_jogos['proporcao_aposta'] = df_jogos['EV_ajustado'] / df_jogos['EV_ajustado'].sum()
    
    # Calcular o valor a ser apostado em cada jogo
    df_jogos['valor_aposta'] = df_jogos['proporcao_aposta'] * valor_distribuir
    
    # Arredondar os valores para 2 casas decimais
    df_jogos['Precisao'] = df_jogos['Precisao'].round(2)
    df_jogos['EV'] = df_jogos['EV'].round(2)
    df_jogos['EV_ajustado'] = df_jogos['EV_ajustado'].round(2)
    df_jogos['proporcao_aposta'] = df_jogos['proporcao_aposta'].round(2)
    df_jogos['valor_aposta'] = df_jogos['valor_aposta'].round(2)
    
    return df_jogos[['retorno', 'probabilidade', 'faixa', 'Precisao', 'EV', 'EV_ajustado', 'proporcao_aposta', 'valor_aposta']]

# Interface Gradio
def gradio_interface(data, valor_distribuir):
    df_jogos = pd.DataFrame(data)
    
    # Faixas de probabilidade e suas precisões correspondentes
    dados_precisao = {
        "Faixa": ["50-60%", "60-70%", "70-80%", "80-90%", "90-95%", "95-100%"],
        "Precisao": [0.784753, 0.786517, 0.818182, 0.822222, 0.853618, 0.902997]
    }
    
    df_precisao = pd.DataFrame(dados_precisao)
    
    # Calcular EV ajustado, proporção de aposta e valor a ser apostado
    result_df = calcular(df_jogos, df_precisao, valor_distribuir)
    
    return result_df

# Definição das entradas para Gradio
input_df = gr.Dataframe(headers=["retorno", "probabilidade"], datatype=["str", "str"])
input_valor = gr.Number(label="Valor a distribuir", value=100)  # Corrigido aqui

# Definição da saída
output = gr.Dataframe()

# Construção da interface Gradio
iface = gr.Interface(fn=gradio_interface, inputs=[input_df, input_valor], outputs=output, title="Calculadora de Apostas",
                     description="Insira os dados das apostas (retorno_odds, probabilidade modelo) e o valor total a ser distribuído para calcular EV ajustado, proporção de aposta e valor a ser apostado.")

# Executa a interface
if __name__ == "__main__":
    iface.launch()