Top

mlbgame.game module

Module that is used for getting basic information about a game such as the scoreboard and the box score.

#!/usr/bin/env python

"""Module that is used for getting basic information about a game
such as the scoreboard and the box score.
"""

import datetime
import lxml.etree as etree

import mlbgame.data
import mlbgame.object


def scoreboard(year, month, day, home=None, away=None):
    """Return the scoreboard information for games matching the parameters
    as a dictionary.
    """
    # get data
    data = mlbgame.data.get_scoreboard(year, month, day)
    # parse data
    parsed = etree.parse(data)
    root = parsed.getroot()
    games = {}
    output = {}
    # loop through games
    for game in root:
        if game.tag == 'data':
            return []
        # get team names
        teams = game.findall('team')
        home_name = teams[0].attrib['name']
        away_name = teams[1].attrib['name']
        # check if teams match parameters
        if (home_name == home and home is not None) \
                or (away_name == away and away is not None) \
                or (away is None and home is None):
            # throw all the data into a complicated dictionary
            game_tag = game.tag
            game_data = game.find('game')
            game_id = game_data.attrib['id']
            game_league = game_data.attrib['league']
            game_status = game_data.attrib['status']
            game_start_time = game_data.attrib['start_time']
            home_team_data = teams[0].find('gameteam')
            home_team = home_name
            home_team_runs = int(home_team_data.attrib['R'])
            home_team_hits = int(home_team_data.attrib['H'])
            home_team_errors = int(home_team_data.attrib['E'])
            away_team_data = teams[1].find('gameteam')
            away_team = away_name
            away_team_runs = int(away_team_data.attrib['R'])
            away_team_hits = int(away_team_data.attrib['H'])
            away_team_errors = int(away_team_data.attrib['E'])
            # check type of game
            if game_tag == 'go_game' or game_tag == 'ig_game':
                try:
                    w_pitcher_data = game.find('w_pitcher')
                    w_pitcher = w_pitcher_data.find('pitcher').attrib['name']
                    w_pitcher_wins = int(w_pitcher_data.attrib['wins'])
                    w_pitcher_losses = int(w_pitcher_data.attrib['losses'])
                except Exception:
                    w_pitcher = ""
                    w_pitcher_wins = 0
                    w_pitcher_losses = 0
                try:
                    l_pitcher_data = game.find('l_pitcher')
                    l_pitcher = l_pitcher_data.find('pitcher').attrib['name']
                    l_pitcher_wins = int(l_pitcher_data.attrib['wins'])
                    l_pitcher_losses = int(l_pitcher_data.attrib['losses'])
                except Exception:
                    l_pitcher = ""
                    l_pitcher_wins = 0
                    l_pitcher_losses = 0
                try:
                    sv_pitcher_data = game.find('sv_pitcher')
                    sv_pitcher = sv_pitcher_data.find('pitcher').attrib['name']
                    sv_pitcher_saves = int(sv_pitcher_data.attrib['saves'])
                except Exception:
                    sv_pitcher = ""
                    sv_pitcher_saves = 0
                output = {
                    'game_id': game_id,
                    'game_tag': game_tag,
                    'game_league': game_league,
                    'game_status': game_status,
                    'game_start_time': game_start_time,
                    'home_team': home_team,
                    'home_team_runs': home_team_runs,
                    'home_team_hits': home_team_hits,
                    'home_team_errors': home_team_errors,
                    'away_team': away_team,
                    'away_team_runs': away_team_runs,
                    'away_team_hits': away_team_hits,
                    'away_team_errors': away_team_errors,
                    'w_pitcher': w_pitcher,
                    'w_pitcher_wins': w_pitcher_wins,
                    'w_pitcher_losses': w_pitcher_losses,
                    'l_pitcher': l_pitcher,
                    'l_pitcher_wins': l_pitcher_wins,
                    'l_pitcher_losses': l_pitcher_losses,
                    'sv_pitcher': sv_pitcher,
                    'sv_pitcher_saves': sv_pitcher_saves
                }
            # games that were not played
            elif game_tag == 'sg_game':
                try:
                    p_pitcher_data = game.findall('p_pitcher')
                    p_pitcher_home_data = p_pitcher_data[0]
                    p_pitcher_home = p_pitcher_home_data.find(
                        'pitcher').attrib['name']
                    p_pitcher_home_wins = int(p_pitcher_home_data.
                                              attrib['wins'])
                    p_pitcher_home_losses = int(p_pitcher_home_data.
                                                attrib['losses'])
                    p_pitcher_away_data = p_pitcher_data[1]
                    p_pitcher_away = p_pitcher_away_data.find(
                        'pitcher').attrib['name']
                    p_pitcher_away_wins = int(p_pitcher_away_data.
                                              attrib['wins'])
                    p_pitcher_away_losses = int(p_pitcher_away_data.
                                                attrib['losses'])
                except Exception:
                    p_pitcher_home = ''
                    p_pitcher_home_wins = 0
                    p_pitcher_home_losses = 0
                    p_pitcher_away = ''
                    p_pitcher_away_wins = 0
                    p_pitcher_away_losses = 0
                output = {
                    'game_id': game_id,
                    'game_tag': game_tag,
                    'game_league': game_league,
                    'game_status': game_status,
                    'game_start_time': game_start_time,
                    'home_team': home_team,
                    'home_team_runs': home_team_runs,
                    'home_team_hits': home_team_hits,
                    'home_team_errors': home_team_errors,
                    'away_team': away_team,
                    'away_team_runs': away_team_runs,
                    'away_team_hits': away_team_hits,
                    'away_team_errors': away_team_errors,
                    'p_pitcher_home': p_pitcher_home,
                    'p_pitcher_home_wins': p_pitcher_home_wins,
                    'p_pitcher_home_losses': p_pitcher_home_losses,
                    'p_pitcher_away': p_pitcher_away,
                    'p_pitcher_away_wins': p_pitcher_away_wins,
                    'p_pitcher_away_losses': p_pitcher_away_losses
                }
            # put this dictionary into the larger dictionary
            games[game_id] = output
    return games


