def receiving(df):
    """Gets core receiving stats from play-by-play

    Args:
        df (DataFrame): play-by-play dataframe

    Returns:
        DataFrame with columns
        targets, receptions, rec_yards, rec_tds, 
        total_air_yards, inc_air_yards, yac
    """
    cols = ['player', 'targets', 'receptions', 'rec_yards', 'rec_tds',
            'total_air_yards', 'inc_air_yards', 'yac']
    return (
        df
        .query('play_type == "pass"')
        .groupby(['game_id', 'receiver_player_id'])
        .agg(targets=('play_type', 'count'),
            receptions=('complete_pass', 'sum'),
            rec_yards=('yards_gained', 'sum'),
            rec_tds=('pass_touchdown', 'sum'),
            total_air_yards=('air_yards', 'sum'), 
            yac=('yards_after_catch', 'sum'))
        .assign(inc_air_yards=lambda x: x['total_air_yards'] + x['yac'] - x['rec_yards'])
        .reset_index(level=0, drop=True)
        .join(df.groupby('receiver_player_id').first()['receiver_player_name'], how='left')
        .reset_index(drop=True)
        .rename(columns={'receiver_player_name': 'player'})
        .loc[:, cols]
        .set_index('player')
        .fillna(0)
        .astype(int)
    )