Пример #1
0
def determine_from_listed_position():
    general_stats_ep = GeneralPlayerStats()

    guards = general_stats_ep.get_data({'Season': '2017-18', 'PlayerPosition': 'G'})
    forwards = general_stats_ep.get_data({'Season': '2017-18', 'PlayerPosition': 'F'})
    centers = general_stats_ep.get_data({'Season': '2017-18', 'PlayerPosition': 'C'})

    guards['G'] = 1
    forwards['F'] = 1
    centers['C'] = 1

    merge_df = pd.merge(guards, forwards, on=['PLAYER_NAME', 'PLAYER_ID', 'TEAM_ABBREVIATION', 'TEAM_ID'], how='outer')
    merge_df = pd.merge(merge_df, centers, on=['PLAYER_NAME', 'PLAYER_ID', 'TEAM_ABBREVIATION', 'TEAM_ID'], how='outer')

    merge_df = merge_df[['PLAYER_NAME', 'PLAYER_ID', 'TEAM_ABBREVIATION', 'TEAM_ID', 'G', 'F', 'C']]
    merge_df = merge_df.fillna(0)

    conditions = [
        ((merge_df['G'] == 1) & (merge_df['F'] == 0) & (merge_df['C'] == 0)),
        ((merge_df['F'] == 1) & (merge_df['C'] == 0)),
        (merge_df['C'] == 1)
    ]
    choices = ['Guard', 'Wing', 'Big']

    merge_df['POSITION'] = np.select(conditions, choices, default='None')
    return merge_df
Пример #2
0
def analyze_stint_data(stints_df, season):
    player_stats = GeneralPlayerStats().get_data({'Season': season, 'MeasureType': 'Base', 'PerMode': 'PerGame'},
                                                 override_file=True)[['PLAYER_NAME', 'MIN', 'GP']]

    player_stats = player_stats[(player_stats['MIN'] >= 20) & (player_stats['GP'] >= 20)]

    data = []
    for ix, player in player_stats.iterrows():
        player_stints = stints_df[stints_df['player'] == player.PLAYER_NAME]
        average_stint_time = player_stints['time'].mean()
        data.append({
            'player': player.PLAYER_NAME,
            'average_stint': average_stint_time,
            'seconds_per_game': player.MIN * 60,
            'game': player.GP,
            'stints_per_game': len(player_stints) / player.GP,
            '10_min_stints': len(player_stints[player_stints['time'] >= 10 * 60]),
            '15_min_stints': len(player_stints[player_stints['time'] >= 15 * 60]),
            '20_min_stints': len(player_stints[player_stints['time'] >= 20 * 60]),
            '25_min_stints': len(player_stints[player_stints['time'] >= 25 * 60]),
            '30_min_stints': len(player_stints[player_stints['time'] >= 30 * 60]),
        })

    data_df = pd.DataFrame(data)
    data_df['mpg_to_stint'] = data_df['seconds_per_game'] / data_df['average_stint']
    data_df = data_df.sort_values(by='30_min_stints', ascending=False)
    return data_df
Пример #3
0
def compare_to_normal_offense():
    matchup_ep = Matchups()
    general_stats_ep = GeneralPlayerStats()

    matchup_df = matchup_ep.aggregate_data(override_file=False)
    matchup_df['EFG'] = ((matchup_df['FG3M'] * 3) + ((matchup_df['FGM'] - matchup_df['FG3M']) * 2)) / (matchup_df['FGA']) * 50

    general_stats_df = general_stats_ep.get_data(
        {'Season': '2017-18', 'PerMode': 'Per100Possessions', 'MeasureType': 'Base'}, override_file=True)

    stat_cols = ['AST', 'FG3A', 'FG3M', 'FGA', 'FGM', 'FTM']
    general_stats_df = general_stats_df[['PLAYER_NAME'] + stat_cols]

    general_stats_df['OFF_PLAYER_EFG'] = ((general_stats_df['FG3M'] * 3) + (
                (general_stats_df['FGM'] - general_stats_df['FG3M']) * 2)) / (general_stats_df['FGA']) * 50

    for sc in stat_cols:
        general_stats_df = general_stats_df.rename(columns={sc: 'OFF_PLAYER_' + sc + '_PER_100'})

    matchup_df = pd.merge(matchup_df, general_stats_df, left_on='OFF_PLAYER', right_on='PLAYER_NAME', how='left')

    for sc in stat_cols:
        matchup_df[sc + '_ABOVE_EXP'] = matchup_df[sc] - (matchup_df['OFF_PLAYER_' + sc + '_PER_100'] / 100 * matchup_df['POSS'])
    matchup_df['EFG_ABOVE_EXP'] = matchup_df['EFG'] - matchup_df['OFF_PLAYER_EFG']

    matchup_df.to_csv(data_dir + 'Matchup_per_100_comp.csv')