class GameScoreboard(object):
    """Object to hold scoreboard information about a certain game.

    Properties:
        away_team
        away_team_errors
        away_team_hits
        away_team_runs
        date
        game_id
        game_league
        game_start_time
        game_status
        game_tag
        home_team
        home_team_errors
        home_team_hits
        home_team_runs
        l_pitcher
        l_pitcher_losses
        l_pitcher_wins
        l_team
        sv_pitcher
        sv_pitcher_saves
        w_pitcher
        w_pitcher_losses
        w_pitcher_wins
        w_team
    """

    def __init__(self, data):
        """Creates a `GameScoreboard` object.

        data is expected to come from the `scoreboard()` function.
        """
        # loop through data
        for x in data:
            # set information as correct data type
            try:
                setattr(self, x, int(data[x]))
            except ValueError:
                try:
                    setattr(self, x, float(data[x]))
                except ValueError:
                    # string if not number
                    setattr(self, x, str(data[x]))
        # calculate the winning team
        if self.home_team_runs > self.away_team_runs:
            self.w_team = self.home_team
            self.l_team = self.away_team
        elif self.away_team_runs > self.home_team_runs:
            self.w_team = self.away_team
            self.l_team = self.home_team
        # create a datetime object that represents the game start time
        # the object has no timezone info but should be interpreted as
        # being in the US/Eastern timezone
        year, month, day = self.game_id.split('_')[:3]
        game_start_date = "/".join([year, month, day])
        game_start_time = self.game_start_time.replace(' ', '')
        self.date = datetime.datetime.strptime(
                " ".join([game_start_date, game_start_time]),
                "%Y/%m/%d %I:%M%p")

    def nice_score(self):
        """Return a nicely formatted score of the game."""
        return ('{0.away_team} ({0.away_team_runs}) at '
                '{0.home_team} ({0.home_team_runs})').format(self)

    def __str__(self):
        return self.nice_score()


def box_score(game_id):
    """Gets the box score information for the game with matching id."""
    # get data
    data = mlbgame.data.get_box_score(game_id)
    # parse data
    parsed = etree.parse(data)
    root = parsed.getroot()
    linescore = root.find('linescore')
    result = dict()
    result['game_id'] = game_id
    # loop through innings and add them to output
    for x in linescore:
        inning = x.attrib['inning']
        home = x.attrib['home']
        away = x.attrib['away']
        result[int(inning)] = {'home': home, 'away': away}
    return result


class GameBoxScore(object):
    """Object to hold the box score of a certain game.

    Properties:
        game_id
        innings:
            inning
            home
            away
    """

    def __init__(self, data):
        """Creates a `GameBoxScore` object.

        data is expected to come from the `box_score()` function.
        """
        self.game_id = data['game_id']
        data.pop('game_id', None)
        # dictionary of innings
        self.innings = []
        # loops through the innings
        for x in sorted(data):
            try:
                result = {'inning': int(x),
                          'home': int(data[x]['home']),
                          'away': int(data[x]['away'])
                          }
            # possible error when 9th innning home team has 'x'
            # becuase they did not bat
            except ValueError:
                result = {
                    'inning': int(x),
                    'home': data[x]['home'],
                    'away': int(data[x]['away'])
                }
            self.innings.append(result)

    def __iter__(self):
        """Allows object to be iterated over."""
        for x in self.innings:
            yield x

    def __enumerate_scoreboard(self, data):
        output = ''
        for y, x in enumerate(data, start=1):
            if y >= 10:
                output += str(x) + '  '
            else:
                output += str(x) + ' '
        return output

    def print_scoreboard(self):
        """Print object as a scoreboard."""
        output = ''
        # parallel dictionaries with innings and scores
        innings = []
        away = []
        home = []
        for x in self:
            innings.append(x['inning'])
            away.append(x['away'])
            home.append(x['home'])
        # go through all the information and make a nice output
        # that looks like a scoreboard
        output += 'Inning\t'
        for x in innings:
            output += str(x) + ' '
        output += '\n'
        for x in innings:
            output += '---'
        output += '\nAway\t' + self.__enumerate_scoreboard(away)
        output += '\nHome\t' + self.__enumerate_scoreboard(home)
        return output


def overview(game_id):
    """Gets the overview information for the game with matching id."""
    # get data
    overview = mlbgame.data.get_overview(game_id)
    raw_box_score = mlbgame.data.get_raw_box_score(game_id)
    # parse data
    overview_root = etree.parse(overview).getroot()
    raw_box_score_root = etree.parse(raw_box_score).getroot()

    output = {}
    # get overview attributes
    for x in overview_root.attrib:
        output[x] = overview_root.attrib[x]
    # get raw box score attributes
    for x in raw_box_score_root.attrib:
        output[x] = raw_box_score_root.attrib[x]

    # Get probable starter attributes if they exist
    home_pitcher_tree = overview_root.find('home_probable_pitcher')
    if home_pitcher_tree is not None:
        output.update(build_namespaced_attributes(
            'home_probable_pitcher', home_pitcher_tree))
    else:
        output.update(build_probable_starter_defaults('home'))

    away_pitcher_tree = overview_root.find('away_probable_pitcher')
    if away_pitcher_tree is not None:
        output.update(build_namespaced_attributes(
            'away_probable_pitcher', away_pitcher_tree))
    else:
        output.update(build_probable_starter_defaults('away'))

    return output


