Top

mlbgame.stats module

Module that controls getting stats and creating objects to hold that information.

#!/usr/bin/env python

"""Module that controls getting stats and creating objects to hold that
information."""

import lxml.etree as etree

import mlbgame.data
import mlbgame.object


def __player_stats_info(data, name):
    home = []
    away = []
    for y in data:
        # loops through pitchers and batters
        for x in y.findall(name):
            stats = {}
            # loop through and save stats
            for i in x.attrib:
                stats[i] = x.attrib[i]
            # apply to correct list
            if y.attrib['team_flag'] == 'home':
                home.append(stats)
            else:
                away.append(stats)
    return (home, away)


def __raw_player_stats_info(data):
    home_pitchers = []
    away_pitchers = []
    home_batters = []
    away_batters = []

    for team in data.findall('team'):
        home_flag = team.attrib['team_flag'] == 'home'
        pitching = team.find('pitching')
        for pitcher in pitching.findall('pitcher'):
            stats = {}
            for i in pitcher.attrib:
                stats[i] = pitcher.attrib[i]
            if home_flag:
                home_pitchers.append(stats)
            else:
                away_pitchers.append(stats)

        batting = team.find('batting')
        for batter in batting.findall('batter'):
            stats = {}
            for i in batter.attrib:
                stats[i] = batter.attrib[i]
            if home_flag:
                home_batters.append(stats)
            else:
                away_batters.append(stats)
    home = {'pitchers': home_pitchers, 'batters': home_batters}
    away = {'pitchers': away_pitchers, 'batters': away_batters}
    return (home, away)


def player_stats(game_id):
    """Return dictionary of individual stats of a game with matching id.

       The additional pitching/batting is mostly the same stats, except it
       contains some useful stats such as groundouts/flyouts per pitcher
       (go/ao). MLB decided to have two box score files, thus we return the
       data from both.
    """
    # get data from data module
    box_score = mlbgame.data.get_box_score(game_id)
    raw_box_score = mlbgame.data.get_raw_box_score(game_id)
    # parse XML
    box_score_tree = etree.parse(box_score).getroot()
    raw_box_score_tree = etree.parse(raw_box_score).getroot()
    # get pitching and batting info
    pitching = box_score_tree.findall('pitching')
    batting = box_score_tree.findall('batting')
    # get parsed stats
    pitching_info = __player_stats_info(pitching, 'pitcher')
    batting_info = __player_stats_info(batting, 'batter')
    # get parsed additional stats
    additional_stats = __raw_player_stats_info(raw_box_score_tree)
    addl_home_pitching = additional_stats[0]['pitchers']
    addl_home_batting = additional_stats[0]['batters']
    addl_away_pitching = additional_stats[1]['pitchers']
    addl_away_batting = additional_stats[1]['batters']

    output = {
        'home_pitching': pitching_info[0],
        'away_pitching': pitching_info[1],
        'home_batting': batting_info[0],
        'away_batting': batting_info[1],
        'home_additional_pitching': addl_home_pitching,
        'away_additional_pitching': addl_away_pitching,
        'home_additional_batting': addl_home_batting,
        'away_additional_batting': addl_away_batting
    }
    return output


def __team_stats_info(data, output, output_key):
    for x in data:
        stats = {}
        # loop through stats and save
        for y in x.attrib:
            stats[y] = x.attrib[y]
        # apply to correct team
        if x.attrib['team_flag'] == 'home':
            # Example: 'home_batting' when output_key is 'batting'
            output['home_' + output_key] = stats
        elif x.attrib['team_flag'] == 'away':
            output['away_' + output_key] = stats
    return output


def __raw_team_stats_info(data, output):
    for team in data.findall('team'):
        home_flag = team.attrib['team_flag'] == 'home'
        pitching = team.find('pitching')
        stats = {}
        for stat in pitching.attrib:
            stats[stat] = pitching.attrib[stat]
        if home_flag:
            output['home_additional_pitching'] = stats
        else:
            output['away_additional_pitching'] = stats

        stats = {}
        batting = team.find('batting')
        for stat in batting.attrib:
            stats[stat] = batting.attrib[stat]
        if home_flag:
            output['home_additional_batting'] = stats
        else:
            output['away_additional_batting'] = stats
    return output


