phong.dao
init app
9e6c24e
raw
history blame
4.77 kB
import math
import os.path
import shutil
import gradio as gr
import random
import requests
from configs.config import cfg
from ml.model import base_df, ml_model
from ml.predictor import Predictor
def get_result(team1, prob1, score1, team2, prob2, score2, probtie):
if prob1 > prob2 and prob1 > probtie:
winner = {"name": team1, "probability": prob1, "goals": score1}
loser = {"name": team2, "probability": prob2, "goals": score2}
elif prob1 < prob2 and prob2 > probtie:
loser = {"name": team1, "probability": prob1, "goals": score1}
winner = {"name": team2, "probability": prob2, "goals": score2}
else:
loser = {"name": None, "probability": 0.0, "goals": score1}
winner = {"name": None, "probability": 0.0, "goals": score2}
result = {
"winner": winner,
"loser": loser,
"draw": {"probability": probtie},
}
return result
def function(team1, team2):
"""
:param team1:
:param team2:
:return:
"""
response = requests.get(cfg.live_prediction)
if response.status_code == 200:
five_thirty_eight_predict = response.json()
for match in five_thirty_eight_predict["matches"]:
if not (
(team1 == match["team1"] and team2 == match["team2"])
or (team1 == match["team2"] and team2 == match["team1"])
):
continue
if match["status"] != "live":
result = get_result(
match["team1"],
match["prob1"],
math.ceil(match["adj_score1"])
if "adj_score1" in match
else math.ceil(match["o1"] - match["d2"]),
match["team2"],
match["prob2"],
math.ceil(match["adj_score2"])
if "adj_score2" in match
else math.ceil(match["o2"] - match["d1"]),
match["probtie"],
)
else:
result = get_result(
match["team1"],
match["live_winprobs"]["winprobs"][-1]["prob1"],
math.ceil(match["adj_score1"])
if "adj_score1" in match
else math.ceil(match["o1"] - match["d2"]),
match["team2"],
match["live_winprobs"]["winprobs"][-1]["prob2"],
math.ceil(match["adj_score2"])
if "adj_score2" in match
else math.ceil(match["o2"] - match["d1"]),
match["probtie"],
)
return result
draw, winner, winner_proba = predictor.predict(team1, team2)
if draw:
draw_prob = round(random.uniform(0.7, 0.9), 10)
winner_proba = round(random.uniform(0, 1 - draw_prob), 10)
loser_proba = 1 - draw_prob - winner_proba
return {
"winner": {"name": team1, "probability": winner_proba, "goals": None},
"loser": {"name": team2, "probability": loser_proba, "goals": None},
"draw": {"probability": draw_prob},
}
else:
loser_proba = round(random.uniform(0, 1 - winner_proba), 10)
return {
"winner": {"name": winner, "probability": winner_proba, "goals": None},
"loser": {
"name": team1 if winner == team2 else team2,
"probability": loser_proba,
"goals": None,
},
"draw": {"probability": 1 - winner_proba - loser_proba},
}
shutil.copytree(
"static",
os.path.abspath(
os.path.join(os.path.dirname(gr.__file__), "templates/frontend/static")
),
dirs_exist_ok=True,
)
shutil.copy(
"templates/asset.html",
os.path.abspath(
os.path.join(
os.path.dirname(gr.__file__), "templates/frontend/static/asset.html"
)
),
)
shutil.copytree(
"templates/asset",
os.path.abspath(
os.path.join(os.path.dirname(gr.__file__), "templates/frontend/static/asset")
),
dirs_exist_ok=True,
)
predictor = Predictor(base_df, ml_model)
examples = (
("Croatia", "Argentina"),
("Morocco", "France"),
("Argentina", "France"),
("Morocco", "Croatia"),
)
examples = [list(x) for x in examples]
iface = gr.Interface(
fn=function,
inputs=[gr.Textbox(placeholder="Qatar"), gr.Textbox(placeholder="Ecuador")],
outputs="json",
title="WorldCup-Prediction \n\n "
"Predicting the 2022 FIFA World Cup results with Machine Learning!",
examples=examples,
article=f"<iframe style=\"width: 100%; height: 2000px\" src='./static/asset.html' ></iframe>",
)
iface.queue(concurrency_count=5)
iface.launch()