def build_namespaced_attributes(name, tree):
    output = {}
    for attr in tree.attrib:
        output[name + '_' + attr] = tree.attrib[attr]
    return output


def build_probable_starter_defaults(name):
    output = {}
    output[name + '_probable_pitcher_era'] = ''
    output[name + '_probable_pitcher_first'] = ''
    output[name + '_probable_pitcher_first_name'] = ''
    output[name + '_probable_pitcher_id'] = ''
    output[name + '_probable_pitcher_last'] = ''
    output[name + '_probable_pitcher_last_name'] = ''
    output[name + '_probable_pitcher_losses'] = ''
    output[name + '_probable_pitcher_name_display_roster'] = ''
    output[name + '_probable_pitcher_number'] = ''
    output[name + '_probable_pitcher_s_era'] = ''
    output[name + '_probable_pitcher_s_losses'] = ''
    output[name + '_probable_pitcher_s_wins'] = ''
    output[name + '_probable_pitcher_stats_season'] = ''
    output[name + '_probable_pitcher_stats_type'] = ''
    output[name + '_probable_pitcher_throwinghand'] = ''
    output[name + '_probable_pitcher_wins'] = ''
    return output


class Overview(mlbgame.object.Object):
    """Object to hold an overview of game information

    Properties:
        ampm
        attendance
        aw_lg_ampm
        away_ampm
        away_code
        away_division
        away_file_code
        away_games_back
        away_games_back_wildcard
        away_league_id
        away_loss
        away_name_abbrev
        away_preview_link
        away_probable_pitcher_era
        away_probable_pitcher_first
        away_probable_pitcher_first_name
        away_probable_pitcher_id
        away_probable_pitcher_last
        away_probable_pitcher_last_name
        away_probable_pitcher_losses
        away_probable_pitcher_name_display_roster
        away_probable_pitcher_number
        away_probable_pitcher_s_era
        away_probable_pitcher_s_losses
        away_probable_pitcher_s_wins
        away_probable_pitcher_stats_season
        away_probable_pitcher_stats_type
        away_probable_pitcher_throwinghand
        away_probable_pitcher_wins
        away_recap_link
        away_sport_code
        away_team_city
        away_team_errors
        away_team_hits
        away_team_id
        away_team_name
        away_team_runs
        away_time
        away_time_zone
        away_win
        balls
        date
        day
        double_header_sw
        elapsed_time
        first_pitch_et
        game_data_directory
        game_id
        game_nbr
        game_pk
        game_type
        gameday_link
        gameday_sw
        hm_lg_ampm
        home_ampm
        home_code
        home_division
        home_file_code
        home_games_back
        home_games_back_wildcard
        home_league_id
        home_loss
        home_name_abbrev
        home_preview_link
        home_probable_pitcher_era
        home_probable_pitcher_first
        home_probable_pitcher_first_name
        home_probable_pitcher_id
        home_probable_pitcher_last
        home_probable_pitcher_last_name
        home_probable_pitcher_losses
        home_probable_pitcher_name_display_roster
        home_probable_pitcher_number
        home_probable_pitcher_s_era
        home_probable_pitcher_s_losses
        home_probable_pitcher_s_wins
        home_probable_pitcher_stats_season
        home_probable_pitcher_stats_type
        home_probable_pitcher_throwinghand
        home_probable_pitcher_wins
        home_recap_link
        home_sport_code
        home_team_city
        home_team_errors
        home_team_hits
        home_team_id
        home_team_name
        home_team_runs
        home_time
        home_time_zone
        home_win
        id
        ind
        inning
        inning_state
        is_no_hitter
        is_perfect_game
        league
        location
        note
        official_scorer
        original_date
        outs
        photos_link
        preview
        scheduled_innings
        start_time
        status
        status_ind
        strikes
        tbd_flag
        tiebreaker_sw
        time
        time_aw_lg
        time_date
        time_date_aw_lg
        time_date_hm_lg
        time_hm_lg
        time_zone
        time_zone_aw_lg
        time_zone_hm_lg
        top_inning
        tv_station
        tz_aw_lg_gen
        tz_hm_lg_gen
        venue
        venue_id
        venue_name
        venue_w_chan_loc
        weather
        wind
        wrapup_link
    """
    pass


def players(game_id):
    """Gets player/coach/umpire information for the game with matching id."""
    # get data
    data = mlbgame.data.get_players(game_id)
    # parse data
    parsed = etree.parse(data)
    root = parsed.getroot()

    output = {}
    output['game_id'] = game_id

    # get player/coach data
    for team in root.findall('team'):
        type = team.attrib['type'] + "_team"
        # the type is either home_team or away_team
        output[type] = {}
        output[type]['players'] = []
        output[type]['coaches'] = []

        for p in team.findall('player'):
            player = {}
            for key in p.keys():
                player[key] = p.get(key)
            output[type]['players'].append(player)

        for c in team.findall('coach'):
            coach = {}
            for key in c.keys():
                coach[key] = c.get(key)
            output[type]['coaches'].append(coach)

    # get umpire data
    output['umpires'] = []
    for u in root.find('umpires').findall('umpire'):
        umpire = {}
        for key in u.keys():
            umpire[key] = u.get(key)
        output['umpires'].append(umpire)

    return output


