Ejemplo n.º 1
0
def fixture_player_teams(seasons=CHECK_SEASONS, session=session):
    """Check players who played in a match are labelled as playing for either
    the home team or the away team.
    
    Keyword Arguments:
        seasons {[type]} -- seasons to check (default: {CHECK_SEASONS})
        session {SQLAlchemy session} -- DB session (default:
        airsenal.framework.schema.session)
    """
    print("Checking player teams match fixture teams...\n")
    n_error = 0

    for season in seasons:
        fixtures = get_fixtures_for_season(season=season)

        for fixture in fixtures:
            player_scores = get_player_scores_for_fixture(fixture)

            for score in player_scores:
                if not ((score.player_team == fixture.home_team) or
                        (score.player_team == fixture.away_team)):
                    n_error += 1
                    print(
                        "{}: {} in player_scores but labelled as playing for {}."
                        .format(fixture_string(fixture), score.player.name,
                                score.player_team))

    print("\n", result_string(n_error))
    return n_error
Ejemplo n.º 2
0
def fixture_num_assists(seasons=CHECK_SEASONS, session=session):
    """Check number of assists is less than or equal to number of goals
    for home and away team in each fixture.
    Less than or equal to as some goals do not result in an assist being
    awarded.

    Keyword Arguments:
        seasons {[type]} -- seasons to check (default: {CHECK_SEASONS})
        session {SQLAlchemy session} -- DB session (default:
        airsenal.framework.schema.session)
    """
    print("Checking no. assists less than or equal to no. goals...\n")
    n_error = 0

    for season in seasons:
        fixtures = get_fixtures_for_season(season=season)

        for fixture in fixtures:
            result = get_result_for_fixture(fixture)

            if result:
                result = result[0]
                home_scores = (
                    session.query(PlayerScore)
                    .filter_by(fixture=fixture, player_team=fixture.home_team)
                    .all()
                )

                away_scores = (
                    session.query(PlayerScore)
                    .filter_by(fixture=fixture, player_team=fixture.away_team)
                    .all()
                )

                home_assists = sum([score.assists for score in home_scores])
                away_assists = sum([score.assists for score in away_scores])

                if home_assists > result.home_score:
                    n_error += 1
                    print(
                        "{}: Player assists sum to {} but {} goals in result for home team".format(
                            fixture_string(fixture, result),
                            home_assists,
                            result.home_score,
                        )
                    )

                if away_assists > result.away_score:
                    n_error += 1
                    print(
                        "{}: Player assists sum to {} but {} goals in result for away team".format(
                            fixture_string(fixture, result),
                            away_assists,
                            result.away_score,
                        )
                    )

    print("\n", result_string(n_error))
    return n_error
Ejemplo n.º 3
0
def fixture_num_conceded(seasons=CHECK_SEASONS, session=session):
    """Check number of goals concdeded equals goals scored by opposition if 
    player played whole match (90 minutes).
    NB: only checks max of player conceded values to avoid potential issues
    with substitutes and goals in stoppage time.
    
    Keyword Arguments:
        seasons {[type]} -- seasons to check (default: {CHECK_SEASONS})
        session {SQLAlchemy session} -- DB session (default:
        airsenal.framework.schema.session)
    """
    print("Checking no. goals conceded matches goals scored by opponent...\n")
    n_error = 0

    for season in seasons:
        fixtures = get_fixtures_for_season(season=season)

        for fixture in fixtures:
            result = get_result_for_fixture(fixture)

            if result:
                result = result[0]
                home_scores = (session.query(PlayerScore).filter_by(
                    fixture=fixture, player_team=fixture.home_team,
                    minutes=90).all())

                away_scores = (session.query(PlayerScore).filter_by(
                    fixture=fixture, player_team=fixture.away_team,
                    minutes=90).all())

                home_conceded = max([score.conceded for score in home_scores])
                away_conceded = max([score.conceded for score in away_scores])

                if home_conceded != result.away_score:
                    n_error += 1
                    print(
                        "{}: Player conceded {} but {} goals in result for home team"
                        .format(
                            fixture_string(fixture, result),
                            home_conceded,
                            result.away_score,
                        ))

                if away_conceded != result.home_score:
                    n_error += 1
                    print(
                        "{}: Player conceded {} but {} goals in result for away team"
                        .format(
                            fixture_string(fixture, result),
                            away_conceded,
                            result.home_score,
                        ))

    print("\n", result_string(n_error))
    return n_error
