public static void CheckSeasonStreaks(PredictionData data, Game game) { var leagueRepo = new LeagueDataRepository(); var analysisRepo = new AnalysisDataRepository(); var seasonStats = analysisRepo.GetSeasonStats(game.SeasonRound.LeagueSeasonId); var allSeasonGames = leagueRepo.GetAllSeasonGames(game.SeasonRound.LeagueSeasonId).Where(g => g.Result != 0).OrderByDescending(g => g.Date).ToList(); //var homeTeamId = game.HomeTeamId; //var awayTeamId = game.AwayTeamId; int lastHomeTeamWinGamesAgo = -1, lastAwayTeamWinGamesAgo = -1, lastDrawGamesAgo = -1; int lastBttsYes = -1, lastBttsNo = -1; int lastTotalOver = -1, lastTotalUnder = -1; for (int i = 0; i < allSeasonGames.Count; i++) { if (lastHomeTeamWinGamesAgo > -1 && lastAwayTeamWinGamesAgo > -1 && lastDrawGamesAgo > -1 && lastTotalOver > -1 && lastTotalUnder > -1 && lastBttsYes > -1 && lastBttsNo > -1) { break; } var tempGame = allSeasonGames[i]; switch (tempGame.Result) { case GameResult.HomeWin: if (lastHomeTeamWinGamesAgo == -1) { lastHomeTeamWinGamesAgo = i; } break; case GameResult.Draw: if (lastDrawGamesAgo == -1) { lastDrawGamesAgo = i; } break; case GameResult.AwayWin: if (lastAwayTeamWinGamesAgo == -1) { lastAwayTeamWinGamesAgo = i; } break; } var totalOver = (tempGame.AwayTeamGoals + tempGame.HomeTeamGoals) > 2; if (totalOver && (lastTotalOver == -1)) { lastTotalOver = i; } if (!totalOver && (lastTotalUnder == -1)) { lastTotalUnder = i; } var bttsYes = (tempGame.AwayTeamGoals > 0) && (tempGame.HomeTeamGoals > 0); if (bttsYes && (lastBttsYes == -1)) { lastBttsYes = i; } if (!bttsYes && (lastBttsNo == -1)) { lastBttsNo = i; } } var averageHomeTeamWinFreq = 1 / seasonStats.HomeWinsPercentage; var averageAwayTeamWinFreq = 1 / seasonStats.AwayWinsPercentage; var averageDrawsFreq = 1 / seasonStats.DrawsPercentage; var averageBttsYesFreq = (double)seasonStats.GamePlayed / seasonStats.BTTS_Yes; var averageBttsNoFreq = (double)seasonStats.GamePlayed / seasonStats.BTTS_No; var averageTotalOverFreq = (double)seasonStats.GamePlayed / seasonStats.GamesOver2_5; var averageTotalUnderFreq = (double)seasonStats.GamePlayed / seasonStats.GamesUnder2_5; var minFreq = averageHomeTeamWinFreq; if (averageAwayTeamWinFreq < minFreq) { minFreq = averageAwayTeamWinFreq; } if (averageDrawsFreq < minFreq) { minFreq = averageDrawsFreq; } if (minFreq == averageHomeTeamWinFreq) { data.CalculatedProbabilities.HomeWinProbability *= SeasonStatsCoef; } if (minFreq == averageDrawsFreq) { data.CalculatedProbabilities.DrawProbability *= SeasonStatsCoef; } if (minFreq == averageAwayTeamWinFreq) { data.CalculatedProbabilities.AwayWinProbability *= SeasonStatsCoef; } minFreq = averageBttsYesFreq; if (averageBttsNoFreq < minFreq) { minFreq = averageBttsNoFreq; } if (minFreq == averageBttsNoFreq) { data.CalculatedProbabilities.BttsNoProbability *= SeasonStatsCoef; } if (minFreq == averageBttsYesFreq) { data.CalculatedProbabilities.BttsYesProbability *= SeasonStatsCoef; } minFreq = averageTotalOverFreq; if (averageTotalUnderFreq < minFreq) { minFreq = averageTotalUnderFreq; } if (minFreq == averageTotalOverFreq) { data.CalculatedProbabilities.TotalOverProbability *= SeasonStatsCoef; } if (minFreq == averageTotalUnderFreq) { data.CalculatedProbabilities.TotalUnderProbability *= SeasonStatsCoef; } //differences between last time some result happend and average result frequency var diffHomeTeamWins = lastHomeTeamWinGamesAgo - averageHomeTeamWinFreq; var diffAwayTeamWins = lastAwayTeamWinGamesAgo - averageAwayTeamWinFreq; var diffDraws = lastDrawGamesAgo - averageDrawsFreq; var diffBttsYes = lastBttsYes - averageBttsYesFreq; var diffBttsNo = lastBttsNo - averageBttsNoFreq; var diffTotalOver = lastTotalOver - averageTotalOverFreq; var diffTotalUnder = lastTotalUnder - averageTotalUnderFreq; data.CalculatedProbabilities.HomeWinProbability *= GetCoefByDifference(diffHomeTeamWins); data.CalculatedProbabilities.AwayWinProbability *= GetCoefByDifference(diffAwayTeamWins); data.CalculatedProbabilities.DrawProbability *= GetCoefByDifference(diffDraws); data.CalculatedProbabilities.BttsYesProbability *= GetCoefByDifference(diffBttsYes); data.CalculatedProbabilities.BttsNoProbability *= GetCoefByDifference(diffBttsNo); data.CalculatedProbabilities.TotalOverProbability *= GetCoefByDifference(diffTotalOver); data.CalculatedProbabilities.TotalUnderProbability *= GetCoefByDifference(diffTotalUnder); }
public static void CheckH2H(PredictionData data, Game game) { var leagueRepo = new LeagueDataRepository(); var analysisRepo = new AnalysisDataRepository(); var homeTeamId = game.HomeTeamId; var awayTeamId = game.AwayTeamId; var h2hStats = analysisRepo.GetTeamsHeadToHead(homeTeamId, awayTeamId); var teamsHistory = leagueRepo.GetTeamsHistory(homeTeamId, awayTeamId).Where(g => g.Result != 0) .OrderByDescending(th => th.Date).ToList(); bool homeTeamMapsToTeam1 = h2hStats.Team1Id == homeTeamId; int lastHomeTeamWinGamesAgo = -1, lastAwayTeamWinGamesAgo = -1, lastDrawGamesAgo = -1; int lastBttsYes = -1, lastBttsNo = -1; int lastTotalOver = -1, lastTotalUnder = -1; for (int i = 0; i < teamsHistory.Count; i++) { if (lastHomeTeamWinGamesAgo > -1 && lastAwayTeamWinGamesAgo > -1 && lastDrawGamesAgo > -1 && lastTotalOver > -1 && lastTotalUnder > -1 && lastBttsYes > -1 && lastBttsNo > -1) { break; } var tempGame = teamsHistory[i]; if (tempGame.HomeTeamId == homeTeamId) { switch (tempGame.Result) { case GameResult.HomeWin: if (lastHomeTeamWinGamesAgo == -1) { lastHomeTeamWinGamesAgo = i; } break; case GameResult.Draw: if (lastDrawGamesAgo == -1) { lastDrawGamesAgo = i; } break; case GameResult.AwayWin: if (lastAwayTeamWinGamesAgo == -1) { lastAwayTeamWinGamesAgo = i; } break; } } else { switch (tempGame.Result) { case GameResult.HomeWin: if (lastAwayTeamWinGamesAgo == -1) { lastAwayTeamWinGamesAgo = i; } break; case GameResult.Draw: if (lastDrawGamesAgo == -1) { lastDrawGamesAgo = i; } break; case GameResult.AwayWin: if (lastHomeTeamWinGamesAgo == -1) { lastHomeTeamWinGamesAgo = i; } break; } } var totalOver = (tempGame.AwayTeamGoals + tempGame.HomeTeamGoals) > 2; if (totalOver && (lastTotalOver == -1)) { lastTotalOver = i; } if (!totalOver && (lastTotalUnder == -1)) { lastTotalUnder = i; } var bttsYes = (tempGame.AwayTeamGoals > 0) && (tempGame.HomeTeamGoals > 0); if (bttsYes && (lastBttsYes == -1)) { lastBttsYes = i; } if (!bttsYes && (lastBttsNo == -1)) { lastBttsNo = i; } } double averageHomeTeamWinFreq, averageAwayTeamWinFreq, averageDrawsFreq; double averageBttsYesFreq, averageBttsNoFreq; double averageTotalOverFreq, averageTotalUnderFreq; if (homeTeamMapsToTeam1) { averageHomeTeamWinFreq = 1 / h2hStats.Team1WinsPercentage; averageAwayTeamWinFreq = 1 / h2hStats.Team2WinsPercentage; } else { averageAwayTeamWinFreq = 1 / h2hStats.Team1WinsPercentage; averageHomeTeamWinFreq = 1 / h2hStats.Team2WinsPercentage; } averageDrawsFreq = 1 / h2hStats.DrawsPercentage; averageBttsYesFreq = (double)h2hStats.GamePlayed / h2hStats.BTTS_Yes; averageBttsNoFreq = (double)h2hStats.GamePlayed / h2hStats.BTTS_No; averageTotalOverFreq = (double)h2hStats.GamePlayed / h2hStats.GamesOver2_5; averageTotalUnderFreq = (double)h2hStats.GamePlayed / h2hStats.GamesUnder2_5; var minFreq = averageHomeTeamWinFreq; if (averageAwayTeamWinFreq < minFreq) { minFreq = averageAwayTeamWinFreq; } if (averageDrawsFreq < minFreq) { minFreq = averageDrawsFreq; } if (minFreq == averageHomeTeamWinFreq) { data.CalculatedProbabilities.HomeWinProbability *= H2HCoef; } if (minFreq == averageDrawsFreq) { data.CalculatedProbabilities.DrawProbability *= H2HCoef; } if (minFreq == averageAwayTeamWinFreq) { data.CalculatedProbabilities.AwayWinProbability *= H2HCoef; } minFreq = averageBttsYesFreq; if (averageBttsNoFreq < minFreq) { minFreq = averageBttsNoFreq; } if (minFreq == averageBttsNoFreq) { data.CalculatedProbabilities.BttsNoProbability *= H2HCoef; } if (minFreq == averageBttsYesFreq) { data.CalculatedProbabilities.BttsYesProbability *= H2HCoef; } minFreq = averageTotalOverFreq; if (averageTotalUnderFreq < minFreq) { minFreq = averageTotalUnderFreq; } if (minFreq == averageTotalOverFreq) { data.CalculatedProbabilities.TotalOverProbability *= H2HCoef; } if (minFreq == averageTotalUnderFreq) { data.CalculatedProbabilities.TotalUnderProbability *= H2HCoef; } //differences between last time some result happend and average result frequency var diffHomeTeamWins = lastHomeTeamWinGamesAgo - averageHomeTeamWinFreq; var diffAwayTeamWins = lastAwayTeamWinGamesAgo - averageAwayTeamWinFreq; var diffDraws = lastDrawGamesAgo - averageDrawsFreq; var diffBttsYes = lastBttsYes - averageBttsYesFreq; var diffBttsNo = lastBttsNo - averageBttsNoFreq; var diffTotalOver = lastTotalOver - averageTotalOverFreq; var diffTotalUnder = lastTotalUnder - averageTotalUnderFreq; var maxDiff = diffHomeTeamWins; if (diffAwayTeamWins > maxDiff) { maxDiff = diffAwayTeamWins; } if (diffDraws > maxDiff) { maxDiff = diffDraws; } if (maxDiff == diffHomeTeamWins) { data.CalculatedProbabilities.HomeWinProbability *= H2HCoefLastGames; } if (maxDiff == diffDraws) { data.CalculatedProbabilities.DrawProbability *= H2HCoefLastGames; } if (maxDiff == diffAwayTeamWins) { data.CalculatedProbabilities.AwayWinProbability *= H2HCoefLastGames; } maxDiff = diffBttsYes; if (diffBttsNo > maxDiff) { maxDiff = diffBttsNo; } if (maxDiff == diffBttsYes) { data.CalculatedProbabilities.BttsYesProbability *= H2HCoefLastGames; } if (maxDiff == diffBttsNo) { data.CalculatedProbabilities.BttsNoProbability *= H2HCoefLastGames; } maxDiff = diffTotalOver; if (diffTotalUnder > maxDiff) { maxDiff = diffTotalUnder; } if (maxDiff == diffTotalOver) { data.CalculatedProbabilities.TotalOverProbability *= H2HCoefLastGames; } if (maxDiff == diffTotalUnder) { data.CalculatedProbabilities.TotalUnderProbability *= H2HCoefLastGames; } }
public static void CheckTeamForms(PredictionData data, Game game) { var leagueRepo = new LeagueDataRepository(); var analysisRepo = new AnalysisDataRepository(); var homeTeamId = game.HomeTeamId; var awayTeamId = game.AwayTeamId; //home team var homeTeamForm5 = analysisRepo.GetFootballTeamFormByIdAndType(game.SeasonRound.LeagueSeasonId, homeTeamId, TimePeriod.Last5Matches); var wins = homeTeamForm5.WinsPercentage; var losses = homeTeamForm5.LossesPercentage; var draws = homeTeamForm5.DrawsPercentage; var medianProbability = Math.Max(Math.Min(wins, losses), Math.Min(Math.Max(wins, losses), draws)); if (wins > medianProbability) { data.CalculatedProbabilities.HomeWinProbability *= TeamFormCoef; } else if (wins < medianProbability) { data.CalculatedProbabilities.HomeWinProbability /= TeamFormCoef; } if (losses > medianProbability) { data.CalculatedProbabilities.AwayWinProbability *= TeamFormCoef; } else if (losses < medianProbability) { data.CalculatedProbabilities.AwayWinProbability /= TeamFormCoef; } if (draws > medianProbability) { data.CalculatedProbabilities.DrawProbability *= TeamFormCoef; } else if (draws < medianProbability) { data.CalculatedProbabilities.DrawProbability /= TeamFormCoef; } var bttsYes = (double)homeTeamForm5.BTTS_Yes / homeTeamForm5.GamePlayed; var bttsNo = (double)homeTeamForm5.BTTS_No / homeTeamForm5.GamePlayed; if (bttsYes > bttsNo) { data.CalculatedProbabilities.BttsYesProbability *= TeamFormCoef; data.CalculatedProbabilities.BttsNoProbability /= TeamFormCoef; } else { data.CalculatedProbabilities.BttsNoProbability *= TeamFormCoef; data.CalculatedProbabilities.BttsYesProbability /= TeamFormCoef; } var totalOver = (double)homeTeamForm5.GamesOver2_5 / homeTeamForm5.GamePlayed; var totalUnder = (double)homeTeamForm5.GamesUnder2_5 / homeTeamForm5.GamePlayed; if (totalOver > totalUnder) { data.CalculatedProbabilities.TotalOverProbability *= TeamFormCoef; data.CalculatedProbabilities.TotalUnderProbability /= TeamFormCoef; } else { data.CalculatedProbabilities.TotalUnderProbability *= TeamFormCoef; data.CalculatedProbabilities.TotalOverProbability /= TeamFormCoef; } //away team var awayTeamForm5 = analysisRepo.GetFootballTeamFormByIdAndType(game.SeasonRound.LeagueSeasonId, awayTeamId, TimePeriod.Last5Matches); wins = awayTeamForm5.WinsPercentage; losses = awayTeamForm5.LossesPercentage; draws = awayTeamForm5.DrawsPercentage; medianProbability = Math.Max(Math.Min(wins, losses), Math.Min(Math.Max(wins, losses), draws)); if (wins > medianProbability) { data.CalculatedProbabilities.AwayWinProbability *= TeamFormCoef; } else if (wins < medianProbability) { data.CalculatedProbabilities.AwayWinProbability /= TeamFormCoef; } if (losses > medianProbability) { data.CalculatedProbabilities.HomeWinProbability *= TeamFormCoef; } else if (losses < medianProbability) { data.CalculatedProbabilities.HomeWinProbability /= TeamFormCoef; } if (draws > medianProbability) { data.CalculatedProbabilities.DrawProbability *= TeamFormCoef; } else if (draws < medianProbability) { data.CalculatedProbabilities.DrawProbability /= TeamFormCoef; } bttsYes = (double)awayTeamForm5.BTTS_Yes / awayTeamForm5.GamePlayed; bttsNo = (double)awayTeamForm5.BTTS_No / awayTeamForm5.GamePlayed; if (bttsYes > bttsNo) { data.CalculatedProbabilities.BttsYesProbability *= TeamFormCoef; data.CalculatedProbabilities.BttsNoProbability /= TeamFormCoef; } else { data.CalculatedProbabilities.BttsNoProbability *= TeamFormCoef; data.CalculatedProbabilities.BttsYesProbability /= TeamFormCoef; } totalOver = (double)awayTeamForm5.GamesOver2_5 / awayTeamForm5.GamePlayed; totalUnder = (double)awayTeamForm5.GamesUnder2_5 / awayTeamForm5.GamePlayed; if (totalOver > totalUnder) { data.CalculatedProbabilities.TotalOverProbability *= TeamFormCoef; data.CalculatedProbabilities.TotalUnderProbability /= TeamFormCoef; } else { data.CalculatedProbabilities.TotalUnderProbability *= TeamFormCoef; data.CalculatedProbabilities.TotalOverProbability /= TeamFormCoef; } }
public static void CheckRoundStats(PredictionData data, Game game) { var leagueRepo = new LeagueDataRepository(); var analysisRepo = new AnalysisDataRepository(); var allSeasons = leagueRepo.GetAllLeagueSeasons(leagueRepo.GetLaLiga()).OrderByDescending(s => s.StartYear).ToList(); int currentSeasonId = allSeasons.First().LeagueSeasonId; var currentSeasonRounds = leagueRepo.GetCurrentSeasonRounds(currentSeasonId); currentSeasonRounds = currentSeasonRounds.Where(r => r.RoundNumber <= game.SeasonRound.RoundNumber && CheckRound(r)) .OrderByDescending(r => r.RoundNumber).Take(5).ToList(); var currentSeasonRoundsStats = analysisRepo.GetAverageRoundStats(currentSeasonId); var previousSeasonRoundsStats = allSeasons.Count > 1 ? analysisRepo.GetAverageRoundStats(allSeasons[1].LeagueSeasonId) : null; var previous2SeasonRoundsStats = allSeasons.Count > 2 ? analysisRepo.GetAverageRoundStats(allSeasons[2].LeagueSeasonId) : null; //average var averageHomeWins = (previous2SeasonRoundsStats.HomeWinsCount_Average + previousSeasonRoundsStats.HomeWinsCount_Average) / 2; var averagDraws = (previous2SeasonRoundsStats.DrawsCount_Average + previousSeasonRoundsStats.DrawsCount_Average) / 2; var averageAwayWins = (previous2SeasonRoundsStats.AwayWinsCount_Average + previousSeasonRoundsStats.AwayWinsCount_Average) / 2; var averageBttsYes = (previous2SeasonRoundsStats.BTTS_Yes_Average + previousSeasonRoundsStats.BTTS_Yes_Average) / 2; var averageBttsNo = (previous2SeasonRoundsStats.BTTS_No_Average + previousSeasonRoundsStats.BTTS_No_Average) / 2; var averageTotalOver = (previous2SeasonRoundsStats.GamesOver2_5_Average + previousSeasonRoundsStats.GamesOver2_5_Average) / 2; var averagTotalUnder = (previous2SeasonRoundsStats.GamesUnder2_5_Average + previousSeasonRoundsStats.GamesUnder2_5_Average) / 2; //get maximal diff compared current season with last seasons var currentDiffHomeWins = averageHomeWins - currentSeasonRoundsStats.HomeWinsCount_Average; var currentDiffDraws = averagDraws - currentSeasonRoundsStats.DrawsCount_Average; var currentDiffAwayWins = averageAwayWins - currentSeasonRoundsStats.AwayWinsCount_Average; var currentDiffBttsYes = averageBttsYes - currentSeasonRoundsStats.BTTS_Yes_Average; var currentDiffBttsNo = averageBttsNo - currentSeasonRoundsStats.BTTS_No_Average; var currentDiffTotalOver = averageTotalOver - currentSeasonRoundsStats.GamesOver2_5_Average; var currentDiffTotalUnder = averagTotalUnder - currentSeasonRoundsStats.GamesUnder2_5_Average; var maxDiff = currentDiffHomeWins; if (currentDiffDraws > maxDiff) { maxDiff = currentDiffDraws; } if (currentDiffAwayWins > maxDiff) { maxDiff = currentDiffAwayWins; } if (maxDiff == currentDiffHomeWins) { data.CalculatedProbabilities.HomeWinProbability *= RoundStatsCoef; } if (maxDiff == currentDiffDraws) { data.CalculatedProbabilities.DrawProbability *= RoundStatsCoef; } if (maxDiff == currentDiffAwayWins) { data.CalculatedProbabilities.AwayWinProbability *= RoundStatsCoef; } maxDiff = currentDiffBttsYes; if (currentDiffBttsNo > maxDiff) { maxDiff = currentDiffBttsNo; } if (maxDiff == currentDiffBttsYes) { data.CalculatedProbabilities.BttsYesProbability *= RoundStatsCoef; } if (maxDiff == currentDiffBttsNo) { data.CalculatedProbabilities.BttsNoProbability *= RoundStatsCoef; } maxDiff = currentDiffTotalOver; if (currentDiffTotalUnder > maxDiff) { maxDiff = currentDiffTotalUnder; } if (maxDiff == currentDiffTotalOver) { data.CalculatedProbabilities.TotalOverProbability *= RoundStatsCoef; } if (maxDiff == currentDiffTotalUnder) { data.CalculatedProbabilities.TotalUnderProbability *= RoundStatsCoef; } //get maximal diff compared last 5 rounds with last seasons currentDiffHomeWins = 0; currentDiffDraws = 0; currentDiffAwayWins = 0; currentDiffBttsYes = 0; currentDiffBttsNo = 0; currentDiffTotalOver = 0; currentDiffTotalUnder = 0; int i = 1; foreach (var round in currentSeasonRounds) { currentDiffHomeWins += (averageHomeWins - round.HomeWinsCount) / i; currentDiffDraws += (averagDraws - round.DrawsCount) / i; currentDiffAwayWins += (averageAwayWins - round.AwayWinsCount) / i; currentDiffBttsYes += (averageBttsYes - round.BTTS_Yes) / i; currentDiffBttsNo += (averageBttsNo - round.BTTS_No) / i; currentDiffTotalOver += (averageTotalOver - round.GamesOver2_5) / i; currentDiffTotalUnder += (averagTotalUnder - round.GamesUnder2_5) / i; i++; } maxDiff = currentDiffHomeWins; if (currentDiffDraws > maxDiff) { maxDiff = currentDiffDraws; } if (currentDiffAwayWins > maxDiff) { maxDiff = currentDiffAwayWins; } if (maxDiff == currentDiffHomeWins) { data.CalculatedProbabilities.HomeWinProbability *= RoundStatsCoefLastRounds; } if (maxDiff == currentDiffDraws) { data.CalculatedProbabilities.DrawProbability *= RoundStatsCoefLastRounds; } if (maxDiff == currentDiffAwayWins) { data.CalculatedProbabilities.AwayWinProbability *= RoundStatsCoefLastRounds; } maxDiff = currentDiffBttsYes; if (currentDiffBttsNo > maxDiff) { maxDiff = currentDiffBttsNo; } if (maxDiff == currentDiffBttsYes) { data.CalculatedProbabilities.BttsYesProbability *= RoundStatsCoefLastRounds; } if (maxDiff == currentDiffBttsNo) { data.CalculatedProbabilities.BttsNoProbability *= RoundStatsCoefLastRounds; } maxDiff = currentDiffTotalOver; if (currentDiffTotalUnder > maxDiff) { maxDiff = currentDiffTotalUnder; } if (maxDiff == currentDiffTotalOver) { data.CalculatedProbabilities.TotalOverProbability *= RoundStatsCoefLastRounds; } if (maxDiff == currentDiffTotalUnder) { data.CalculatedProbabilities.TotalUnderProbability *= RoundStatsCoefLastRounds; } }