class Players(object):
    """Object to hold player/coach/umpire information for a game.

    Properties:
        away_coaches
        away_players
        game_id
        home_coaches
        home_players
        umpires
    """

    def __init__(self, data):
        """Creates a players object that matches the corresponding info in `data`.
        `data` should be an dictionary of values.
        """
        self.game_id = data['game_id']
        self.home_players = [Player(x) for x in data['home_team']['players']]
        self.home_coaches = [Coach(x) for x in data['home_team']['coaches']]
        self.away_players = [Player(x) for x in data['away_team']['players']]
        self.away_coaches = [Coach(x) for x in data['away_team']['coaches']]
        self.umpires = [Umpire(x) for x in data['umpires']]


class Player(mlbgame.object.Object):
    """Object to hold player information

    Properties:
        avg
        bats
        boxname
        current_position
        era
        first
        hr
        id
        last
        losses
        num
        parent_team_abbrev
        parent_team_id
        position
        rbi
        rl
        status
        team_abbrev
        team_id
        wins
    """
    pass


class Coach(mlbgame.object.Object):
    """Object to hold coach information

    Properties:
        first
        id
        last
        num
        position
    """
    pass


class Umpire(mlbgame.object.Object):
    """Object to hold umpire information

    Properties:
        first
        id
        last
        name
        position
    """
    pass

Functions

def box_score(

game_id)

Gets the box score information for the game with matching id.

def box_score(game_id):
    """Gets the box score information for the game with matching id."""
    # get data
    data = mlbgame.data.get_box_score(game_id)
    # parse data
    parsed = etree.parse(data)
    root = parsed.getroot()
    linescore = root.find('linescore')
    result = dict()
    result['game_id'] = game_id
    # loop through innings and add them to output
    for x in linescore:
        inning = x.attrib['inning']
        home = x.attrib['home']
        away = x.attrib['away']
        result[int(inning)] = {'home': home, 'away': away}
    return result

def build_namespaced_attributes(

name, tree)

def build_namespaced_attributes(name, tree):
    output = {}
    for attr in tree.attrib:
        output[name + '_' + attr] = tree.attrib[attr]
    return output

def build_probable_starter_defaults(

name)

def build_probable_starter_defaults(name):
    output = {}
    output[name + '_probable_pitcher_era'] = ''
    output[name + '_probable_pitcher_first'] = ''
    output[name + '_probable_pitcher_first_name'] = ''
    output[name + '_probable_pitcher_id'] = ''
    output[name + '_probable_pitcher_last'] = ''
    output[name + '_probable_pitcher_last_name'] = ''
    output[name + '_probable_pitcher_losses'] = ''
    output[name + '_probable_pitcher_name_display_roster'] = ''
    output[name + '_probable_pitcher_number'] = ''
    output[name + '_probable_pitcher_s_era'] = ''
    output[name + '_probable_pitcher_s_losses'] = ''
    output[name + '_probable_pitcher_s_wins'] = ''
    output[name + '_probable_pitcher_stats_season'] = ''
    output[name + '_probable_pitcher_stats_type'] = ''
    output[name + '_probable_pitcher_throwinghand'] = ''
    output[name + '_probable_pitcher_wins'] = ''
    return output

def overview(

game_id)

Gets the overview information for the game with matching id.

def overview(game_id):
    """Gets the overview information for the game with matching id."""
    # get data
    overview = mlbgame.data.get_overview(game_id)
    raw_box_score = mlbgame.data.get_raw_box_score(game_id)
    # parse data
    overview_root = etree.parse(overview).getroot()
    raw_box_score_root = etree.parse(raw_box_score).getroot()

    output = {}
    # get overview attributes
    for x in overview_root.attrib:
        output[x] = overview_root.attrib[x]
    # get raw box score attributes
    for x in raw_box_score_root.attrib:
        output[x] = raw_box_score_root.attrib[x]

    # Get probable starter attributes if they exist
    home_pitcher_tree = overview_root.find('home_probable_pitcher')
    if home_pitcher_tree is not None:
        output.update(build_namespaced_attributes(
            'home_probable_pitcher', home_pitcher_tree))
    else:
        output.update(build_probable_starter_defaults('home'))

    away_pitcher_tree = overview_root.find('away_probable_pitcher')
    if away_pitcher_tree is not None:
        output.update(build_namespaced_attributes(
            'away_probable_pitcher', away_pitcher_tree))
    else:
        output.update(build_probable_starter_defaults('away'))

    return output

def players(

game_id)

Gets player/coach/umpire information for the game with matching id.

def players(game_id):
    """Gets player/coach/umpire information for the game with matching id."""
    # get data
    data = mlbgame.data.get_players(game_id)
    # parse data
    parsed = etree.parse(data)
    root = parsed.getroot()

    output = {}
    output['game_id'] = game_id

    # get player/coach data
    for team in root.findall('team'):
        type = team.attrib['type'] + "_team"
        # the type is either home_team or away_team
        output[type] = {}
        output[type]['players'] = []
        output[type]['coaches'] = []

        for p in team.findall('player'):
            player = {}
            for key in p.keys():
                player[key] = p.get(key)
            output[type]['players'].append(player)

        for c in team.findall('coach'):
            coach = {}
            for key in c.keys():
                coach[key] = c.get(key)
            output[type]['coaches'].append(coach)

    # get umpire data
    output['umpires'] = []
    for u in root.find('umpires').findall('umpire'):
        umpire = {}
        for key in u.keys():
            umpire[key] = u.get(key)
        output['umpires'].append(umpire)

    return output

def scoreboard(

year, month, day, home=None, away=None)

Return the scoreboard information for games matching the parameters as a dictionary.