Пример #4
0
def compare_to_normal_offense():
    matchup_ep = Matchups()
    general_stats_ep = GeneralPlayerStats()

    matchup_df = matchup_ep.aggregate_data(override_file=False)
    matchup_df['EFG'] = ((matchup_df['FG3M'] * 3) +
                         ((matchup_df['FGM'] - matchup_df['FG3M']) * 2)) / (
                             matchup_df['FGA']) * 50

    general_stats_df = general_stats_ep.get_data(
        {
            'Season': '2017-18',
            'PerMode': 'Per100Possessions',
            'MeasureType': 'Base'
        },
        override_file=True)

    stat_cols = ['AST', 'FG3A', 'FG3M', 'FGA', 'FGM', 'FTM']
    general_stats_df = general_stats_df[['PLAYER_NAME'] + stat_cols]

    general_stats_df['OFF_PLAYER_EFG'] = ((general_stats_df['FG3M'] * 3) + (
        (general_stats_df['FGM'] - general_stats_df['FG3M']) * 2)) / (
            general_stats_df['FGA']) * 50

    for sc in stat_cols:
        general_stats_df = general_stats_df.rename(
            columns={sc: 'OFF_PLAYER_' + sc + '_PER_100'})

    matchup_df = pd.merge(matchup_df,
                          general_stats_df,
                          left_on='OFF_PLAYER',
                          right_on='PLAYER_NAME',
                          how='left')

    for sc in stat_cols:
        matchup_df[sc + '_ABOVE_EXP'] = matchup_df[sc] - (
            matchup_df['OFF_PLAYER_' + sc + '_PER_100'] / 100 *
            matchup_df['POSS'])
    matchup_df[
        'EFG_ABOVE_EXP'] = matchup_df['EFG'] - matchup_df['OFF_PLAYER_EFG']

    matchup_df.to_csv(data_dir + 'Matchup_per_100_comp.csv')
Пример #5
0
def get_team_logos():
    teams = GeneralPlayerStats().get_data({})['TEAM_ABBREVIATION'].unique()
    logo_url = 'http://stats.nba.com/media/img/teams/logos/{}_logo.svg'
    logo_file_location = './img/{}.svg'
    for t in teams:
        team_logo_url = logo_url.format(t)
        team_logo_file_location = logo_file_location.format(t)
        response = requests.get(team_logo_url, stream=True)
        with open(team_logo_file_location, 'wb') as out_file:
            shutil.copyfileobj(response.raw, out_file)
        del response
Пример #6
0
def compare_position():
    matchup_ep = Matchups()
    general_stats_ep = GeneralPlayerStats()

    matchup_df = matchup_ep.aggregate_data(override_file=False)
    position_df = Position.determine_from_listed_position()[[
        'PLAYER_NAME', 'POSITION'
    ]]

    matchup_df = matchup_df.merge(position_df,
                                  left_on=['OFF_PLAYER'],
                                  right_on='PLAYER_NAME',
                                  how='left')
    matchup_df = matchup_df.rename(columns={'POSITION': 'OFF_PLAYER_POSITION'})

    matchup_df = matchup_df.merge(position_df,
                                  left_on=['DEF_PLAYER'],
                                  right_on='PLAYER_NAME',
                                  how='left')
    matchup_df = matchup_df.rename(columns={'POSITION': 'DEF_PLAYER_POSITION'})

    players = matchup_df['DEF_PLAYER'].unique()

    positional_matchup_data = []
    for p in players:
        player_df = matchup_df[matchup_df['DEF_PLAYER'] == p]
        if len(player_df) > 0:
            total_poss = player_df['POSS'].sum()
            positional_matchup_data.append({
                'PLAYER_NAME':
                p,
                'POSITION':
                player_df.iloc[0]['DEF_PLAYER_POSITION'],
                'GUARD_PCT':
                player_df[player_df['OFF_PLAYER_POSITION'] ==
                          'Guard']['POSS'].sum() / total_poss * 100,
                'WING_PCT':
                player_df[player_df['OFF_PLAYER_POSITION'] ==
                          'Wing']['POSS'].sum() / total_poss * 100,
                'BIG_PCT':
                player_df[player_df['OFF_PLAYER_POSITION'] == 'Big']
                ['POSS'].sum() / total_poss * 100,
                'TOTAL_POSS':
                total_poss
            })

    return pd.DataFrame(positional_matchup_data).sort_values(by='TOTAL_POSS',
                                                             ascending=False)