def fixture_num_goals(seasons=CHECK_SEASONS, session=session):
    """Check individual player goals sum to match result for each fixture.

    Keyword Arguments:
        seasons {[type]} -- seasons to check (default: {CHECK_SEASONS})
        session {SQLAlchemy session} -- DB session (default:
        airsenal.framework.schema.session)
    """
    print("Checking sum of player goals equals match results...\n")
    n_error = 0

    for season in seasons:
        fixtures = get_fixtures_for_season(season=season)

        for fixture in fixtures:
            result = fixture.result

            if result:
                home_scores = (session.query(PlayerScore).filter_by(
                    fixture=fixture, player_team=fixture.home_team).all())

                away_scores = (session.query(PlayerScore).filter_by(
                    fixture=fixture, player_team=fixture.away_team).all())

                home_goals = sum(score.goals for score in home_scores) + sum(
                    score.own_goals for score in away_scores)

                away_goals = sum(score.goals for score in away_scores) + sum(
                    score.own_goals for score in home_scores)

                if home_goals != result.home_score:
                    n_error += 1
                    msg = (
                        "{}: Player scores sum to {} but {} goals in result "
                        "for home team").format(
                            result,
                            home_goals,
                            result.home_score,
                        )
                    print(msg)

                if away_goals != result.away_score:
                    n_error += 1
                    msg = (
                        "{}: Player scores sum to {} but {} goals in result "
                        "for away team").format(
                            result,
                            away_goals,
                            result.away_score,
                        )
                    print(msg)

    print("\n", result_string(n_error))
    return n_error
Ejemplo n.º 5
0
def fixture_num_players(seasons=CHECK_SEASONS, session=session):
    """Check each fixture has between 11 and 14 players  with at least 1 minute
    in player_scores.

    Keyword Arguments:
        seasons {[type]} -- seasons to check (default: {CHECK_SEASONS})
        session {SQLAlchemy session} -- DB session (default:
        airsenal.framework.schema.session)
    """
    print("Checking 11 to 14 players play per team in each fixture...\n")
    n_error = 0

    for season in seasons:
        fixtures = get_fixtures_for_season(season=season)

        for fixture in fixtures:
            result = get_result_for_fixture(fixture)

            if result:
                result = result[0]
                home_scores = (
                    session.query(PlayerScore)
                    .filter_by(fixture=fixture, player_team=fixture.home_team)
                    .filter(PlayerScore.minutes > 0)
                    .all()
                )

                away_scores = (
                    session.query(PlayerScore)
                    .filter_by(fixture=fixture, player_team=fixture.away_team)
                    .filter(PlayerScore.minutes > 0)
                    .all()
                )

                if not ((len(home_scores) > 10) and (len(home_scores) < 15)):
                    n_error += 1
                    print(
                        "{}: {} players with minutes > 0 for home team.".format(
                            fixture_string(fixture, result), len(home_scores)
                        )
                    )

                if not ((len(away_scores) > 10) and (len(away_scores) < 15)):
                    n_error += 1
                    print(
                        "{}: {} players with minutes > 0 for away team.".format(
                            fixture_string(fixture, result), len(away_scores)
                        )
                    )

    print("\n", result_string(n_error))
    return n_error
def fixture_num_players(seasons=CHECK_SEASONS, session=session):
    """Check each fixture has between 11 and 14 players  with at least 1 minute
    in player_scores. For season 19/20 it can be up to 16 players.

    Keyword Arguments:
        seasons {[type]} -- seasons to check (default: {CHECK_SEASONS})
        session {SQLAlchemy session} -- DB session (default:
        airsenal.framework.schema.session)
    """
    print(
        "Checking 11 to 14 players play per team in each fixture...\n"
        "Note:\n"
        "- 2019/20: 5 subs allowed after Covid-19 lockdown (accounted for in checks)\n"
        "- From 2020/21: Concussion subs allowed (may cause false errors)\n")
    n_error = 0

    for season in seasons:
        fixtures = get_fixtures_for_season(season=season)

        for fixture in fixtures:
            result = fixture.result

            if result:
                home_scores = (session.query(PlayerScore).filter_by(
                    fixture=fixture, player_team=fixture.home_team).filter(
                        PlayerScore.minutes > 0).all())

                away_scores = (session.query(PlayerScore).filter_by(
                    fixture=fixture, player_team=fixture.away_team).filter(
                        PlayerScore.minutes > 0).all())

                # Rule change due to shorter season
                if fixture.season == "1920" and int(fixture.gameweek) >= 39:
                    upper_team_limit = 16
                else:
                    upper_team_limit = 14

                if not ((len(home_scores) > 10) and
                        (len(home_scores) <= upper_team_limit)):
                    n_error += 1
                    print("{}: {} players with minutes > 0 for home team.".
                          format(result, len(home_scores)))

                if not ((len(away_scores) > 10) and
                        (len(away_scores) <= upper_team_limit)):
                    n_error += 1
                    print("{}: {} players with minutes > 0 for away team.".
                          format(result, len(away_scores)))

    print("\n", result_string(n_error))
    return n_error
Ejemplo n.º 7
0
def season_num_fixtures(seasons=CHECK_SEASONS, session=session):
    """Check each season has 380 fixtures.
    
    Keyword Arguments:
        seasons {list} -- seasons to check (default: CHECK_SEASONS)
        session {SQLAlchemy session} -- DB session (default:
        airsenal.framework.schema.session)
    """
    print("Checking seasons have 380 fixtures...\n")
    n_error = 0

    for season in seasons:
        fixtures = get_fixtures_for_season(season=season)
        if len(fixtures) != 380:
            n_error += 1
            print("Number of fixtures in {} season is {} (not 380)".format(
                season, len(fixtures)))

    print("\n", result_string(n_error))
    return n_error