def scoreboard(year, month, day, home=None, away=None):
    """Return the scoreboard information for games matching the parameters
    as a dictionary.
    """
    # get data
    data = mlbgame.data.get_scoreboard(year, month, day)
    # parse data
    parsed = etree.parse(data)
    root = parsed.getroot()
    games = {}
    output = {}
    # loop through games
    for game in root:
        if game.tag == 'data':
            return []
        # get team names
        teams = game.findall('team')
        home_name = teams[0].attrib['name']
        away_name = teams[1].attrib['name']
        # check if teams match parameters
        if (home_name == home and home is not None) \
                or (away_name == away and away is not None) \
                or (away is None and home is None):
            # throw all the data into a complicated dictionary
            game_tag = game.tag
            game_data = game.find('game')
            game_id = game_data.attrib['id']
            game_league = game_data.attrib['league']
            game_status = game_data.attrib['status']
            game_start_time = game_data.attrib['start_time']
            home_team_data = teams[0].find('gameteam')
            home_team = home_name
            home_team_runs = int(home_team_data.attrib['R'])
            home_team_hits = int(home_team_data.attrib['H'])
            home_team_errors = int(home_team_data.attrib['E'])
            away_team_data = teams[1].find('gameteam')
            away_team = away_name
            away_team_runs = int(away_team_data.attrib['R'])
            away_team_hits = int(away_team_data.attrib['H'])
            away_team_errors = int(away_team_data.attrib['E'])
            # check type of game
            if game_tag == 'go_game' or game_tag == 'ig_game':
                try:
                    w_pitcher_data = game.find('w_pitcher')
                    w_pitcher = w_pitcher_data.find('pitcher').attrib['name']
                    w_pitcher_wins = int(w_pitcher_data.attrib['wins'])
                    w_pitcher_losses = int(w_pitcher_data.attrib['losses'])
                except Exception:
                    w_pitcher = ""
                    w_pitcher_wins = 0
                    w_pitcher_losses = 0
                try:
                    l_pitcher_data = game.find('l_pitcher')
                    l_pitcher = l_pitcher_data.find('pitcher').attrib['name']
                    l_pitcher_wins = int(l_pitcher_data.attrib['wins'])
                    l_pitcher_losses = int(l_pitcher_data.attrib['losses'])
                except Exception:
                    l_pitcher = ""
                    l_pitcher_wins = 0
                    l_pitcher_losses = 0
                try:
                    sv_pitcher_data = game.find('sv_pitcher')
                    sv_pitcher = sv_pitcher_data.find('pitcher').attrib['name']
                    sv_pitcher_saves = int(sv_pitcher_data.attrib['saves'])
                except Exception:
                    sv_pitcher = ""
                    sv_pitcher_saves = 0
                output = {
                    'game_id': game_id,
                    'game_tag': game_tag,
                    'game_league': game_league,
                    'game_status': game_status,
                    'game_start_time': game_start_time,
                    'home_team': home_team,
                    'home_team_runs': home_team_runs,
                    'home_team_hits': home_team_hits,
                    'home_team_errors': home_team_errors,
                    'away_team': away_team,
                    'away_team_runs': away_team_runs,
                    'away_team_hits': away_team_hits,
                    'away_team_errors': away_team_errors,
                    'w_pitcher': w_pitcher,
                    'w_pitcher_wins': w_pitcher_wins,
                    'w_pitcher_losses': w_pitcher_losses,
                    'l_pitcher': l_pitcher,
                    'l_pitcher_wins': l_pitcher_wins,
                    'l_pitcher_losses': l_pitcher_losses,
                    'sv_pitcher': sv_pitcher,
                    'sv_pitcher_saves': sv_pitcher_saves
                }
            # games that were not played
            elif game_tag == 'sg_game':
                try:
                    p_pitcher_data = game.findall('p_pitcher')
                    p_pitcher_home_data = p_pitcher_data[0]
                    p_pitcher_home = p_pitcher_home_data.find(
                        'pitcher').attrib['name']
                    p_pitcher_home_wins = int(p_pitcher_home_data.
                                              attrib['wins'])
                    p_pitcher_home_losses = int(p_pitcher_home_data.
                                                attrib['losses'])
                    p_pitcher_away_data = p_pitcher_data[1]
                    p_pitcher_away = p_pitcher_away_data.find(
                        'pitcher').attrib['name']
                    p_pitcher_away_wins = int(p_pitcher_away_data.
                                              attrib['wins'])
                    p_pitcher_away_losses = int(p_pitcher_away_data.
                                                attrib['losses'])
                except Exception:
                    p_pitcher_home = ''
                    p_pitcher_home_wins = 0
                    p_pitcher_home_losses = 0
                    p_pitcher_away = ''
                    p_pitcher_away_wins = 0
                    p_pitcher_away_losses = 0
                output = {
                    'game_id': game_id,
                    'game_tag': game_tag,
                    'game_league': game_league,
                    'game_status': game_status,
                    'game_start_time': game_start_time,
                    'home_team': home_team,
                    'home_team_runs': home_team_runs,
                    'home_team_hits': home_team_hits,
                    'home_team_errors': home_team_errors,
                    'away_team': away_team,
                    'away_team_runs': away_team_runs,
                    'away_team_hits': away_team_hits,
                    'away_team_errors': away_team_errors,
                    'p_pitcher_home': p_pitcher_home,
                    'p_pitcher_home_wins': p_pitcher_home_wins,
                    'p_pitcher_home_losses': p_pitcher_home_losses,
                    'p_pitcher_away': p_pitcher_away,
                    'p_pitcher_away_wins': p_pitcher_away_wins,
                    'p_pitcher_away_losses': p_pitcher_away_losses
                }
            # put this dictionary into the larger dictionary
            games[game_id] = output
    return games