Пример #7
0
from util.nba_stats import PlayerPassDashboard, GeneralPlayerStats
import pandas as pd

import plotly.plotly as py
import plotly.graph_objs as go

pass_ep = PlayerPassDashboard()
general_ep = GeneralPlayerStats()

season = '2017-18'
team_id = '1610612740'
team_name = 'Pelicans'
per_mode = 'PerGame'
games_filter = 30
minutes_filter = 25
data_override = False

general_df = general_ep.get_data(
    {
        'Season': season,
        'PerMode': per_mode,
        'MeasureType': 'Base',
        'TeamID': team_id
    },
    override_file=data_override)
general_df = general_df[general_df['GP'] >= games_filter]
general_df = general_df[general_df['MIN'] >= minutes_filter]

general_df = general_df.sort_values(by='MIN', ascending=False)

players = general_df['PLAYER_ID'].tolist()
Пример #8
0
from util.nba_stats import PlayerAdvancedGameLogs, GeneralPlayerStats
from util.format import get_year_string
from util.reddit import print_reddit_table
import pandas as pd
import plotly.plotly as py
import plotly.graph_objs as go

stat_to_graph = 'TSA'
stat_to_sort = 'PTS'

data_override = False
normalize_for_possessions = False

logs = PlayerAdvancedGameLogs()
general_stats = GeneralPlayerStats()


