LeagueTablePositionTest.java 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package tests;
  2. import java.time.format.DateTimeFormatter;
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.Optional;
  8. import data.TestDatabase;
  9. import objects.SoccerMatch;
  10. import tests.objects.LeagueDTO;
  11. import tests.objects.Standing;
  12. public class LeagueTablePositionTest extends TestClass {
  13. @Override
  14. public void runTest() {
  15. List<LeagueDTO> prioLeagues = TestDatabase.getInstance().getPrioLeagues();
  16. for (LeagueDTO league : prioLeagues) {
  17. if (league.getName().equals("championship")) {
  18. runLeagueTest(league);
  19. }
  20. }
  21. }
  22. private void runLeagueTest(LeagueDTO league) {
  23. getMatches(league);
  24. }
  25. private void getMatches(LeagueDTO league) {
  26. List<SoccerMatch> matches = TestDatabase.getInstance().getMatches(league);
  27. List<String> seasons = matches.stream().map(SoccerMatch::getSeason).distinct().sorted().toList();
  28. for (String season : seasons.subList(1, seasons.size())) {
  29. List<SoccerMatch> seasonMatches = matches.stream().filter(p -> p.getSeason().equals(season)).toList();
  30. Map<String, Integer> intervals = getIntervals(seasonMatches);
  31. int skipFirstXMatches = 10;
  32. int currentMatch = 0;
  33. int testValue = 0;
  34. seasonMatches = seasonMatches.stream().sorted((m1, m2) -> m1.getGameDate().compareTo(m2.getGameDate()))
  35. .toList();
  36. for (SoccerMatch match : seasonMatches) {
  37. List<Standing> standings = getStandings(
  38. seasonMatches.stream().filter(p -> p.getGameDate().isBefore(match.getGameDate())).toList());
  39. standings = standings.stream().sorted((s1, s2) -> Integer.compare(s2.getPoints(), s1.getPoints()))
  40. .toList();
  41. Optional<Standing> homeTeamStanding = standings.stream()
  42. .filter(p -> p.getTeamName().equals(match.getHomeTeam().getTeamName()))
  43. .findFirst();
  44. Optional<Standing> awayTeamStanding = standings.stream()
  45. .filter(p -> p.getTeamName().equals(match.getAwayTeam().getTeamName()))
  46. .findFirst();
  47. if (homeTeamStanding.isPresent() && awayTeamStanding.isPresent()
  48. && homeTeamStanding.get().getGamesPlayed() >= skipFirstXMatches) {
  49. Standing hts = homeTeamStanding.get();
  50. Standing ats = awayTeamStanding.get();
  51. int homeTeamPosition = standings.indexOf(hts);
  52. int awayTeamPosition = standings.indexOf(ats);
  53. // System.out.println(String.format("%s Hometeam %s position %s Awayteam %s position %s Diff %s", season, hts.getTeamName(),
  54. // homeTeamPosition, ats.getTeamName(), awayTeamPosition, homeTeamPosition - awayTeamPosition));
  55. // standings.forEach(s -> System.out.println(String.format("%s \t\t wins %s \t draws %s \t losses %s \t points %s \t gamesPlayed %s",
  56. // s.getTeamName(), s.getWins(), s.getDraws(), s.getLosses(), s.getPoints(), s.getGamesPlayed())));
  57. List<SoccerMatch> matchesBefore = matches.stream()
  58. .filter(p -> p.getGameDate().isBefore(match.getGameDate())).toList();
  59. matchesBefore = matchesBefore.stream()
  60. .sorted((m1, m2) -> m1.getGameDate().compareTo(m2.getGameDate())).toList();
  61. float avgGoals = getAvgGoalsWithSameDiff(matchesBefore,
  62. Math.abs(homeTeamPosition - awayTeamPosition));
  63. List<Float> leagueAvarages = TestDatabase.getInstance().getLeagueAvarages(
  64. match.getHomeTeam().getTeamLeagueId(),
  65. match.getHomeTeam().getCountryId(),
  66. match.getGameDate().format(DateTimeFormatter.BASIC_ISO_DATE));
  67. if (Math.abs(avgGoals - (leagueAvarages.get(0) + leagueAvarages.get(1))) > 0.5) {
  68. System.out.println(String.format(
  69. "%s homeTeam: %s (%s) - awayTeam: %s (%s) Avg goals with diff %s is %s and leagueAvg is %s makes diff %s intervals is low %s mid %s high %s",
  70. match.getGameDate(), match.getHomeTeam().getTeamName(), homeTeamPosition,
  71. match.getAwayTeam().getTeamName(),
  72. awayTeamPosition, Math.abs(homeTeamPosition - awayTeamPosition), avgGoals,
  73. leagueAvarages.get(0) + leagueAvarages.get(1),
  74. avgGoals - (leagueAvarages.get(0) + leagueAvarages.get(1)),
  75. intervals.get("Low"), intervals.get("Low") + intervals.get("Mid"),
  76. intervals.get("Low") + intervals.get("Mid") + intervals.get("High")));
  77. }
  78. }
  79. }
  80. }
  81. }
  82. private float getAvgGoalsWithSameDiff(List<SoccerMatch> matchesBefore, int placementDiff) {
  83. List<Standing> tempStanding = new ArrayList<>();
  84. float result = 0.0f;
  85. int matchedMatches = 0;
  86. for (SoccerMatch match : matchesBefore) {
  87. Optional<Standing> homeTeamStanding = tempStanding.stream()
  88. .filter(ts -> ts.getTeamName().equals(match.getHomeTeam().getTeamName()))
  89. .findFirst();
  90. Optional<Standing> awayTeamStanding = tempStanding.stream()
  91. .filter(ts -> ts.getTeamName().equals(match.getAwayTeam().getTeamName()))
  92. .findFirst();
  93. if (homeTeamStanding.isPresent() && awayTeamStanding.isPresent()) {
  94. int homeTeamPosition = tempStanding.indexOf(homeTeamStanding.get());
  95. int awayTeamPosition = tempStanding.indexOf(awayTeamStanding.get());
  96. int diff = Math.abs(homeTeamPosition - awayTeamPosition);
  97. if (diff == placementDiff) {
  98. matchedMatches++;
  99. result += match.getHomeScore() + match.getAwayScore();
  100. }
  101. }
  102. updateStanding(tempStanding, match,
  103. tempStanding.stream().filter(p -> p.getTeamName().equals(match.getHomeTeam().getTeamName()))
  104. .findFirst(),
  105. tempStanding.stream().filter(p -> p.getTeamName().equals(match.getAwayTeam().getTeamName()))
  106. .findFirst());
  107. tempStanding.sort((s1, s2) -> Integer.compare(s2.getPoints(), s1.getPoints()));
  108. }
  109. return matchedMatches > 0 ? result / matchedMatches : 0f;
  110. }
  111. private Map<String, Integer> getIntervals(List<SoccerMatch> seasonMatches) {
  112. Map<String, Integer> result = new HashMap<>();
  113. List<String> teams = seasonMatches.stream().map(m -> m.getHomeTeam().getTeamName()).distinct().toList();
  114. result.put("Low", (int) Math.floor(teams.size() / 3.0));
  115. result.put("Mid", (int) Math.ceil(teams.size() / 3.0));
  116. result.put("High", (int) Math.floor(teams.size() / 3.0));
  117. return result;
  118. }
  119. }