Classes

class Coach

Object to hold coach information

Properties: first id last num position

class Coach(mlbgame.object.Object):
    """Object to hold coach information

    Properties:
        first
        id
        last
        num
        position
    """
    pass

Ancestors (in MRO)

  • Coach
  • mlbgame.object.Object
  • __builtin__.object

Methods

def __init__(

self, data)

Creates an object that matches the corresponding values in data.

data should be a dictionary of values.

def __init__(self, data):
    """Creates an object that matches the corresponding values in `data`.
    `data` should be a dictionary of values.
    """
    # loop through data
    for x in data:
        setobjattr(self, x, data[x])

class GameBoxScore

Object to hold the box score of a certain game.

Properties: game_id innings: inning home away

class GameBoxScore(object):
    """Object to hold the box score of a certain game.

    Properties:
        game_id
        innings:
            inning
            home
            away
    """

    def __init__(self, data):
        """Creates a `GameBoxScore` object.

        data is expected to come from the `box_score()` function.
        """
        self.game_id = data['game_id']
        data.pop('game_id', None)
        # dictionary of innings
        self.innings = []
        # loops through the innings
        for x in sorted(data):
            try:
                result = {'inning': int(x),
                          'home': int(data[x]['home']),
                          'away': int(data[x]['away'])
                          }
            # possible error when 9th innning home team has 'x'
            # becuase they did not bat
            except ValueError:
                result = {
                    'inning': int(x),
                    'home': data[x]['home'],
                    'away': int(data[x]['away'])
                }
            self.innings.append(result)

    def __iter__(self):
        """Allows object to be iterated over."""
        for x in self.innings:
            yield x

    def __enumerate_scoreboard(self, data):
        output = ''
        for y, x in enumerate(data, start=1):
            if y >= 10:
                output += str(x) + '  '
            else:
                output += str(x) + ' '
        return output

    def print_scoreboard(self):
        """Print object as a scoreboard."""
        output = ''
        # parallel dictionaries with innings and scores
        innings = []
        away = []
        home = []
        for x in self:
            innings.append(x['inning'])
            away.append(x['away'])
            home.append(x['home'])
        # go through all the information and make a nice output
        # that looks like a scoreboard
        output += 'Inning\t'
        for x in innings:
            output += str(x) + ' '
        output += '\n'
        for x in innings:
            output += '---'
        output += '\nAway\t' + self.__enumerate_scoreboard(away)
        output += '\nHome\t' + self.__enumerate_scoreboard(home)
        return output

Ancestors (in MRO)

Instance variables

var game_id

var innings

Methods

def __init__(

self, data)

Creates a GameBoxScore object.

data is expected to come from the box_score() function.

def __init__(self, data):
    """Creates a `GameBoxScore` object.
    data is expected to come from the `box_score()` function.
    """
    self.game_id = data['game_id']
    data.pop('game_id', None)
    # dictionary of innings
    self.innings = []
    # loops through the innings
    for x in sorted(data):
        try:
            result = {'inning': int(x),
                      'home': int(data[x]['home']),
                      'away': int(data[x]['away'])
                      }
        # possible error when 9th innning home team has 'x'
        # becuase they did not bat
        except ValueError:
            result = {
                'inning': int(x),
                'home': data[x]['home'],
                'away': int(data[x]['away'])
            }
        self.innings.append(result)

def print_scoreboard(

self)

Print object as a scoreboard.

def print_scoreboard(self):
    """Print object as a scoreboard."""
    output = ''
    # parallel dictionaries with innings and scores
    innings = []
    away = []
    home = []
    for x in self:
        innings.append(x['inning'])
        away.append(x['away'])
        home.append(x['home'])
    # go through all the information and make a nice output
    # that looks like a scoreboard
    output += 'Inning\t'
    for x in innings:
        output += str(x) + ' '
    output += '\n'
    for x in innings:
        output += '---'
    output += '\nAway\t' + self.__enumerate_scoreboard(away)
    output += '\nHome\t' + self.__enumerate_scoreboard(home)
    return output

class GameScoreboard

Object to hold scoreboard information about a certain game.

Properties: away_team away_team_errors away_team_hits away_team_runs date game_id game_league game_start_time game_status game_tag home_team home_team_errors home_team_hits home_team_runs l_pitcher l_pitcher_losses l_pitcher_wins l_team sv_pitcher sv_pitcher_saves w_pitcher w_pitcher_losses w_pitcher_wins w_team

class GameScoreboard(object):
    """Object to hold scoreboard information about a certain game.

    Properties:
        away_team
        away_team_errors
        away_team_hits
        away_team_runs
        date
        game_id
        game_league
        game_start_time
        game_status
        game_tag
        home_team
        home_team_errors
        home_team_hits
        home_team_runs
        l_pitcher
        l_pitcher_losses
        l_pitcher_wins
        l_team
        sv_pitcher
        sv_pitcher_saves
        w_pitcher
        w_pitcher_losses
        w_pitcher_wins
        w_team
    """

    def __init__(self, data):
        """Creates a `GameScoreboard` object.

        data is expected to come from the `scoreboard()` function.
        """
        # loop through data
        for x in data:
            # set information as correct data type
            try:
                setattr(self, x, int(data[x]))
            except ValueError:
                try:
                    setattr(self, x, float(data[x]))
                except ValueError:
                    # string if not number
                    setattr(self, x, str(data[x]))
        # calculate the winning team
        if self.home_team_runs > self.away_team_runs:
            self.w_team = self.home_team
            self.l_team = self.away_team
        elif self.away_team_runs > self.home_team_runs:
            self.w_team = self.away_team
            self.l_team = self.home_team
        # create a datetime object that represents the game start time
        # the object has no timezone info but should be interpreted as
        # being in the US/Eastern timezone
        year, month, day = self.game_id.split('_')[:3]
        game_start_date = "/".join([year, month, day])
        game_start_time = self.game_start_time.replace(' ', '')
        self.date = datetime.datetime.strptime(
                " ".join([game_start_date, game_start_time]),
                "%Y/%m/%d %I:%M%p")

    def nice_score(self):
        """Return a nicely formatted score of the game."""
        return ('{0.away_team} ({0.away_team_runs}) at '
                '{0.home_team} ({0.home_team_runs})').format(self)

    def __str__(self):
        return self.nice_score()

