BET-POISSON / tools.py
ramonmedeiro1's picture
Subindo projeto no huggingface
c40ab65
raw
history blame
2.14 kB
import numpy as np
import pandas as pd
from scipy.stats import poisson
def lambda_(df, team1, team2):
forca1 = df.loc[team1]['forca']
forca2 = df.loc[team2]['forca']
m = 2.25
lambda1 = m*forca1/(forca2 + forca1)
lambda2 = m - lambda1
return [lambda1, lambda2]
def resultado_vde(gols1, gols2):
if gols1 > gols2:
resultado = 'V'
elif gols1 < gols2:
resultado = 'D'
else:
resultado = 'E'
return resultado
def pontos_time(gols1, gols2):
resultado = resultado_vde(gols1, gols2)
if resultado == 'V':
pontos1, pontos2 = 3, 0
elif resultado == 'D':
pontos1, pontos2 = 0, 3
else:
pontos1, pontos2 = 0, 0
return [pontos1, pontos2, resultado]
def dist_poisson(media):
probs = [poisson.pmf(i, media) for i in range(0, 6, 1)] # calcula a probabilidade de sair i gols quando a média = media
probs.append(1-sum(probs)) # probabilidade de sair mais que 5 gols
return pd.Series(probs, index = ['0', '1', '2', '3', '4', '5', '6+'])
def probabilidades_partidas(df, team1, team2):
lambda1, lambda2 = lambda_(df, team1, team2)
dist1, dist2 = dist_poisson(lambda1), dist_poisson(lambda2)
matriz_resultados = np.outer(dist1, dist2) # outer produto dos valores de dist1 e dist2
# empates
empates = np.trace(matriz_resultados)
# soma dos triangulos inferiores
vitoria_team1 = np.tril(matriz_resultados).sum() - empates
# soma dos triangulos superiores
vitoria_team2 = np.triu(matriz_resultados).sum() - empates
vde = np.around([vitoria_team1, empates, vitoria_team2], 3)
probabilidades = [f'{100*i:.2f}%' for i in vde]
return probabilidades, 100*matriz_resultados
def simula_jogo(team1, team2):
lambda1, lambda2 = lambda_(team1, team2)
gols1 = int(np.random.poisson(lam=lambda1, size=1))
gols2 = int(np.random.poisson(lam=lambda2, size=1))
saldo1 = gols1 - gols2
saldo2 = gols2 - gols1
pts1, pts2, resultado = pontos_time(gols1, gols2)
placar = f'{gols1} X {gols2}'
return [gols1, gols2, saldo1, saldo2, pts1, pts2, resultado, placar]