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
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
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')
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')
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
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)
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()
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'
from util.nba_stats import GeneralPlayerStats df = GeneralPlayerStats().get_data({}) None
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},
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)
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)
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()
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]
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:]