sportsref/nfl/boxscores.py
def pbp(self):
        """Returns a dataframe of the play-by-play data from the game.

        Order of function calls:
            1. parse_table on the play-by-play table
            2. expand_details
                - calls parse_play_details & _clean_features
            3. _add_team_columns
            4. various fixes to clean data
            5. _add_team_features

        :returns: pandas DataFrame of play-by-play. Similar to GPF.
        """
        doc = self.get_doc()
        table = doc('table#pbp')
        df = sportsref.utils.parse_table(table)
        # make the following features conveniently available on each row
        df['boxscore_id'] = self.boxscore_id
        df['home'] = self.home()
        df['away'] = self.away()
        df['season'] = self.season()
        df['week'] = self.week()
        feats = sportsref.nfl.pbp.expand_details(df)

        # add team and opp columns by iterating through rows
        df = sportsref.nfl.pbp._add_team_columns(feats)
        # add WPA column (requires diff, can't be done row-wise)
        df['home_wpa'] = df.home_wp.diff()
        # lag score columns, fill in 0-0 to start
        for col in ('home_wp', 'pbp_score_hm', 'pbp_score_aw'):
            if col in df.columns:
                df[col] = df[col].shift(1)
        df.loc[0, ['pbp_score_hm', 'pbp_score_aw']] = 0
        # fill in WP NaN's
        df.home_wp.fillna(method='ffill', inplace=True)
        # fix first play border after diffing/shifting for WP and WPA
        firstPlaysOfGame = df[df.secsElapsed == 0].index
        line = self.line()
        for i in firstPlaysOfGame:
            initwp = sportsref.nfl.winProb.initialWinProb(line)
            df.loc[i, 'home_wp'] = initwp
            df.loc[i, 'home_wpa'] = df.loc[i + 1, 'home_wp'] - initwp
        # fix last play border after diffing/shifting for WP and WPA
        lastPlayIdx = df.index[-1]
        lastPlayWP = df.loc[lastPlayIdx, 'home_wp']
        # if a tie, final WP is 50%; otherwise, determined by winner
        winner = self.winner()
        finalWP = 50. if pd.isnull(winner) else (winner == self.home()) * 100.
        df.loc[lastPlayIdx, 'home_wpa'] = finalWP - lastPlayWP
        # fix WPA for timeouts and plays after timeouts
        timeouts = df[df.isTimeout].index
        for to in timeouts:
            df.loc[to, 'home_wpa'] = 0.
            if to + 2 in df.index:
                wpa = df.loc[to + 2, 'home_wp'] - df.loc[to + 1, 'home_wp']
            else:
                wpa = finalWP - df.loc[to + 1, 'home_wp']
            df.loc[to + 1, 'home_wpa'] = wpa
        # add team-related features to DataFrame
        df = sportsref.nfl.pbp._add_team_features(df)
        # fill distToGoal NaN's
        df['distToGoal'] = np.where(df.isKickoff, 65, df.distToGoal)
        df.distToGoal.fillna(method='bfill', inplace=True)
        df.distToGoal.fillna(method='ffill', inplace=True)  # for last play

        return df
def pbp(self):
        """Returns a dataframe of the play-by-play data from the game.

        Order of function calls:
            1. parse_table on the play-by-play table
            2. expand_details
                - calls parse_play_details & _clean_features
            3. _add_team_columns
            4. various fixes to clean data
            5. _add_team_features

        :returns: pandas DataFrame of play-by-play. Similar to GPF.
        """
        doc = self.get_doc()
        table = doc('table#pbp')
        df = sportsref.utils.parse_table(table)
        # make the following features conveniently available on each row
        df['boxscore_id'] = self.boxscore_id
        df['home'] = self.home()
        df['away'] = self.away()
        df['season'] = self.season()
        df['week'] = self.week()
        feats = sportsref.nfl.pbp.expand_details(df)

        # add team and opp columns by iterating through rows
        df = sportsref.nfl.pbp._add_team_columns(feats)
        # add WPA column (requires diff, can't be done row-wise)
        df['home_wpa'] = df.home_wp.diff()
        # lag score columns, fill in 0-0 to start
        for col in ('home_wp', 'pbp_score_hm', 'pbp_score_aw'):
            if col in df.columns:
                df[col] = df[col].shift(1)
        df.loc[0, ['pbp_score_hm', 'pbp_score_aw']] = 0
        # fill in WP NaN's
        df.home_wp.fillna(method='ffill', inplace=True)
        # fix first play border after diffing/shifting for WP and WPA
        firstPlaysOfGame = df[df.secsElapsed == 0].index
        line = self.line()
        for i in firstPlaysOfGame:
            initwp = sportsref.nfl.winProb.initialWinProb(line)
            df.loc[i, 'home_wp'] = initwp
            df.loc[i, 'home_wpa'] = df.loc[i + 1, 'home_wp'] - initwp
        # fix last play border after diffing/shifting for WP and WPA
        lastPlayIdx = df.index[-1]
        lastPlayWP = df.loc[lastPlayIdx, 'home_wp']
        # if a tie, final WP is 50%; otherwise, determined by winner
        winner = self.winner()
        finalWP = 50. if pd.isnull(winner) else (winner == self.home()) * 100.
        df.loc[lastPlayIdx, 'home_wpa'] = finalWP - lastPlayWP
        # fix WPA for timeouts and plays after timeouts
        timeouts = df[df.isTimeout].index
        for to in timeouts:
            df.loc[to, 'home_wpa'] = 0.
            if to + 2 in df.index:
                wpa = df.loc[to + 2, 'home_wp'] - df.loc[to + 1, 'home_wp']
            else:
                wpa = finalWP - df.loc[to + 1, 'home_wp']
            df.loc[to + 1, 'home_wpa'] = wpa
        # add team-related features to DataFrame
        df = sportsref.nfl.pbp._add_team_features(df)
        # fill distToGoal NaN's
        df['distToGoal'] = np.where(df.isKickoff, 65, df.distToGoal)
        df.distToGoal.fillna(method='bfill', inplace=True)
        df.distToGoal.fillna(method='ffill', inplace=True)  # for last play

        return df