def team_stats(game_id):
    """Return team stats of a game with matching id.

    The additional pitching/batting is mostly the same stats. MLB decided
    to have two box score files, thus we return the data from both.
    """
    # get data from data module
    box_score = mlbgame.data.get_box_score(game_id)
    raw_box_score = mlbgame.data.get_raw_box_score(game_id)
    # parse XML
    box_score_tree = etree.parse(box_score).getroot()
    raw_box_score_tree = etree.parse(raw_box_score).getroot()
    # get pitching and batting ingo
    pitching = box_score_tree.findall('pitching')
    batting = box_score_tree.findall('batting')
    # dictionary for output
    output = {}
    output = __team_stats_info(pitching, output, 'pitching')
    output = __team_stats_info(batting, output, 'batting')
    output = __raw_team_stats_info(raw_box_score_tree, output)
    return output


class Stats(object):
    """Hold stats information for a game.

    Properties:
        away_batting
        away_pitching
        game_id
        home_batting
        home_pitching
        away_additional_pitching
        away_additional_batting
        home_additional_pitching
        home_additional_batting
    """

    def __init__(self, data, game_id, player):
        """Creates a players object that matches the corresponding info in `data`.
        `data` should be an dictionary of values.
        'game_id' should be the id for the game.
        """
        self.game_id = game_id
        output = {'home_pitching': [], 'away_pitching': [], 'home_batting': [],
                  'away_batting': [], 'home_additional_pitching': [],
                  'home_additional_batting': [],
                  'away_additional_pitching': [],
                  'away_additional_batting': []}
        for y in data:
            # create objects for all data
            if player:
                for x in data[y]:
                    obj = PlayerStats(x)
                    output[y].append(obj)
            else:
                obj = TeamStats(data[y])
                output[y] = obj
        self.home_pitching = output['home_pitching']
        self.away_pitching = output['away_pitching']
        self.home_batting = output['home_batting']
        self.away_batting = output['away_batting']
        self.home_additional_pitching = output['home_additional_pitching']
        self.away_additional_pitching = output['away_additional_pitching']
        self.home_additional_batting = output['home_additional_batting']
        self.away_additional_batting = output['away_additional_batting']


class PlayerStats(mlbgame.object.Object):
    """Holds stats information for a player.
    Properties:
        Batter:
            a
            ab
            ao
            avg
            bb
            bo
            cs
            d
            e
            fldg
            go
            h
            hbp
            hr
            id
            lob
            name
            name_display_first_last
            obp
            ops
            po
            pos
            r
            rbi
            s_bb
            s_h
            s_hr
            s_r
            s_rbi
            s_so
            sac
            sb
            sf
            slg
            so
            t
        Pitcher:
            bb
            bf
            bs
            er
            era
            game_score
            h
            hld
            hr
            id
            l
            loss
            name
            name_display_first_last
            note
            np
            out
            pos
            r
            s
            s_bb
            s_er
            s_h
            s_ip
            s_r
            s_so
            save
            so
            sv
            w
            win
    """

    def nice_output(self):
        """Prints basic player stats in a nice way."""
        return '{0} ({1})'.format(
            self.name_display_first_last,
            self.pos
        )

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


class TeamStats(mlbgame.object.Object):
    """Holds total pitching or batting stats for a team.

    Properties:
        Batting:
            ab
            avg
            bb
            d
            da
            h
            hr
            lob
            obp
            ops
            po
            r
            rbi
            slg
            so
            t
            team_flag
        Pitching:
            bb
            bf
            er
            era
            h
            hr
            out
            r
            so
            team_flag
    """
    pass

Functions

def player_stats(

game_id)

Return dictionary of individual stats of a game with matching id.

The additional pitching/batting is mostly the same stats, except it contains some useful stats such as groundouts/flyouts per pitcher (go/ao). MLB decided to have two box score files, thus we return the data from both.