def get_trace_for_year(season,
                       num_games_filter=50,
                       num_players_filter=10,
                       min_played_filter=20,
                       is_multi_year=False):
    base_log_df = logs.get_data({
        'Season': season,
        'MeasureType': 'Base'
    },
                                override_file=data_override)
    advanced_log_df = logs.get_data(
        {
            'Season': season,
            'MeasureType': 'Advanced'
Пример #9
0
from util.nba_stats import GeneralPlayerStats


df = GeneralPlayerStats().get_data({})
None
Пример #10
0
from util.nba_stats import PlayerPassDashboard, GeneralPlayerStats
import pandas as pd

import plotly.plotly as py
import plotly.graph_objs as go

pass_ep = PlayerPassDashboard()
general_ep = GeneralPlayerStats()

season = '2017-18'
team_id = '1610612740'
team_name = 'Pelicans'
per_mode = 'PerGame'
games_filter = 30
minutes_filter = 25
data_override = False

general_df = general_ep.get_data({'Season': season, 'PerMode': per_mode, 'MeasureType': 'Base', 'TeamID': team_id},
                                 override_file=data_override)
general_df = general_df[general_df['GP'] >= games_filter]
general_df = general_df[general_df['MIN'] >= minutes_filter]

general_df = general_df.sort_values(by='MIN', ascending=False)

players = general_df['PLAYER_ID'].tolist()

df = pd.DataFrame()

for ix, player in general_df.iterrows():
    player_pass_df = pass_ep.get_data(
        {'Season': season, 'PerMode': per_mode, 'PlayerID': player.PLAYER_ID, 'TeamID': player.TEAM_ID},
Пример #11
0
from util.nba_stats import GeneralPlayerStats
from util.util import merge_shot_pbp_for_season
import pandas as pd

import plotly.plotly as py
import plotly.graph_objs as go

year = '2017-18'
min_filter = 0

df = merge_shot_pbp_for_season(year)

guards_df = GeneralPlayerStats().get_data(
    {'Season': year, 'PlayerPosition': 'C', 'PerMode': 'Totals'})
guards_df = guards_df[guards_df['MIN'] >= min_filter]

guards = guards_df['PLAYER_NAME'].tolist()

data = []
for g in guards:
    g_df = df[df['PLAYER1_NAME'] == g]

    if len(g_df) == 0:
        continue

    team_name = g_df['PLAYER1_TEAM_ABBREVIATION'].iloc[0]
    total_attempts = len(g_df)

    g_df = g_df[g_df['SHOT_ZONE_BASIC'] == 'Restricted Area']
    restricted_area_attempts = len(g_df)
Пример #12
0
from util.nba_stats import GeneralPlayerStats
from util.util import merge_shot_pbp_for_season
from util.format import get_year_string
import pandas as pd
import numpy as np

import plotly.plotly as py
import plotly.graph_objs as go

general_df = GeneralPlayerStats().get_data({'Season': '2017-18', 'MeasureType': 'Base'}, override_file=False)
general_df = general_df.sort_values(by='FG3A', ascending=False)

players = general_df.head(25).PLAYER_NAME.tolist()

df = pd.DataFrame()
for y in range(2009, 2018):
    year = get_year_string(y)
    print(year)
    year_df = merge_shot_pbp_for_season(year)
    df = df.append(year_df)

player_df = df[df.PLAYER1_NAME == 'DeMar DeRozan']
player_df = player_df[player_df.SHOT_TYPE == '3PT Field Goal']

player_df['SHOT_MADE_FLAG'] = player_df['SHOT_MADE_FLAG'] * 100

rolling_avg = pd.rolling_mean(player_df['SHOT_MADE_FLAG'], 100).tolist()[99:]
player_data = {
    'Min': min(rolling_avg),
    'Max': max(rolling_avg),
    'Std': np.std(rolling_avg)
Пример #13
0
from util.nba_stats import get_rpm, GeneralPlayerStats, data_dir
from util.reddit import print_reddit_table
import pandas as pd

import plotly.plotly as py
import plotly.graph_objs as go

rpm_df = get_rpm()

base_df = GeneralPlayerStats().get_data({
    'Season': '2017-18',
    'PerMode': 'Totals',
    'MeasureType': 'Base'
})
base_df = base_df[base_df.MIN >= 200]

merge_df = pd.merge(rpm_df,
                    base_df,
                    left_on=['NAME'],
                    right_on=['PLAYER_NAME'],
                    how='inner')
merge_df.to_csv(data_dir + '3&D.csv')

merge_df['3pt_Rate'] = (merge_df['FG3A'] / merge_df['MIN']) * 48
merge_df['3pt_Pct_Abv_Exp'] = merge_df['FG3_PCT'] - (merge_df['FG3M'].sum() /
                                                     merge_df['FG3A'].sum())
merge_df['3pt_Rating'] = merge_df['3pt_Rate'] * merge_df['FG3_PCT']
merge_df = merge_df[merge_df['3pt_Rating'] > 1]

merge_df = merge_df[['NAME', 'MIN', '3pt_Rating', 'DRPM']]
merge_df['MIN'] -= merge_df.MIN.min()
Пример #14
0
from util.nba_stats import GeneralPlayerStats, TrackingStats
from util.format import get_year_string
from util.reddit import print_reddit_table
import pandas as pd

data_override = False

generalStats = GeneralPlayerStats()
trackingStats = TrackingStats()


def get_true_usage_for_year(year):
    base_cols = [
        'PLAYER_NAME', 'PLAYER_ID', 'TEAM_ABBREVIATION', 'TEAM_ID', 'MIN',
        'PTS', 'FGA', 'FTA', 'TOV'
    ]
    base_df = generalStats.get_data(
        {
            'Season': year,
            'PerMode': 'Totals',
            'MeasureType': 'Base'
        },
        override_file=data_override)[base_cols]
    advanced_cols = ['PLAYER_ID', 'TEAM_ID', 'PACE', 'TS_PCT']
    advanced_df = generalStats.get_data(
        {
            'Season': year,
            'PerMode': 'Totals',
            'MeasureType': 'Advanced'
        },
        override_file=data_override)[advanced_cols]
Пример #15
0
from util.nba_stats import GeneralPlayerStats
from util.util import merge_shot_pbp_for_season
from util.format import get_year_string
import pandas as pd
import numpy as np

import plotly.plotly as py
import plotly.graph_objs as go

general_df = GeneralPlayerStats().get_data(
    {
        'Season': '2017-18',
        'MeasureType': 'Base'
    }, override_file=False)
general_df = general_df.sort_values(by='FG3A', ascending=False)

players = general_df.head(25).PLAYER_NAME.tolist()

df = pd.DataFrame()
for y in range(2009, 2018):
    year = get_year_string(y)
    print(year)
    year_df = merge_shot_pbp_for_season(year)
    df = df.append(year_df)

player_df = df[df.PLAYER1_NAME == 'DeMar DeRozan']
player_df = player_df[player_df.SHOT_TYPE == '3PT Field Goal']

player_df['SHOT_MADE_FLAG'] = player_df['SHOT_MADE_FLAG'] * 100

rolling_avg = pd.rolling_mean(player_df['SHOT_MADE_FLAG'], 100).tolist()[99:]