def pbp ( self ) : doc = self . get_doc ( ) table = doc ( 'table#pbp' ) df = sportsref . utils . parse_table ( table ) # make the following features conveniently available on each row df [ 'boxscore_id' ] = self . boxscore_id df [ 'home' ] = self . home ( ) df [ 'away' ] = self . away ( ) df [ 'season' ] = self . season ( ) df [ 'week' ] = self . week ( ) feats = sportsref . nfl . pbp . expand_details ( df ) # add team and opp columns by iterating through rows df = sportsref . nfl . pbp . _add_team_columns ( feats ) # add WPA column (requires diff, can't be done row-wise) df [ 'home_wpa' ] = df . home_wp . diff ( ) # lag score columns, fill in 0-0 to start for col in ( 'home_wp' , 'pbp_score_hm' , 'pbp_score_aw' ) : if col in df . columns : df [ col ] = df [ col ] . shift ( 1 ) df . loc [ 0 , [ 'pbp_score_hm' , 'pbp_score_aw' ] ] = 0 # fill in WP NaN's df . home_wp . fillna ( method = 'ffill' , inplace = True ) # fix first play border after diffing/shifting for WP and WPA firstPlaysOfGame = df [ df . secsElapsed == 0 ] . index line = self . line ( ) for i in firstPlaysOfGame : initwp = sportsref . nfl . winProb . initialWinProb ( line ) df . loc [ i , 'home_wp' ] = initwp df . loc [ i , 'home_wpa' ] = df . loc [ i + 1 , 'home_wp' ] - initwp # fix last play border after diffing/shifting for WP and WPA lastPlayIdx = df . index [ - 1 ] lastPlayWP = df . loc [ lastPlayIdx , 'home_wp' ] # if a tie, final WP is 50%; otherwise, determined by winner winner = self . winner ( ) finalWP = 50. if pd . isnull ( winner ) else ( winner == self . home ( ) ) * 100. df . loc [ lastPlayIdx , 'home_wpa' ] = finalWP - lastPlayWP # fix WPA for timeouts and plays after timeouts timeouts = df [ df . isTimeout ] . index for to in timeouts : df . loc [ to , 'home_wpa' ] = 0. if to + 2 in df . index : wpa = df . loc [ to + 2 , 'home_wp' ] - df . loc [ to + 1 , 'home_wp' ] else : wpa = finalWP - df . loc [ to + 1 , 'home_wp' ] df . loc [ to + 1 , 'home_wpa' ] = wpa # add team-related features to DataFrame df = sportsref . nfl . pbp . _add_team_features ( df ) # fill distToGoal NaN's df [ 'distToGoal' ] = np . where ( df . isKickoff , 65 , df . distToGoal ) df . distToGoal . fillna ( method = 'bfill' , inplace = True ) df . distToGoal . fillna ( method = 'ffill' , inplace = True ) # for last play return df
Returns a dataframe of the play-by-play data from the game.

        Order of function calls:
            1. parse_table on the play-by-play table
            2. expand_details
                - calls parse_play_details & _clean_features
            3. _add_team_columns
            4. various fixes to clean data
            5. _add_team_features

        :returns: pandas DataFrame of play-by-play. Similar to GPF.
Returns a dataframe of the play - by - play data from the game .