def player_stats(game_id):
    """Return dictionary of individual stats of a game with matching id.

       The additional pitching/batting is mostly the same stats, except it
       contains some useful stats such as groundouts/flyouts per pitcher
       (go/ao). MLB decided to have two box score files, thus we return the
       data from both.
    """
    # get data from data module
    box_score = mlbgame.data.get_box_score(game_id)
    raw_box_score = mlbgame.data.get_raw_box_score(game_id)
    # parse XML
    box_score_tree = etree.parse(box_score).getroot()
    raw_box_score_tree = etree.parse(raw_box_score).getroot()
    # get pitching and batting info
    pitching = box_score_tree.findall('pitching')
    batting = box_score_tree.findall('batting')
    # get parsed stats
    pitching_info = __player_stats_info(pitching, 'pitcher')
    batting_info = __player_stats_info(batting, 'batter')
    # get parsed additional stats
    additional_stats = __raw_player_stats_info(raw_box_score_tree)
    addl_home_pitching = additional_stats[0]['pitchers']
    addl_home_batting = additional_stats[0]['batters']
    addl_away_pitching = additional_stats[1]['pitchers']
    addl_away_batting = additional_stats[1]['batters']

    output = {
        'home_pitching': pitching_info[0],
        'away_pitching': pitching_info[1],
        'home_batting': batting_info[0],
        'away_batting': batting_info[1],
        'home_additional_pitching': addl_home_pitching,
        'away_additional_pitching': addl_away_pitching,
        'home_additional_batting': addl_home_batting,
        'away_additional_batting': addl_away_batting
    }
    return output

def team_stats(

game_id)

Return team stats of a game with matching id.

The additional pitching/batting is mostly the same stats. MLB decided to have two box score files, thus we return the data from both.

def team_stats(game_id):
    """Return team stats of a game with matching id.

    The additional pitching/batting is mostly the same stats. MLB decided
    to have two box score files, thus we return the data from both.
    """
    # get data from data module
    box_score = mlbgame.data.get_box_score(game_id)
    raw_box_score = mlbgame.data.get_raw_box_score(game_id)
    # parse XML
    box_score_tree = etree.parse(box_score).getroot()
    raw_box_score_tree = etree.parse(raw_box_score).getroot()
    # get pitching and batting ingo
    pitching = box_score_tree.findall('pitching')
    batting = box_score_tree.findall('batting')
    # dictionary for output
    output = {}
    output = __team_stats_info(pitching, output, 'pitching')
    output = __team_stats_info(batting, output, 'batting')
    output = __raw_team_stats_info(raw_box_score_tree, output)
    return output

Classes

class PlayerStats

Holds stats information for a player. Properties: Batter: a ab ao avg bb bo cs d e fldg go h hbp hr id lob name name_display_first_last obp ops po pos r rbi s_bb s_h s_hr s_r s_rbi s_so sac sb sf slg so t Pitcher: bb bf bs er era game_score h hld hr id l loss name name_display_first_last note np out pos r s s_bb s_er s_h s_ip s_r s_so save so sv w win

class PlayerStats(mlbgame.object.Object):
    """Holds stats information for a player.
    Properties:
        Batter:
            a
            ab
            ao
            avg
            bb
            bo
            cs
            d
            e
            fldg
            go
            h
            hbp
            hr
            id
            lob
            name
            name_display_first_last
            obp
            ops
            po
            pos
            r
            rbi
            s_bb
            s_h
            s_hr
            s_r
            s_rbi
            s_so
            sac
            sb
            sf
            slg
            so
            t
        Pitcher:
            bb
            bf
            bs
            er
            era
            game_score
            h
            hld
            hr
            id
            l
            loss
            name
            name_display_first_last
            note
            np
            out
            pos
            r
            s
            s_bb
            s_er
            s_h
            s_ip
            s_r
            s_so
            save
            so
            sv
            w
            win
    """

    def nice_output(self):
        """Prints basic player stats in a nice way."""
        return '{0} ({1})'.format(
            self.name_display_first_last,
            self.pos
        )

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