Ancestors (in MRO)

Instance variables

var date

Methods

def __init__(

self, data)

Creates a GameScoreboard object.

data is expected to come from the scoreboard() function.

def __init__(self, data):
    """Creates a `GameScoreboard` object.
    data is expected to come from the `scoreboard()` function.
    """
    # loop through data
    for x in data:
        # set information as correct data type
        try:
            setattr(self, x, int(data[x]))
        except ValueError:
            try:
                setattr(self, x, float(data[x]))
            except ValueError:
                # string if not number
                setattr(self, x, str(data[x]))
    # calculate the winning team
    if self.home_team_runs > self.away_team_runs:
        self.w_team = self.home_team
        self.l_team = self.away_team
    elif self.away_team_runs > self.home_team_runs:
        self.w_team = self.away_team
        self.l_team = self.home_team
    # create a datetime object that represents the game start time
    # the object has no timezone info but should be interpreted as
    # being in the US/Eastern timezone
    year, month, day = self.game_id.split('_')[:3]
    game_start_date = "/".join([year, month, day])
    game_start_time = self.game_start_time.replace(' ', '')
    self.date = datetime.datetime.strptime(
            " ".join([game_start_date, game_start_time]),
            "%Y/%m/%d %I:%M%p")

def nice_score(

self)

Return a nicely formatted score of the game.

def nice_score(self):
    """Return a nicely formatted score of the game."""
    return ('{0.away_team} ({0.away_team_runs}) at '
            '{0.home_team} ({0.home_team_runs})').format(self)

class Overview

Object to hold an overview of game information

Properties: ampm attendance aw_lg_ampm away_ampm away_code away_division away_file_code away_games_back away_games_back_wildcard away_league_id away_loss away_name_abbrev away_preview_link away_probable_pitcher_era away_probable_pitcher_first away_probable_pitcher_first_name away_probable_pitcher_id away_probable_pitcher_last away_probable_pitcher_last_name away_probable_pitcher_losses away_probable_pitcher_name_display_roster away_probable_pitcher_number away_probable_pitcher_s_era away_probable_pitcher_s_losses away_probable_pitcher_s_wins away_probable_pitcher_stats_season away_probable_pitcher_stats_type away_probable_pitcher_throwinghand away_probable_pitcher_wins away_recap_link away_sport_code away_team_city away_team_errors away_team_hits away_team_id away_team_name away_team_runs away_time away_time_zone away_win balls date day double_header_sw elapsed_time first_pitch_et game_data_directory game_id game_nbr game_pk game_type gameday_link gameday_sw hm_lg_ampm home_ampm home_code home_division home_file_code home_games_back home_games_back_wildcard home_league_id home_loss home_name_abbrev home_preview_link home_probable_pitcher_era home_probable_pitcher_first home_probable_pitcher_first_name home_probable_pitcher_id home_probable_pitcher_last home_probable_pitcher_last_name home_probable_pitcher_losses home_probable_pitcher_name_display_roster home_probable_pitcher_number home_probable_pitcher_s_era home_probable_pitcher_s_losses home_probable_pitcher_s_wins home_probable_pitcher_stats_season home_probable_pitcher_stats_type home_probable_pitcher_throwinghand home_probable_pitcher_wins home_recap_link home_sport_code home_team_city home_team_errors home_team_hits home_team_id home_team_name home_team_runs home_time home_time_zone home_win id ind inning inning_state is_no_hitter is_perfect_game league location note official_scorer original_date outs photos_link preview scheduled_innings start_time status status_ind strikes tbd_flag tiebreaker_sw time time_aw_lg time_date time_date_aw_lg time_date_hm_lg time_hm_lg time_zone time_zone_aw_lg time_zone_hm_lg top_inning tv_station tz_aw_lg_gen tz_hm_lg_gen venue venue_id venue_name venue_w_chan_loc weather wind wrapup_link

