def test_player_batter(self): """ Player data(batter) """ soup = BeautifulSoup(TestPlayers.XML_PLAYER_BATTER, 'lxml') player = Players.Player(soup.find('player'), 'SEA201508121') self.assertEqual(player.retro_game_id, 'SEA201508121') self.assertEqual(player.id, '572122') self.assertEqual(player.first, 'Kyle') self.assertEqual(player.last, 'Seager') self.assertEqual(player.position, '3B') self.assertEqual(player.num, 15) self.assertEqual(player.box_name, 'Seager, K') self.assertEqual(player.rl, 'R') self.assertEqual(player.bats, 'L') self.assertEqual(player.status, 'A') self.assertEqual(player.team_abbrev, 'SEA') self.assertEqual(player.team_id, '136') self.assertEqual(player.parent_team_abbrev, 'SEA') self.assertEqual(player.parent_team_id, '136') self.assertEqual(player.bat_order, 2) self.assertEqual(player.game_position, '3B') self.assertEqual(player.avg, 0.263) self.assertEqual(player.hr, 16) self.assertEqual(player.rbi, 45) self.assertEqual(player.wins, 0) self.assertEqual(player.losses, 0) self.assertEqual(player.era, 0.0)
def test_player_pitcher(self): """ Player data(pitcher) """ soup = BeautifulSoup(TestPlayers.XML_PLAYER_PITCHER, 'lxml') player = Players.Player(soup.find('player'), 'SEA201508113') self.assertEqual(player.retro_game_id, 'SEA201508113') self.assertEqual(player.id, '547874') self.assertEqual(player.first, 'Hisashi') self.assertEqual(player.last, 'Iwakuma') self.assertEqual(player.position, 'P') self.assertEqual(player.num, 18) self.assertEqual(player.box_name, 'Iwakuma') self.assertEqual(player.rl, 'R') self.assertEqual(player.bats, 'R') self.assertEqual(player.status, 'A') self.assertEqual(player.team_abbrev, 'SEA') self.assertEqual(player.team_id, '136') self.assertEqual(player.parent_team_abbrev, 'SEA') self.assertEqual(player.parent_team_id, '136') self.assertEqual(player.bat_order, 0) self.assertEqual(player.game_position, 'P') self.assertEqual(player.avg, 0.0) self.assertEqual(player.hr, 0) self.assertEqual(player.rbi, 0) self.assertEqual(player.wins, 3) self.assertEqual(player.losses, 2) self.assertEqual(player.era, 4.41)
def test_player_pitcher_row(self): """ Player dataset(pitcher, row) """ soup = BeautifulSoup(TestPlayers.XML_PLAYER_PITCHER, 'lxml') player = Players.Player(soup.find('player'), 'SEA201408113') row = player.row() self.assertEqual(row['retro_game_id'], 'SEA201408113') self.assertEqual(row['id'], '547874') self.assertEqual(row['first'], 'Hisashi') self.assertEqual(row['last'], 'Iwakuma') self.assertEqual(row['position'], 'P') self.assertEqual(row['num'], 18) self.assertEqual(row['box_name'], 'Iwakuma') self.assertEqual(row['rl'], 'R') self.assertEqual(row['bats'], 'R') self.assertEqual(row['status'], 'A') self.assertEqual(row['team_abbrev'], 'SEA') self.assertEqual(row['team_id'], '136') self.assertEqual(row['parent_team_abbrev'], 'SEA') self.assertEqual(row['parent_team_id'], '136') self.assertEqual(row['bat_order'], 0) self.assertEqual(row['game_position'], 'P') self.assertEqual(row['avg'], 0.0) self.assertEqual(row['hr'], 0) self.assertEqual(row['rbi'], 0) self.assertEqual(row['wins'], 3) self.assertEqual(row['losses'], 2) self.assertEqual(row['era'], 4.41)
def test_player_batter_row(self): """ Player dataset(batter, row) """ soup = BeautifulSoup(TestPlayers.XML_PLAYER_BATTER, 'lxml') player = Players.Player(soup.find('player'), 'SEA201408121') row = player.row() self.assertEqual(row['retro_game_id'], 'SEA201408121') self.assertEqual(row['id'], '572122') self.assertEqual(row['first'], 'Kyle') self.assertEqual(row['last'], 'Seager') self.assertEqual(row['position'], '3B') self.assertEqual(row['num'], 15) self.assertEqual(row['box_name'], 'Seager, K') self.assertEqual(row['rl'], 'R') self.assertEqual(row['bats'], 'L') self.assertEqual(row['status'], 'A') self.assertEqual(row['team_abbrev'], 'SEA') self.assertEqual(row['team_id'], '136') self.assertEqual(row['parent_team_abbrev'], 'SEA') self.assertEqual(row['parent_team_id'], '136') self.assertEqual(row['bat_order'], 2) self.assertEqual(row['game_position'], '3B') self.assertEqual(row['avg'], 0.263) self.assertEqual(row['hr'], 16) self.assertEqual(row['rbi'], 45) self.assertEqual(row['wins'], 0) self.assertEqual(row['losses'], 0) self.assertEqual(row['era'], 0.0)
def test_player_pitcher_debut(self): """ Player data(pitcher, debut) """ soup = BeautifulSoup(TestPlayers.XML_PLAYER_PITCHER_DEBUT, 'lxml') player = Players.Player(soup.find('player'), 'SEA201508140') self.assertEqual(player.retro_game_id, 'SEA201508140') self.assertEqual(player.id, '572140') self.assertEqual(player.first, 'Tyler') self.assertEqual(player.last, 'Skaggs') self.assertEqual(player.position, 'P') self.assertEqual(player.num, 'Unknown') self.assertEqual(player.box_name, 'Skaggs') self.assertEqual(player.rl, 'L') self.assertEqual(player.bats, 'L') self.assertEqual(player.status, 'A') self.assertEqual(player.team_abbrev, 'LAA') self.assertEqual(player.team_id, '108') self.assertEqual(player.parent_team_abbrev, 'LAA') self.assertEqual(player.parent_team_id, '108') self.assertEqual(player.bat_order, 'U') self.assertEqual(player.game_position, 'U') self.assertEqual(player.avg, 0.0) self.assertEqual(player.hr, 0) self.assertEqual(player.rbi, 0) self.assertEqual(player.wins, 0) self.assertEqual(player.losses, 0) self.assertEqual(player.era, 0.0)
def test_player_coach(self): """ Coach data """ team = Players.Team() team.id = "hoge" team.team_type = "away" team.name = "name" soup = BeautifulSoup(TestPlayers.XML_COACH, 'lxml') coach = Players.Coach(soup.find('coach'), 'SEA201508122', team) self.assertEqual(coach.retro_game_id, 'SEA201508122') self.assertEqual(coach.id, '118576') self.assertEqual(coach.first, 'Lloyd') self.assertEqual(coach.last, 'McClendon') self.assertEqual(coach.position, 'manager') self.assertEqual(coach.num, 21) self.assertEqual(coach.team_id, "hoge") self.assertEqual(coach.team_name, "name")
def test_player_coach_not_number(self): """ Coach data(not exists number) """ team = Players.Team() team.id = "fuga" team.team_type = "home" team.name = "team name" soup = BeautifulSoup(TestPlayers.XML_COACH_NOT_NUMBER, 'lxml') coach = Players.Coach(soup.find('coach'), 'SEA201508130', team) self.assertEqual(coach.retro_game_id, 'SEA201508130') self.assertEqual(coach.id, '579474') self.assertEqual(coach.first, 'Doug') self.assertEqual(coach.last, 'Sisson') self.assertEqual(coach.position, 'baserunning/outfield_and_first_base_coach') self.assertEqual(coach.num, 'Unknown') self.assertEqual(coach.team_id, "fuga") self.assertEqual(coach.team_name, "team name")
def test_player_coach_row(self): """ Coach dataset(row) """ team = Players.Team() team.id = "hoge" team.team_type = "away" team.name = "name" soup = BeautifulSoup(TestPlayers.XML_COACH, 'lxml') coach = Players.Coach(soup.find('coach'), 'SEA201408122', team) row = coach.row() self.assertEqual(row['retro_game_id'], 'SEA201408122') self.assertEqual(row['id'], '118576') self.assertEqual(row['first'], 'Lloyd') self.assertEqual(row['last'], 'McClendon') self.assertEqual(row['position'], 'manager') self.assertEqual(row['num'], 21) self.assertEqual(row['team_id'], "hoge") self.assertEqual(row['team_name'], "name")
def _download(self, timestamp): """ download MLBAM Game Day :param timestamp: day """ games, atbats, pitches = [], [], [] rosters, coaches, umpires = [], [], [] timestamp_params = { 'year': str(timestamp.year), 'month': str(timestamp.month).zfill(2), 'day': str(timestamp.day).zfill(2) } logging.info('->- Game data download start({year}/{month}/{day})'.format(**timestamp_params)) base_url = self.DELIMITER.join([self.url, self.PAGE_URL_GAME_DAY.format(**timestamp_params)]) html = MlbamUtil.find_xml(base_url, self.parser) href = self.PAGE_URL_GAME_PREFIX.format(**timestamp_params) for gid in html.find_all('a', href=re.compile(href)): gid_path = gid.get_text().strip() gid_url = self.DELIMITER.join([base_url, gid_path]) # Read XML & create dataset try: game = Game.read_xml(gid_url, self.parser, timestamp, MlbAm._get_game_number(gid_path)) players = Players.read_xml(gid_url, self.parser, game) innings = Inning.read_xml(gid_url, self.parser, game, players) except MlbAmHttpNotFound as e: logging.warning(e.msg) continue # append a dataset games.append(game.row()) rosters.extend([roseter.row() for roseter in players.rosters.values()]) coaches.extend([coach.row() for coach in players.coaches.values()]) umpires.extend([umpire.row() for umpire in players.umpires.values()]) atbats.extend(innings.atbats) pitches.extend(innings.pitches) # writing csv day = "".join([timestamp_params['year'], timestamp_params['month'], timestamp_params['day']]) for params in ( {'datasets': games, 'filename': Game.DOWNLOAD_FILE_NAME}, {'datasets': rosters, 'filename': Players.Player.DOWNLOAD_FILE_NAME}, {'datasets': coaches, 'filename': Players.Coach.DOWNLOAD_FILE_NAME}, {'datasets': umpires, 'filename': Players.Umpire.DOWNLOAD_FILE_NAME}, {'datasets': atbats, 'filename': AtBat.DOWNLOAD_FILE_NAME}, {'datasets': pitches, 'filename': Pitch.DOWNLOAD_FILE_NAME}, ): self._write_csv(params['datasets'], params['filename'].format(day=day, extension=self.extension)) time.sleep(2) logging.info('-<- Game data download end({year}/{month}/{day})'.format(**timestamp_params))
def test_player_umpire(self): """ Umpire data """ soup = BeautifulSoup(TestPlayers.XML_UMPIRE, 'lxml') umpire = Players.Umpire(soup.find('umpire'), 'SEA201508131') self.assertEqual(umpire.retro_game_id, 'SEA201508131') self.assertEqual(umpire.id, '427362') self.assertEqual(umpire.first, 'Jeff') self.assertEqual(umpire.last, 'Nelson') self.assertEqual(umpire.position, 'home') self.assertEqual(umpire.name, 'Jeff Nelson')
def test_player_umpire_row(self): """ Umpire dataset(row) """ soup = BeautifulSoup(TestPlayers.XML_UMPIRE, 'lxml') umpire = Players.Umpire(soup.find('umpire'), 'SEA201408131') row = umpire.row() self.assertEqual(row['retro_game_id'], 'SEA201408131') self.assertEqual(row['id'], '427362') self.assertEqual(row['first'], 'Jeff') self.assertEqual(row['last'], 'Nelson') self.assertEqual(row['position'], 'home') self.assertEqual(row['name'], 'Jeff Nelson')
def _download(self, timestamp): """ download MLBAM Game Day :param timestamp: day """ games, atbats, pitches = [], [], [] rosters, coaches, umpires = [], [], [] boxscores, actions = [], [] timestamp_params = { 'year': str(timestamp.year), 'month': str(timestamp.month).zfill(2), 'day': str(timestamp.day).zfill(2) } logging.info( '->- Game data download start({year}/{month}/{day})'.format( **timestamp_params)) base_url = self.DELIMITER.join( [self.url, self.PAGE_URL_GAME_DAY.format(**timestamp_params)]) html = MlbamUtil.find_xml(base_url, self.parser) href = self.PAGE_URL_GAME_PREFIX.format(**timestamp_params) for gid in html.find_all('a', href=re.compile(href)): gid_path = gid.get_text().strip() gid_url = self.DELIMITER.join([base_url, gid_path]) # Read XML & create dataset try: game = Game.read_xml(gid_url, self.parser, timestamp, MlbAm._get_game_number(gid_path)) players = Players.read_xml(gid_url, self.parser, game) innings = Inning.read_xml(gid_url, self.parser, game, players) boxscore = BoxScore.read_xml(gid_url, self.parser, game, players) except MlbAmHttpNotFound as e: logging.warning(e.msg) continue # append a dataset games.append(game.row()) rosters.extend( [roseter.row() for roseter in players.rosters.values()]) coaches.extend([coach.row() for coach in players.coaches.values()]) umpires.extend( [umpire.row() for umpire in players.umpires.values()]) atbats.extend(innings.atbats) pitches.extend(innings.pitches) actions.extend(innings.actions) boxscores.append(boxscore.row()) # writing csv day = "".join([ timestamp_params['year'], timestamp_params['month'], timestamp_params['day'] ]) for params in ( { 'datasets': games, 'filename': Game.DOWNLOAD_FILE_NAME }, { 'datasets': rosters, 'filename': Players.Player.DOWNLOAD_FILE_NAME }, { 'datasets': coaches, 'filename': Players.Coach.DOWNLOAD_FILE_NAME }, { 'datasets': umpires, 'filename': Players.Umpire.DOWNLOAD_FILE_NAME }, { 'datasets': atbats, 'filename': AtBat.DOWNLOAD_FILE_NAME }, { 'datasets': pitches, 'filename': Pitch.DOWNLOAD_FILE_NAME }, { 'datasets': boxscores, 'filename': BoxScore.DOWNLOAD_FILE_NAME }, { 'datasets': actions, 'filename': InningAction.DOWNLOAD_FILE_NAME }, ): self._write_csv( params['datasets'], params['filename'].format(day=day, extension=self.extension)) time.sleep(2) logging.info('-<- Game data download end({year}/{month}/{day})'.format( **timestamp_params))