Ancestors (in MRO)

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])

def nice_output(

self)

Prints basic player stats in a nice way.

def nice_output(self):
    """Prints basic player stats in a nice way."""
    return '{0} ({1})'.format(
        self.name_display_first_last,
        self.pos
    )

class Stats

Hold stats information for a game.

Properties: away_batting away_pitching game_id home_batting home_pitching away_additional_pitching away_additional_batting home_additional_pitching home_additional_batting

class Stats(object):
    """Hold stats information for a game.

    Properties:
        away_batting
        away_pitching
        game_id
        home_batting
        home_pitching
        away_additional_pitching
        away_additional_batting
        home_additional_pitching
        home_additional_batting
    """

    def __init__(self, data, game_id, player):
        """Creates a players object that matches the corresponding info in `data`.
        `data` should be an dictionary of values.
        'game_id' should be the id for the game.
        """
        self.game_id = game_id
        output = {'home_pitching': [], 'away_pitching': [], 'home_batting': [],
                  'away_batting': [], 'home_additional_pitching': [],
                  'home_additional_batting': [],
                  'away_additional_pitching': [],
                  'away_additional_batting': []}
        for y in data:
            # create objects for all data
            if player:
                for x in data[y]:
                    obj = PlayerStats(x)
                    output[y].append(obj)
            else:
                obj = TeamStats(data[y])
                output[y] = obj
        self.home_pitching = output['home_pitching']
        self.away_pitching = output['away_pitching']
        self.home_batting = output['home_batting']
        self.away_batting = output['away_batting']
        self.home_additional_pitching = output['home_additional_pitching']
        self.away_additional_pitching = output['away_additional_pitching']
        self.home_additional_batting = output['home_additional_batting']
        self.away_additional_batting = output['away_additional_batting']

Ancestors (in MRO)

  • Stats
  • __builtin__.object

Instance variables

var away_additional_batting

var away_additional_pitching

var away_batting

var away_pitching

var game_id

var home_additional_batting

var home_additional_pitching

var home_batting

var home_pitching

Methods

def __init__(

self, data, game_id, player)

Creates a players object that matches the corresponding info in data. data should be an dictionary of values. 'game_id' should be the id for the game.

def __init__(self, data, game_id, player):
    """Creates a players object that matches the corresponding info in `data`.
    `data` should be an dictionary of values.
    'game_id' should be the id for the game.
    """
    self.game_id = game_id
    output = {'home_pitching': [], 'away_pitching': [], 'home_batting': [],
              'away_batting': [], 'home_additional_pitching': [],
              'home_additional_batting': [],
              'away_additional_pitching': [],
              'away_additional_batting': []}
    for y in data:
        # create objects for all data
        if player:
            for x in data[y]:
                obj = PlayerStats(x)
                output[y].append(obj)
        else:
            obj = TeamStats(data[y])
            output[y] = obj
    self.home_pitching = output['home_pitching']
    self.away_pitching = output['away_pitching']
    self.home_batting = output['home_batting']
    self.away_batting = output['away_batting']
    self.home_additional_pitching = output['home_additional_pitching']
    self.away_additional_pitching = output['away_additional_pitching']
    self.home_additional_batting = output['home_additional_batting']
    self.away_additional_batting = output['away_additional_batting']

class TeamStats

Holds total pitching or batting stats for a team.

Properties: Batting: ab avg bb d da h hr lob obp ops po r rbi slg so t team_flag Pitching: bb bf er era h hr out r so team_flag

class TeamStats(mlbgame.object.Object):
    """Holds total pitching or batting stats for a team.

    Properties:
        Batting:
            ab
            avg
            bb
            d
            da
            h
            hr
            lob
            obp
            ops
            po
            r
            rbi
            slg
            so
            t
            team_flag
        Pitching:
            bb
            bf
            er
            era
            h
            hr
            out
            r
            so
            team_flag
    """
    pass

Ancestors (in MRO)

  • TeamStats
  • 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])