'Returns a GenPlayers sequence of player statistics that combines
game statistics and play statistics by taking the max value of
each corresponding statistic.
This is useful when accuracy is desirable. Namely, using only
play-by-play data or using only game statistics can be unreliable.
That is, both are inconsistently correct.
Taking the max values of each statistic reduces the chance of being
wrong (particularly for stats that are in both play-by-play data
and game statistics), but does not eliminate them.'

def max_player_stats(self):

    game_players = list(self.players)
    play_players = list(self.drives.plays().players())
    max_players = OrderedDict()
    for pplay in play_players:
        newp = nflgame.player.GamePlayerStats(pplay.playerid, pplay.name, pplay.home, pplay.team)
        maxstats = {}
        for (stat, val) in pplay._stats.iteritems():
            maxstats[stat] = val
        newp._overwrite_stats(maxstats)
        max_players[pplay.playerid] = newp
    for newp in max_players.itervalues():
        for pgame in game_players:
            if (pgame.playerid != newp.playerid):
                continue
            maxstats = {}
            for (stat, val) in pgame._stats.iteritems():
                maxstats[stat] = max([val, newp._stats.get(stat, (- _MAX_INT))])
            newp._overwrite_stats(maxstats)
            break
    return nflgame.seq.GenPlayerStats(max_players)