class Overview(mlbgame.object.Object):
    """Object to hold an overview of game information

    Properties:
        ampm
        attendance
        aw_lg_ampm
        away_ampm
        away_code
        away_division
        away_file_code
        away_games_back
        away_games_back_wildcard
        away_league_id
        away_loss
        away_name_abbrev
        away_preview_link
        away_probable_pitcher_era
        away_probable_pitcher_first
        away_probable_pitcher_first_name
        away_probable_pitcher_id
        away_probable_pitcher_last
        away_probable_pitcher_last_name
        away_probable_pitcher_losses
        away_probable_pitcher_name_display_roster
        away_probable_pitcher_number
        away_probable_pitcher_s_era
        away_probable_pitcher_s_losses
        away_probable_pitcher_s_wins
        away_probable_pitcher_stats_season
        away_probable_pitcher_stats_type
        away_probable_pitcher_throwinghand
        away_probable_pitcher_wins
        away_recap_link
        away_sport_code
        away_team_city
        away_team_errors
        away_team_hits
        away_team_id
        away_team_name
        away_team_runs
        away_time
        away_time_zone
        away_win
        balls
        date
        day
        double_header_sw
        elapsed_time
        first_pitch_et
        game_data_directory
        game_id
        game_nbr
        game_pk
        game_type
        gameday_link
        gameday_sw
        hm_lg_ampm
        home_ampm
        home_code
        home_division
        home_file_code
        home_games_back
        home_games_back_wildcard
        home_league_id
        home_loss
        home_name_abbrev
        home_preview_link
        home_probable_pitcher_era
        home_probable_pitcher_first
        home_probable_pitcher_first_name
        home_probable_pitcher_id
        home_probable_pitcher_last
        home_probable_pitcher_last_name
        home_probable_pitcher_losses
        home_probable_pitcher_name_display_roster
        home_probable_pitcher_number
        home_probable_pitcher_s_era
        home_probable_pitcher_s_losses
        home_probable_pitcher_s_wins
        home_probable_pitcher_stats_season
        home_probable_pitcher_stats_type
        home_probable_pitcher_throwinghand
        home_probable_pitcher_wins
        home_recap_link
        home_sport_code
        home_team_city
        home_team_errors
        home_team_hits
        home_team_id
        home_team_name
        home_team_runs
        home_time
        home_time_zone
        home_win
        id
        ind
        inning
        inning_state
        is_no_hitter
        is_perfect_game
        league
        location
        note
        official_scorer
        original_date
        outs
        photos_link
        preview
        scheduled_innings
        start_time
        status
        status_ind
        strikes
        tbd_flag
        tiebreaker_sw
        time
        time_aw_lg
        time_date
        time_date_aw_lg
        time_date_hm_lg
        time_hm_lg
        time_zone
        time_zone_aw_lg
        time_zone_hm_lg
        top_inning
        tv_station
        tz_aw_lg_gen
        tz_hm_lg_gen
        venue
        venue_id
        venue_name
        venue_w_chan_loc
        weather
        wind
        wrapup_link
    """
    pass

Ancestors (in MRO)

  • Overview
  • mlbgame.object.Object
  • __builtin__.object

Methods

def __init__(

self, data)

Creates an object that matches the corresponding values in data.

data should be a dictionary of values.

def __init__(self, data):
    """Creates an object that matches the corresponding values in `data`.
    `data` should be a dictionary of values.
    """
    # loop through data
    for x in data:
        setobjattr(self, x, data[x])

class Player

Object to hold player information

Properties: avg bats boxname current_position era first hr id last losses num parent_team_abbrev parent_team_id position rbi rl status team_abbrev team_id wins

class Player(mlbgame.object.Object):
    """Object to hold player information

    Properties:
        avg
        bats
        boxname
        current_position
        era
        first
        hr
        id
        last
        losses
        num
        parent_team_abbrev
        parent_team_id
        position
        rbi
        rl
        status
        team_abbrev
        team_id
        wins
    """
    pass

Ancestors (in MRO)

  • Player
  • mlbgame.object.Object
  • __builtin__.object

Methods

def __init__(

self, data)

Creates an object that matches the corresponding values in data.

data should be a dictionary of values.

def __init__(self, data):
    """Creates an object that matches the corresponding values in `data`.
    `data` should be a dictionary of values.
    """
    # loop through data
    for x in data:
        setobjattr(self, x, data[x])

class Players

Object to hold player/coach/umpire information for a game.

Properties: away_coaches away_players game_id home_coaches home_players umpires

class Players(object):
    """Object to hold player/coach/umpire information for a game.

    Properties:
        away_coaches
        away_players
        game_id
        home_coaches
        home_players
        umpires
    """

    def __init__(self, data):
        """Creates a players object that matches the corresponding info in `data`.
        `data` should be an dictionary of values.
        """
        self.game_id = data['game_id']
        self.home_players = [Player(x) for x in data['home_team']['players']]
        self.home_coaches = [Coach(x) for x in data['home_team']['coaches']]
        self.away_players = [Player(x) for x in data['away_team']['players']]
        self.away_coaches = [Coach(x) for x in data['away_team']['coaches']]
        self.umpires = [Umpire(x) for x in data['umpires']]

Ancestors (in MRO)

Instance variables

var away_coaches

var away_players

var game_id

var home_coaches

var home_players

var umpires

Methods

def __init__(

self, data)

Creates a players object that matches the corresponding info in data. data should be an dictionary of values.

def __init__(self, data):
    """Creates a players object that matches the corresponding info in `data`.
    `data` should be an dictionary of values.
    """
    self.game_id = data['game_id']
    self.home_players = [Player(x) for x in data['home_team']['players']]
    self.home_coaches = [Coach(x) for x in data['home_team']['coaches']]
    self.away_players = [Player(x) for x in data['away_team']['players']]
    self.away_coaches = [Coach(x) for x in data['away_team']['coaches']]
    self.umpires = [Umpire(x) for x in data['umpires']]

class Umpire

Object to hold umpire information

Properties: first id last name position

class Umpire(mlbgame.object.Object):
    """Object to hold umpire information

    Properties:
        first
        id
        last
        name
        position
    """
    pass

Ancestors (in MRO)

  • Umpire
  • mlbgame.object.Object
  • __builtin__.object

Methods

def __init__(

self, data)

Creates an object that matches the corresponding values in data.

data should be a dictionary of values.

def __init__(self, data):
    """Creates an object that matches the corresponding values in `data`.
    `data` should be a dictionary of values.
    """
    # loop through data
    for x in data:
        setobjattr(self, x, data[x])