R/advanced_stats_api.R

#' @title Advanced Stats
#' @description gets advanced stats from nba.com api
#' @keywords nba.com api advanced stats
#' @importFrom magrittr %>%
#' @export get_clean_stats_combined
#' @export get_player_stats_from_nba_api
#' @examples
#' get_advanced_stats_api(season='2018-19')

#helper function for cleaning data
my_char <- function(x) {
  out <- (ifelse(x %in% c('player_name','team_abbreviation','cfparams'),FALSE,TRUE))
  return (out)
}


get_player_stats_from_nba_api <- function(season, base_url = 'https://stats.nba.com/stats/leaguedashplayerstats?',
  game_scope = '', player_experience = '', player_position = '', starter_bench = '', measure_type = 'Advanced',
  per_mode = 'PerGame', plus_minus = 'N', pace_adjust = 'N', rank = 'N',
  season_type = 'Regular%20Season', outcome = '', location = '', month = 0, season_segment = '', date_from = '',
  date_to = '', opp_team_id = 0, vs_conf = '', vs_div = '', game_segment = '', period = 0, last_n_games = 0
) {

  nba_stats_url <- paste0(base_url,
                'GameScope=', game_scope,
                '&PlayerExperience=', player_experience,
                '&PlayerPosition=', player_position,
                '&StarterBench=', starter_bench,
                '&MeasureType=', measure_type,
                '&PerMode=', per_mode,
                '&PlusMinus=', plus_minus,
                '&PaceAdjust=', pace_adjust,
                '&Rank=', rank,
                '&Season=', season,
                '&SeasonType=', season_type,
                '&Outcome=', outcome,
                '&Location=', location,
                '&Month=', month,
                '&SeasonSegment=', season_segment,
                '&DateFrom=', date_from,
                '&DateTo=', date_to,
                '&OpponentTeamID=', opp_team_id,
                '&VsConference=', vs_conf,
                '&VsDivision=', vs_div,
                '&GameSegment=', game_segment,
                '&Period=', period,
                '&LastNGames=', last_n_games
  )

  print(nba_stats_url)

  nba_stats_json <-
    curl::curl(nba_stats_url) %>%
    jsonlite::fromJSON()

  nba_stats_df <- data.frame(nba_stats_json$resultSets$rowSet[[1]], stringsAsFactors = F)
  names(nba_stats_df) = tolower(nba_stats_json$resultSets$headers[[1]])

  return(nba_stats_df)
}

get_clean_stats_combined <- function(season, base_url = 'https://stats.nba.com/stats/leaguedashplayerstats?',
                               game_scope = '', player_experience = '', player_position = '', starter_bench = '',
                               per_mode = 'PerGame', plus_minus = 'N', pace_adjust = 'N', rank = 'N',
                               season_type = 'Regular%20Season', outcome = '', location = '', month = 0, season_segment = '', date_from = '',
                               date_to = '', opp_team_id = 0, vs_conf = '', vs_div = '', game_segment = '', period = 0, last_n_games = 0) {


  base_stats <- get_player_stats_from_nba_api(season = season, game_scope = game_scope,
                                                  player_experience = player_experience, player_position = player_position,
                                                  starter_bench = starter_bench, measure_type = 'Base', per_mode = per_mode,
                                                  plus_minus = plus_minus, pace_adjust = pace_adjust, rank = rank,
                                                  season_type = season_type, outcome = outcome, location = location,
                                                  month = month, season_segment = season_segment, date_from = date_from,
                                                  date_to = date_to, opp_team_id = opp_team_id, vs_conf = vs_conf, vs_div = vs_div,
                                                  game_segment = game_segment, period = period, last_n_games = last_n_games)
  advanced_stats <- get_player_stats_from_nba_api(season = season, game_scope = game_scope,
                                                  player_experience = player_experience, player_position = player_position,
                                                  starter_bench = starter_bench, measure_type = 'Advanced', per_mode = per_mode,
                                                  plus_minus = plus_minus, pace_adjust = pace_adjust, rank = rank,
                                                  season_type = season_type, outcome = outcome, location = location,
                                                  month = month, season_segment = season_segment, date_from = date_from,
                                                  date_to = date_to, opp_team_id = opp_team_id, vs_conf = vs_conf, vs_div = vs_div,
                                                  game_segment = game_segment, period = period, last_n_games = last_n_games)

  if (per_mode == 'PerGame') {

    advanced_stats <- advanced_stats %>%
      dplyr::select(-dplyr::matches('rank'))

    base_stats <- base_stats %>%
      dplyr::select(-fgm, -fga, -fg_pct) %>%
      dplyr::select(-dplyr::matches('rank'))

  } else if (per_mode == 'Totals') {

    advanced_stats <- advanced_stats %>%
      dplyr::select(-dplyr::matches('rank')) %>%
      dplyr::rename(min_pg = min)

    base_stats <- base_stats %>%
      dplyr::select(-dplyr::matches('rank')) %>%
      dplyr::rename(tot_min = min)

  } else if (per_mode %in% c('MinutesPer','Per48','Per36','PerMinute','PerPossession','PerPlay',
                             'Per100Possessions','Per100Plays')) {

    advanced_stats <- advanced_stats %>%
      dplyr::select(-dplyr::matches('rank')) %>%
      dplyr::rename(min_pg = min, fgm_tot = fgm, fga_tot = fga)

    base_stats <- base_stats %>%
      dplyr::select(-dplyr::matches('rank')) %>%
      dplyr::rename(min_tot = min)

  }

  common_names <- names(base_stats)[names(base_stats) %in% names(advanced_stats)]

  stats_merged_df <- base_stats %>%
    dplyr::inner_join(advanced_stats, by=common_names)

  stats_merged_df <- stats_merged_df %>%
    dplyr::mutate_if(sapply(names(stats_merged_df),my_char),as.numeric)

  return (stats_merged_df)

}
emilykuehler/basketballstatsR documentation built on May 31, 2019, 10:01 a.m.