From c35481db5376269aa748405da06d87b2c652c9ad Mon Sep 17 00:00:00 2001 From: saiemgilani Date: Sat, 1 Apr 2023 15:37:37 -0400 Subject: [PATCH] nba teams function, update urls for loaders --- NAMESPACE | 3 + NEWS.md | 5 + R/data.R | 28 ---- R/espn_mbb_data.R | 183 +++++++++++++++------ R/load_mbb.R | 8 +- R/load_nba.R | 8 +- R/nba_stats_pbp.R | 16 +- R/nba_stats_team.R | 91 ++++++++++ R/ncaa_mbb_data.R | 150 ++++++++++++++++- R/utils_nba_stats.R | 14 ++ README.md | 8 +- _pkgdown.yml | 4 +- cran-comments.md | 2 + data-raw/mbb_teams.R | 12 ++ data/nba_teams.rda | Bin 2366 -> 0 bytes man/espn_mbb_conferences.Rd | 11 +- man/espn_mbb_standings.Rd | 2 +- man/espn_mbb_teams.Rd | 18 +- man/nba_leaguedashteamstats.Rd | 1 + man/nba_teamdashboardbyclutch.Rd | 1 + man/nba_teamdashboardbygamesplits.Rd | 1 + man/nba_teamdashboardbygeneralsplits.Rd | 1 + man/nba_teamdashboardbylastngames.Rd | 1 + man/nba_teamdashboardbyopponent.Rd | 1 + man/nba_teamdashboardbyshootingsplits.Rd | 1 + man/nba_teamdashboardbyteamperformance.Rd | 1 + man/nba_teamdashboardbyyearoveryear.Rd | 1 + man/nba_teamdashlineups.Rd | 1 + man/nba_teamdashptpass.Rd | 1 + man/nba_teamdashptreb.Rd | 1 + man/nba_teamdashptshots.Rd | 1 + man/nba_teamdetails.Rd | 1 + man/nba_teamestimatedmetrics.Rd | 1 + man/nba_teamgamelog.Rd | 1 + man/nba_teamgamelogs.Rd | 1 + man/nba_teamgamestreakfinder.Rd | 1 + man/nba_teamhistoricalleaders.Rd | 1 + man/nba_teaminfocommon.Rd | 1 + man/nba_teamplayerdashboard.Rd | 1 + man/nba_teamplayeronoffdetails.Rd | 1 + man/nba_teamplayeronoffsummary.Rd | 1 + man/nba_teams.Rd | 104 ++++++++---- man/nba_teamvsplayer.Rd | 1 + man/nba_teamyearbyyearstats.Rd | 1 + man/ncaa_mbb_teams.Rd | 35 ++++ tests/testthat/test-espn_mbb_conferences.R | 9 +- tests/testthat/test-espn_mbb_teams.R | 11 +- tests/testthat/test-nba_teams.R | 39 +++++ tests/testthat/test-ncaa_mbb_teams.R | 19 +++ 49 files changed, 659 insertions(+), 146 deletions(-) create mode 100644 data-raw/mbb_teams.R delete mode 100644 data/nba_teams.rda create mode 100644 man/ncaa_mbb_teams.Rd create mode 100644 tests/testthat/test-nba_teams.R create mode 100644 tests/testthat/test-ncaa_mbb_teams.R diff --git a/NAMESPACE b/NAMESPACE index 4133b2c0..deea60c4 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -225,6 +225,7 @@ export(nba_teaminfocommon) export(nba_teamplayerdashboard) export(nba_teamplayeronoffdetails) export(nba_teamplayeronoffsummary) +export(nba_teams) export(nba_teamvsplayer) export(nba_teamyearbyyearstats) export(nba_todays_scoreboard) @@ -238,6 +239,7 @@ export(nbagl_players) export(nbagl_schedule) export(nbagl_standings) export(ncaa_mbb_NET_rankings) +export(ncaa_mbb_teams) export(progressively) export(update_mbb_db) export(update_nba_db) @@ -295,6 +297,7 @@ importFrom(stringr,str_length) importFrom(stringr,str_pad) importFrom(stringr,str_remove) importFrom(stringr,str_replace) +importFrom(stringr,str_split) importFrom(stringr,str_sub) importFrom(stringr,str_trim) importFrom(tidyr,everything) diff --git a/NEWS.md b/NEWS.md index 573908cc..ddbf77d6 100644 --- a/NEWS.md +++ b/NEWS.md @@ -27,6 +27,11 @@ - ```nba_franchiseleaderswrank()``` function added. - ```nba_videodetailsasset()``` function added. - ```nba_infographicfanduelplayer()``` function added. +- ```nba_teams()``` function added. + +### **Other Functions Added** + +- ```ncaa_mbb_teams()``` function added. ### **Proxy Capability Added and Other Notes** diff --git a/R/data.R b/R/data.R index ff39d4fb..09a74f9a 100644 --- a/R/data.R +++ b/R/data.R @@ -11,31 +11,3 @@ #' \item{\code{conf.link.ref}}{character.} #' } "teams_links" - -#' **NBA Stats API's Teams Dictionary** -#' @format A data frame with 30 rows and 10 variables:\ -#' \describe{ -#' \item{\code{LeagueID}}{character.} -#' \item{\code{SeasonID}}{character.} -#' \item{\code{TeamID}}{character.} -#' \item{\code{TeamCity}}{character.} -#' \item{\code{TeamName}}{character.} -#' \item{\code{TeamSlug}}{double.} -#' \item{\code{Conference}}{character.} -#' \item{\code{Division}}{character.} -#' \item{\code{Season}}{character.} -#' \item{\code{TeamNameFull}}{character.} -#' \item{\code{espn_team_id}}{integer.} -#' \item{\code{abbreviation}}{character.} -#' \item{\code{display_name}}{character.} -#' \item{\code{mascot}}{character.} -#' \item{\code{nickname}}{character.} -#' \item{\code{team}}{character.} -#' \item{\code{color}}{character.} -#' \item{\code{alternate_color}}{character.} -#' \item{\code{logo}}{character.} -#' \item{\code{logo_dark}}{character.} -#' \item{\code{logos_href_3}}{character.} -#' \item{\code{logos_href_4}}{character.} -#' } -"nba_teams" diff --git a/R/espn_mbb_data.R b/R/espn_mbb_data.R index 2ae9dae1..a8a88e52 100644 --- a/R/espn_mbb_data.R +++ b/R/espn_mbb_data.R @@ -924,7 +924,7 @@ espn_mbb_game_rosters <- function(game_id) { "position_href", "statistics_href" ))) %>% - make_hoopR_data("ESPN MBB Game Roster Information from ESPN.com",Sys.time()) + make_hoopR_data("ESPN MBB Game Roster Information from ESPN.com", Sys.time()) }, error = function(e) { @@ -950,14 +950,15 @@ espn_mbb_game_rosters <- function(game_id) { #' @author Saiem Gilani #' @return A conferences data frame #' -#' |col_name |types | -#' |:---------------|:---------| -#' |group_id |character | -#' |short_name |character | -#' |uid |character | -#' |name |character | -#' |logo |character | -#' |parent_group_id |character | +#' |col_name |types | +#' |:---------------------|:---------| +#' |group_id |integer | +#' |conference_short_name |character | +#' |conference_uid |character | +#' |conference_name |character | +#' |conference_logo |character | +#' |parent_group_id |character | +#' |conference_id |integer | #' #' @importFrom jsonlite fromJSON toJSON #' @importFrom dplyr filter select rename bind_cols bind_rows @@ -975,10 +976,11 @@ espn_mbb_conferences <- function() { old <- options(list(stringsAsFactors = FALSE, scipen = 999)) on.exit(options(old)) - play_base_url <- "http://site.api.espn.com/apis/site/v2/sports/basketball/mens-college-basketball/scoreboard/conferences?seasontype=2" tryCatch( expr = { + play_base_url <- "http://site.api.espn.com/apis/site/v2/sports/basketball/mens-college-basketball/scoreboard/conferences?seasontype=2" + res <- httr::RETRY("GET", play_base_url) # Check the result @@ -991,6 +993,15 @@ espn_mbb_conferences <- function() { dplyr::select(-"subGroups") %>% janitor::clean_names() %>% dplyr::filter(!(.data$group_id %in% c(0,50))) %>% + dplyr::mutate( + group_id = as.integer(.data$group_id), + conference_id = .data$group_id) %>% + dplyr::rename(dplyr::any_of(c( + "conference_short_name" = "short_name", + "conference_uid" = "uid", + "conference_name" = "name", + "conference_logo" = "logo" + ))) %>% make_hoopR_data("ESPN MBB Conferences Information from ESPN.com",Sys.time()) }, @@ -1011,21 +1022,31 @@ espn_mbb_conferences <- function() { #' **Get ESPN men's college basketball team names and IDs** #' @author Saiem Gilani +#' @param year Either numeric or character (YYYY) #' @return A teams data frame #' -#' |col_name |types | -#' |:---------------|:---------| -#' |team_id |character | -#' |abbreviation |character | -#' |display_name |character | -#' |short_name |character | -#' |mascot |character | -#' |nickname |character | -#' |team |character | -#' |color |character | -#' |alternate_color |character | -#' |logo |character | -#' |logo_dark |character | +#' |col_name |types | +#' |:---------------------|:---------| +#' |team_id |integer | +#' |abbreviation |character | +#' |display_name |character | +#' |short_name |character | +#' |mascot |character | +#' |nickname |character | +#' |team |character | +#' |color |character | +#' |alternate_color |character | +#' |logo |character | +#' |logo_dark |character | +#' |href |character | +#' |conference_url |character | +#' |group_id |integer | +#' |conference_short_name |character | +#' |conference_uid |character | +#' |conference_name |character | +#' |conference_logo |character | +#' |parent_group_id |character | +#' |conference_id |integer | #' #' @importFrom jsonlite fromJSON toJSON #' @importFrom dplyr filter select rename bind_cols bind_rows row_number group_by mutate as_tibble ungroup @@ -1037,16 +1058,17 @@ espn_mbb_conferences <- function() { #' @family ESPN MBB Functions #' @examples #' \donttest{ -#' try(espn_mbb_teams()) +#' x<-try(espn_mbb_teams()) #' } -espn_mbb_teams <- function() { +espn_mbb_teams <- function(year = most_recent_mbb_season()) { old <- options(list(stringsAsFactors = FALSE, scipen = 999)) on.exit(options(old)) - play_base_url <- "http://site.api.espn.com/apis/site/v2/sports/basketball/mens-college-basketball/teams?limit=1000" tryCatch( expr = { - res <- httr::RETRY("GET", play_base_url) + teams_base_url <- "http://site.api.espn.com/apis/site/v2/sports/basketball/mens-college-basketball/teams?limit=1000" + + res <- httr::RETRY("GET", teams_base_url) # Check the result check_status(res) @@ -1105,7 +1127,63 @@ espn_mbb_teams <- function() { "short_name" = "shortDisplayName", "alternate_color" = "alternateColor", "display_name" = "displayName") %>% - make_hoopR_data("ESPN MBB Teams Information from ESPN.com",Sys.time()) + dplyr::mutate(team_id = as.integer(.data$team_id)) + + conferences <- espn_mbb_conferences() + + # ---- Figuring out which teams are in which conference (32 calls) + base_url <- "http://sports.core.api.espn.com/v2/sports/basketball/leagues/mens-college-basketball/seasons" + conferences_base_url <- glue::glue("{base_url}/{year}/types/2/groups/50/children?limit=1000&lang=en®ion=us") + + res <- httr::RETRY("GET", conferences_base_url) + + # Check the result + check_status(res) + + resp <- res %>% + httr::content(as = "text", encoding = "UTF-8") + + conf_items <- resp %>% + jsonlite::fromJSON() %>% + purrr::pluck("items") %>% + data.frame() %>% + dplyr::rename("href" = "X.ref") %>% + dplyr::mutate( + group_id = as.integer(stringr::str_extract(.data$href, "(?<=groups\\/)\\d+")), + teams_url = paste0(base_url,"/", + year, + "/types/2/groups/", + .data$group_id, + "/teams?lang=en®ion=us") + ) + + conference_teams <- purrr::map_dfr(conf_items$teams_url, function(x){ + res <- httr::RETRY("GET", x) + + # Check the result + check_status(res) + + resp <- res %>% + httr::content(as = "text", encoding = "UTF-8") + + conf_items <- resp %>% + jsonlite::fromJSON() %>% + purrr::pluck("items") %>% + data.frame() %>% + dplyr::rename("href" = "X.ref") %>% + dplyr::mutate( + conference_url = x, + group_id = as.integer(stringr::str_extract(x, "(?<=groups\\/)\\d+")), + team_id = as.integer(stringr::str_extract(.data$href, "(?<=teams\\/)\\d+")) + ) + return(conf_items) + }) + + teams <- teams %>% + dplyr::left_join(conference_teams, by = c("team_id" = "team_id")) %>% + dplyr::left_join(conferences, by = c("group_id" = "group_id")) %>% + make_hoopR_data("ESPN MBB Teams Information from ESPN.com", Sys.time()) + }, error = function(e) { message(glue::glue("{Sys.time()}: Invalid arguments or no teams data available!")) @@ -1188,7 +1266,7 @@ parse_espn_mbb_scoreboard <- function(group, season_dates) { "type" ) )) %>% - tidyr::unnest_wider("season",names_sep="_") %>% + tidyr::unnest_wider("season", names_sep = "_") %>% dplyr::rename("season" = "season_year") %>% dplyr::select(-dplyr::any_of("status")) mbb_data <- mbb_data %>% @@ -1224,26 +1302,26 @@ parse_espn_mbb_scoreboard <- function(group, season_dates) { mbb_data <- mbb_data %>% dplyr::mutate( - home_team_name = ifelse(.data$homeAway=="home",.data$team1_team_name, .data$team2_team_name), - home_team_logo = ifelse(.data$homeAway=="home",.data$team1_team_logo, .data$team2_team_logo), - home_team_abb = ifelse(.data$homeAway=="home",.data$team1_team_abb, .data$team2_team_abb), - home_team_id = ifelse(.data$homeAway=="home",.data$team1_team_id, .data$team2_team_id), - home_team_location = ifelse(.data$homeAway=="home",.data$team1_team_location, .data$team2_team_location), - home_team_full_name = ifelse(.data$homeAway=="home",.data$team1_team_full, .data$team2_team_full), - home_team_color = ifelse(.data$homeAway=="home",.data$team1_team_color, .data$team2_team_color), - home_score = ifelse(.data$homeAway=="home",.data$team1_score, .data$team2_score), - home_win = ifelse(.data$homeAway=="home",.data$team1_win, .data$team2_win), - home_record = ifelse(.data$homeAway=="home",.data$team1_record, .data$team2_record), - away_team_name = ifelse(.data$homeAway=="away",.data$team1_team_name, .data$team2_team_name), - away_team_logo = ifelse(.data$homeAway=="away",.data$team1_team_logo, .data$team2_team_logo), - away_team_abb = ifelse(.data$homeAway=="away",.data$team1_team_abb, .data$team2_team_abb), - away_team_id = ifelse(.data$homeAway=="away",.data$team1_team_id, .data$team2_team_id), - away_team_location = ifelse(.data$homeAway=="away",.data$team1_team_location, .data$team2_team_location), - away_team_full_name = ifelse(.data$homeAway=="away",.data$team1_team_full, .data$team2_team_full), - away_team_color = ifelse(.data$homeAway=="away",.data$team1_team_color, .data$team2_team_color), - away_score = ifelse(.data$homeAway=="away",.data$team1_score, .data$team2_score), - away_win = ifelse(.data$homeAway=="away",.data$team1_win, .data$team2_win), - away_record = ifelse(.data$homeAway=="away",.data$team1_record, .data$team2_record) + home_team_name = ifelse(.data$homeAway == "home",.data$team1_team_name, .data$team2_team_name), + home_team_logo = ifelse(.data$homeAway == "home",.data$team1_team_logo, .data$team2_team_logo), + home_team_abb = ifelse(.data$homeAway == "home",.data$team1_team_abb, .data$team2_team_abb), + home_team_id = ifelse(.data$homeAway == "home",.data$team1_team_id, .data$team2_team_id), + home_team_location = ifelse(.data$homeAway == "home",.data$team1_team_location, .data$team2_team_location), + home_team_full_name = ifelse(.data$homeAway == "home",.data$team1_team_full, .data$team2_team_full), + home_team_color = ifelse(.data$homeAway == "home",.data$team1_team_color, .data$team2_team_color), + home_score = ifelse(.data$homeAway == "home",.data$team1_score, .data$team2_score), + home_win = ifelse(.data$homeAway == "home",.data$team1_win, .data$team2_win), + home_record = ifelse(.data$homeAway == "home",.data$team1_record, .data$team2_record), + away_team_name = ifelse(.data$homeAway == "away",.data$team1_team_name, .data$team2_team_name), + away_team_logo = ifelse(.data$homeAway == "away",.data$team1_team_logo, .data$team2_team_logo), + away_team_abb = ifelse(.data$homeAway == "away",.data$team1_team_abb, .data$team2_team_abb), + away_team_id = ifelse(.data$homeAway == "away",.data$team1_team_id, .data$team2_team_id), + away_team_location = ifelse(.data$homeAway == "away",.data$team1_team_location, .data$team2_team_location), + away_team_full_name = ifelse(.data$homeAway == "away",.data$team1_team_full, .data$team2_team_full), + away_team_color = ifelse(.data$homeAway == "away",.data$team1_team_color, .data$team2_team_color), + away_score = ifelse(.data$homeAway == "away",.data$team1_score, .data$team2_score), + away_win = ifelse(.data$homeAway == "away",.data$team1_win, .data$team2_win), + away_record = ifelse(.data$homeAway == "away",.data$team1_record, .data$team2_record) ) mbb_data <- mbb_data %>% @@ -1640,7 +1718,7 @@ espn_mbb_rankings <- function() { #' \donttest{ #' try(espn_mbb_standings(2021)) #' } -espn_mbb_standings <- function(year) { +espn_mbb_standings <- function(year = most_recent_mbb_season()) { standings_url <- "https://site.web.api.espn.com/apis/v2/sports/basketball/mens-college-basketball/standings?region=us&lang=en&contentorigin=espn&type=0&level=1&sort=winpercent%3Adesc%2Cwins%3Adesc%2Cgamesbehind%3Aasc&" @@ -1658,8 +1736,11 @@ espn_mbb_standings <- function(year) { resp <- res %>% httr::content(as = "text", encoding = "UTF-8") - raw_standings <- jsonlite::fromJSON(resp)[["standings"]] + raw_resp <- resp %>% + jsonlite::fromJSON() + raw_standings <- raw_resp %>% + purrr::pluck("standings") #Create a dataframe of all NBA teams by extracting from the raw_standings file teams <- raw_standings[["entries"]][["team"]] diff --git a/R/load_mbb.R b/R/load_mbb.R index 2ceb57ae..f65b44a5 100644 --- a/R/load_mbb.R +++ b/R/load_mbb.R @@ -92,7 +92,7 @@ load_mbb_pbp <- function(seasons = most_recent_mbb_season(), ..., seasons >= 2006, seasons <= most_recent_mbb_season()) - urls <- paste0("https://raw.githubusercontent.com/sportsdataverse/hoopR-data/main/mbb/pbp/rds/play_by_play_",seasons,".rds") + urls <- paste0("https://github.com/sportsdataverse/sportsdataverse-data/releases/download/espn_mens_college_basketball_pbp/play_by_play_",seasons,".rds") p <- NULL if (is_installed("progressr")) p <- progressr::progressor(along = seasons) @@ -186,7 +186,7 @@ load_mbb_team_box <- function(seasons = most_recent_mbb_season(), ..., seasons >= 2003, seasons <= most_recent_mbb_season()) - urls <- paste0("https://raw.githubusercontent.com/sportsdataverse/hoopR-data/main/mbb/team_box/rds/team_box_",seasons,".rds") + urls <- paste0("https://github.com/sportsdataverse/sportsdataverse-data/releases/download/espn_mens_college_basketball_team_boxscores/team_box_",seasons,".rds") p <- NULL if (is_installed("progressr")) p <- progressr::progressor(along = seasons) @@ -275,7 +275,7 @@ load_mbb_player_box <- function(seasons = most_recent_mbb_season(), ..., seasons >= 2003, seasons <= most_recent_mbb_season()) - urls <- paste0("https://raw.githubusercontent.com/sportsdataverse/hoopR-data/main/mbb/player_box/rds/player_box_",seasons,".rds") + urls <- paste0("https://github.com/sportsdataverse/sportsdataverse-data/releases/download/espn_mens_college_basketball_player_boxscores/player_box_",seasons,".rds") p <- NULL if (is_installed("progressr")) p <- progressr::progressor(along = seasons) @@ -402,7 +402,7 @@ load_mbb_schedule <- function(seasons = most_recent_mbb_season(), ..., seasons >= 2002, seasons <= most_recent_mbb_season()) - urls <- paste0("https://raw.githubusercontent.com/sportsdataverse/hoopR-data/main/mbb/schedules/rds/mbb_schedule_",seasons,".rds") + urls <- paste0("https://github.com/sportsdataverse/sportsdataverse-data/releases/download/espn_mens_college_basketball_schedules/mbb_schedule_",seasons,".rds") p <- NULL if (is_installed("progressr")) p <- progressr::progressor(along = seasons) diff --git a/R/load_nba.R b/R/load_nba.R index cf911b65..c3f5ff03 100644 --- a/R/load_nba.R +++ b/R/load_nba.R @@ -95,7 +95,7 @@ load_nba_pbp <- function(seasons = most_recent_nba_season(), ..., seasons >= 2002, seasons <= most_recent_nba_season()) - urls <- paste0("https://raw.githubusercontent.com/sportsdataverse/hoopR-data/main/nba/pbp/rds/play_by_play_",seasons,".rds") + urls <- paste0("https://github.com/sportsdataverse/sportsdataverse-data/releases/download/espn_nba_pbp/play_by_play_",seasons,".rds") p <- NULL if (is_installed("progressr")) p <- progressr::progressor(along = seasons) @@ -195,7 +195,7 @@ load_nba_team_box <- function(seasons = most_recent_nba_season(), ..., seasons >= 2002, seasons <= most_recent_nba_season()) - urls <- paste0("https://raw.githubusercontent.com/sportsdataverse/hoopR-data/main/nba/team_box/rds/team_box_",seasons,".rds") + urls <- paste0("https://github.com/sportsdataverse/sportsdataverse-data/releases/download/espn_nba_team_boxscores/team_box_",seasons,".rds") p <- NULL if (is_installed("progressr")) p <- progressr::progressor(along = seasons) @@ -281,7 +281,7 @@ load_nba_player_box <- function(seasons = most_recent_nba_season(), ..., seasons >= 2002, seasons <= most_recent_nba_season()) - urls <- paste0("https://raw.githubusercontent.com/sportsdataverse/hoopR-data/main/nba/player_box/rds/player_box_",seasons,".rds") + urls <- paste0("https://github.com/sportsdataverse/sportsdataverse-data/releases/download/espn_nba_player_boxscores/player_box_",seasons,".rds") p <- NULL if (is_installed("progressr")) p <- progressr::progressor(along = seasons) @@ -402,7 +402,7 @@ load_nba_schedule <- function(seasons = most_recent_nba_season(), ..., seasons >= 2002, seasons <= most_recent_nba_season()) - urls <- paste0("https://raw.githubusercontent.com/sportsdataverse/hoopR-data/main/nba/schedules/rds/nba_schedule_",seasons,".rds") + urls <- paste0("https://github.com/sportsdataverse/sportsdataverse-data/releases/download/espn_nba_schedules/nba_schedule_",seasons,".rds") p <- NULL if (is_installed("progressr")) p <- progressr::progressor(along = seasons) diff --git a/R/nba_stats_pbp.R b/R/nba_stats_pbp.R index 620df00b..e728d1ae 100644 --- a/R/nba_stats_pbp.R +++ b/R/nba_stats_pbp.R @@ -94,13 +94,11 @@ nba_pbp <- function( # glue::glue("Getting play by play for game {game_id}") %>% cat(fill = T) # } - data <- - resp$resultSets$rowSet[[1]] %>% - data.frame(stringsAsFactors = F) %>% - as_tibble() + data <- resp$resultSets$rowSet[[1]] %>% + data.frame() %>% + dplyr::as_tibble() - json_names <- - resp$resultSets$headers[[1]] + json_names <- resp$resultSets$headers[[1]] colnames(data) <- json_names # Fix version 2 Dataset @@ -108,7 +106,7 @@ nba_pbp <- function( data <- data %>% # fix column names janitor::clean_names() %>% - dplyr::rename( + dplyr::rename(dplyr::any_of(c( "wc_time_string" = "wctimestring", "time_quarter" = "pctimestring", "score_margin" = "scoremargin", @@ -118,7 +116,7 @@ nba_pbp <- function( "home_description" = "homedescription", "neutral_description" = "neutraldescription", "visitor_description" = "visitordescription" - ) %>% + ))) %>% ## Get Team Scores tidyr::separate( "score", @@ -165,7 +163,7 @@ nba_pbp <- function( } }, error = function(e) { - message(glue::glue("{Sys.time()}: Invalid arguments or no play-by-play data for {game_id} available!")) + message(glue::glue("{Sys.time()}: Invalid arguments or no play-by-play data for {pad_id(game_id)} available!")) }, warning = function(w) { }, diff --git a/R/nba_stats_team.R b/R/nba_stats_team.R index 8393bffb..d2bbd8c2 100644 --- a/R/nba_stats_team.R +++ b/R/nba_stats_team.R @@ -1,3 +1,94 @@ +#' **Get NBA Stats API Teams** +#' @name nba_teams +NULL +#' @title +#' **Get NBA Stats API Teams** +#' @rdname nba_teams +#' @author Saiem Gilani +#' @param ... Additional arguments passed to an underlying function like httr. +#' @return Return a data frame with the following columns: +#' +#' |col_name |types | +#' |:---------------|:---------| +#' |league_id |character | +#' |season_id |character | +#' |team_id |character | +#' |team_city |character | +#' |team_name |character | +#' |team_slug |character | +#' |conference |character | +#' |division |character | +#' |season |character | +#' |team_name_full |character | +#' |espn_team_id |integer | +#' |abbreviation |character | +#' |display_name |character | +#' |mascot |character | +#' |nickname |character | +#' |team |character | +#' |color |character | +#' |alternate_color |character | +#' |logo |character | +#' |logo_dark |character | +#' |logos_href_3 |character | +#' |logos_href_4 |character | +#' |nba_logo_svg |character | +#' +#' @importFrom jsonlite fromJSON toJSON +#' @importFrom dplyr filter select rename bind_cols bind_rows as_tibble +#' @import rvest +#' @export +#' @family NBA Team Functions +#' @details +#' ```r +#' nba_teams() +#' ``` +nba_teams <- function(...){ + + tryCatch( + expr = { + + standings <- nba_leaguestandingsv3(season = year_to_season(most_recent_nba_season() - 1)) %>% + purrr::pluck("Standings") + nba_teams <- standings %>% + dplyr::select(dplyr::any_of(c( + "LeagueID", + "SeasonID", + "TeamID", + "TeamCity", + "TeamName", + "TeamSlug", + "Conference", + "Division"))) %>% + dplyr::mutate( + Season = paste0('', year_to_season(most_recent_nba_season() - 1)), + TeamNameFull = paste(.data$TeamCity, .data$TeamName)) %>% + dplyr::arrange(.data$TeamNameFull) + + espn_nba_teams <- espn_nba_teams() %>% + dplyr::rename("espn_team_id" = "team_id") + nba_teams <- nba_teams %>% + dplyr::left_join(espn_nba_teams, by = c("TeamName" = "short_name")) + + nba_teams <- nba_teams %>% + dplyr::mutate( + espn_team_id = as.integer(.data$espn_team_id), + nba_logo_svg = paste0("https://cdn.nba.com/logos/nba/", .data$TeamID, "/primary/L/logo.svg")) %>% + janitor::clean_names() + + }, + error = function(e) { + message(glue::glue("{Sys.time()}: Invalid arguments or no team details data for {team_id} available!")) + }, + warning = function(w) { + }, + finally = { + } + ) + return(nba_teams) +} + + #' **Get NBA Stats API Team Details** #' @name nba_teamdetails NULL diff --git a/R/ncaa_mbb_data.R b/R/ncaa_mbb_data.R index fa2004c5..6955a60f 100644 --- a/R/ncaa_mbb_data.R +++ b/R/ncaa_mbb_data.R @@ -27,8 +27,156 @@ ncaa_mbb_NET_rankings <- function(){ "Quad_4" = "Quad 4" ) %>% janitor::clean_names() %>% - make_hoopR_data("NCAA MBB NET Rankings Information from ESPN.com",Sys.time()) + make_hoopR_data("NCAA MBB NET Rankings Information from ESPN.com", Sys.time()) return(x) } +#' @title **Scrape NCAA Men's Baskebtall Teams (Division I, II, and III)** +#' @description This function allows the user to obtain NCAA teams by year and division +#' @param year The season for which data should be returned, in the form of "YYYY". Years currently available: 2002 onward. +#' @param division Division - 1, 2, 3 +#' @param ... Additional arguments passed to an underlying function like httr. +#' @return A data frame with the following variables +#' +#' |col_name |types | +#' |:-------------|:---------| +#' |team_id |character | +#' |team_name |character | +#' |team_url |character | +#' |conference_id |character | +#' |conference |character | +#' |division |numeric | +#' |year |numeric | +#' |season_id |character | +#' +#' @import dplyr +#' @import rvest +#' @importFrom stringr str_split +#' @export +#' @details +#' ```r +#' ncaa_mbb_teams(year = 2023, division = 1) +#' ``` + +ncaa_mbb_teams <- function(year = most_recent_mbb_season(), division = 1, ...) { + + if (is.null(year)) { + cli::cli_abort("Enter valid year as a number (YYYY)") + } + if (is.null(division)) { + cli::cli_abort("Enter valid division as a number: 1, 2, 3") + } + if (year < 2002) { + stop('you must provide a year that is equal to or greater than 2002') + } + + df <- data.frame() + + headers <- httr::add_headers(.headers = .ncaa_headers()) + tryCatch( + expr = { + + + url <- paste0("http://stats.ncaa.org/team/inst_team_list?academic_year=", + year, + "&conf_id=-1", + "&division=", division, + "&sport_code=MBB") + + resp <- httr::RETRY("GET", url = {{url}}, ..., headers, httr::timeout(15)) + + data_read <- resp %>% + httr::content(as = "text", encoding = "UTF-8") %>% + xml2::read_html() + + team_urls <- data_read %>% + rvest::html_elements("table") %>% + rvest::html_elements("a") %>% + rvest::html_attr("href") + + team_names <- data_read %>% + rvest::html_elements("table") %>% + rvest::html_elements("a") %>% + rvest::html_text() + + conference_names <- ((data_read %>% + rvest::html_elements(".level2"))[[4]] %>% + rvest::html_elements("a") %>% + rvest::html_text())[-1] + + conference_ids <- (data_read %>% + rvest::html_elements(".level2"))[[4]] %>% + rvest::html_elements("a") %>% + rvest::html_attr("href") %>% + stringr::str_extract("javascript:changeConference\\(\\d+\\)") %>% + stringr::str_subset("javascript:changeConference\\(\\d+\\)") %>% + stringr::str_extract("\\d+") + + conference_df <- data.frame(conference = conference_names, conference_id = conference_ids) + + conferences_team_df <- lapply(conference_df$conference_id, function(x){ + conf_team_urls <- paste0("http://stats.ncaa.org/team/inst_team_list?academic_year=", + year, + "&conf_id=", x, + "&division=", division, + "&sport_code=MBB") + + resp <- httr::RETRY("GET", url = {{conf_team_urls}}, ..., headers, httr::timeout(15)) + + team_urls <- resp %>% + httr::content(as = "text", encoding = "UTF-8") %>% + xml2::read_html() %>% + rvest::html_elements("table") %>% + rvest::html_elements("a") %>% + rvest::html_attr("href") + + team_names <- resp %>% + httr::content(as = "text", encoding = "UTF-8") %>% + xml2::read_html() %>% + rvest::html_elements("table") %>% + rvest::html_elements("a") %>% + rvest::html_text() + + data <- data.frame(team_url = team_urls, + team_name = team_names, + division = division, + year = year, + conference_id = x) + data <- data %>% + dplyr::left_join(conference_df, by = c("conference_id")) + Sys.sleep(5) + return(data) + }) + + conferences_team_df <- rbindlist_with_attrs(conferences_team_df) + + conferences_team_df$team_id <- conferences_team_df$team_url %>% + stringr::str_extract("(\\d+)\\/(\\d+)", group = 1) + + conferences_team_df$season_id <- conferences_team_df$team_url %>% + stringr::str_extract("(\\d+)\\/(\\d+)", group = 2) + + df <- as.data.frame(conferences_team_df) + + df <- df %>% + dplyr::select( + "team_id", + "team_name", + "team_url", + "conference_id", + "conference", + "division", + "year", + "season_id") %>% + make_hoopR_data("NCAA Basketball Teams data from stats.ncaa.org", Sys.time()) + + }, + error = function(e) { + message(glue::glue("{Sys.time()}: Invalid arguments provided")) + }, + finally = { + } + ) + return(df) +} diff --git a/R/utils_nba_stats.R b/R/utils_nba_stats.R index 23213139..5538b5bf 100644 --- a/R/utils_nba_stats.R +++ b/R/utils_nba_stats.R @@ -104,6 +104,7 @@ nba_live_endpoint <- function(endpoint){ base_url = glue::glue('https://cdn.nba.com/static/json/liveData/{endpoint}') return(base_url) } + nba_endpoint <- function(endpoint){ all_endpoints = c( 'alltimeleadersgrids', @@ -324,3 +325,16 @@ rejoin_schedules <- function(df){ dplyr::left_join(home_df, by=c("GAME_ID", "SEASON_ID", "GAME_DATE")) return(sched_df) } + +.ncaa_headers <- function(url){ + headers <- c( + `Host` = 'stats.ncaa.org', + `User-Agent` = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36', + `Accept` = 'application/json, text/html, text/plain, */*', + `Accept-Language` = 'en-US,en;q=0.5', + `Accept-Encoding` = 'gzip, deflate, br', + `Pragma` = 'no-cache', + `Cache-Control` = 'no-cache' + ) + return(headers) +} diff --git a/README.md b/README.md index f3fd818d..66292962 100644 --- a/README.md +++ b/README.md @@ -66,9 +66,9 @@ progressr::with_progress({ tictoc::toc() ``` - ## 4.49 sec elapsed + ## 5.87 sec elapsed - ## 515664 rows of NBA play-by-play data from 1093 games. + ## 546926 rows of NBA play-by-play data from 1161 games. ### **Men’s college basketball full play-by-play seasons (2006-2022) \~ 2-3 minutes** @@ -80,9 +80,9 @@ progressr::with_progress({ tictoc::toc() ``` - ## 13.89 sec elapsed + ## 15.97 sec elapsed - ## 1951588 rows of men's college basketball play-by-play data from 6098 games. + ## 1956490 rows of men's college basketball play-by-play data from 6113 games. ## **Documentation** diff --git a/_pkgdown.yml b/_pkgdown.yml index 187e10bd..5d97bb98 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -5,6 +5,9 @@ template: bootstrap: 5 bootswatch: flatly ganalytics: G-FN028W4QW6 + includes: + in_header: | + bslib: primary: "#2C3D50" secondary: "#A7C6E6" @@ -218,7 +221,6 @@ reference: desc: Data included within the package contents: - '`teams_links`' - - '`nba_teams`' - subtitle: hoopR Helper Functions desc: Internal functions used by hoopR contents: diff --git a/cran-comments.md b/cran-comments.md index ee7624ae..e9737e63 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -22,9 +22,11 @@ This is a minor release that adds the following: - ```nba_synergyplaytypes()``` function added. - ```nba_franchiseleaderswrank()``` function added. - ```nba_videodetailsasset()``` function added. +- ```nba_teams()``` function added. - ```nba_infographicfanduelplayer()``` function added. - ```espn_mbb_game_rosters()``` function added. - ```espn_nba_game_rosters()``` function added. +- ```ncaa_mbb_teams()``` function added. ## R CMD check results diff --git a/data-raw/mbb_teams.R b/data-raw/mbb_teams.R new file mode 100644 index 00000000..83074ea0 --- /dev/null +++ b/data-raw/mbb_teams.R @@ -0,0 +1,12 @@ +library(hoopR) +library(dplyr) + + +x <- ncaa_mbb_teams(year = 2023, division = 1) + +x <- x %>% + dplyr::arrange(.data$team_name) +y <- espn_mbb_teams() + +x %>% + dplyr::left_join(y, by = c("team")) diff --git a/data/nba_teams.rda b/data/nba_teams.rda deleted file mode 100644 index 1317b338b5b79b8b34a0e00b2f28b8d89e228245..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2366 zcmV-E3BmS4T4*^jL0KkKSx?*^w*V1pf5HF%|NlS(|Nejf-r&Fg-|#>H5C8xH;0oU_ zuN@%s;NKmMeFg03p+G)>XaFu5DW;TpLrj`9dYWnK4XE;uQ`FD^13|StPe^1m001hU z)lc%2{M9yks(z#Z0000CfB*mh000>XA~Y2Ao{T4iWe-W}2dHVL)Y0l1Jw}ZH03N1*02%~JK$>U- z(;*nqF&L&4_Jl*yG&E>trbnsjJwP-(qmrPj3=s_4N(kGEfDP~k#}pF?3Yj3TSRk0< znW6{w(I}5B9Z^l{&K^p1d)NsNqA;aHox2}lz5=2G>I0aADF#{q#aEOC7vF*i9~{ew zmjGAUz5Uo#F+z^^8DoSI6D$G)#1jC z7e5C%tYY;C*);)H3s0V`)Ltr6k)Z{cSxEa_K{dc|vZ%-kTOvjfd~i1P09?=3Q4lklFTPdQAH`FVT z=mY`*0DwRs5C{YUo|1@(B#{7sKp+qZ1u9A+B$7k|0RVtNAP@)y4Yu2Dw%cvC+ikYn zZMNHOw%cvC+ilY%q97zdAP}M=_VR`G{K=^R9HOuaz*Yh60?EfDOQD~P6}5I?$*ikF zOu-dYOy{GJ6%*gfAXj2(XcdCEDZNNigT57_F49GlO6@w@K(6Sm(OSqA_KM&4ip4bB zqH9HplS0B)714i6dFG1ZL{74W0IT(ym`Js`b}VdLDHQk#7DcB+U%XHmCR?6}Ktzrg#w&vPnFxSP2=k99D zYU&QCoR`LYQym4ihkf@Jw;PKHLzMgR^6_fG%KpOhIS7<~vW`)cSpvV~Z9 z7w3^iV22P;Hw5Z=^o8V@;<+XZG9A93d;CuE#C3QxpYMWnmYK+GAsvTluk-2WsKV!n z#$!F6oTWy>9lDNf+%NSr8!s<6So@D9!IZS`5Z-$V-w|WpBkVN!Fs74;;4+#Y=4x^o z6G3U)t9K1Jw|L(HdqVWJ;wV;`N*xb)t)U8v-UF2O%L@oXpMM4)^NsPGF5^aS{|K9m z%f>^O+tHry-%*A_y^*$~Yx*mt5n1Ur^aw2(to zaD_EBwvvd4$2M>P0ko2cjZN*1$&@InoRUhrkAz=ZR-Us=FHO1-u|B~13POpVsU(x) zoQc2M`tAOX#j7>6#$6m?V^wMrC0Ox6?*`K*paz zrW^)XcuerjKLg_r)yv)BrlU#<*G{hv{&e0A^W>}*s4@DDr&$ra`=KErCQ$79y_SjT z)Plai&w6G8Cpuid)&w)y9YNT|iBCs8E}N){EC9Z8t6;BaU{hbnH@0bZiJLTQDGLsOi@ zO%O~-n58%}64o4p=np_p>LZ1PH71I~rXa3VqIH4E2%^2#CtyUZe4zu7Ig`!Kp1Su* zB!gmfrX;B-n3KBz@*OC7;1G!?=0oEEgh>ywRs1I!9ykOdN$^AA0E9^ojH{Y@4X}c5 z2aP*`)B>?69(3wYFFT8>NXCW9*qq&jB!n$aD#YBJVU#f@RM29DVVpgu$qSO?$eh>a zOsQ&V)y!*$Qg{c)kurIFvC5tpAQ*$OHm3r0{YheZ!oMyB0z`xxlD+>ZZE#tcgEKH@ zW(?1^0}*VB3A&-DN0wi~jP@zC**pR&_o~V|F=M&l# zb~GqZg+`FCm=*d>Q0z`HRjDzCWcyQ`=|}>%CRZ#U6(}_5pqRwK;i^d_#0vdVpzIf5 z=cNti2sYDYJ1M9b1Xn6mrj@2p%AI0r>*v;+!HGLkfysc1_<&ZR)|=of%$ZAJ-`oU* z1B5M4KD5bt09p#`F>Q&hISvS2azIuGkV+-BCHWGG!ku=dMWl<;P?C!XFrh#wBp!|G zP&UxaX(35TferUTRaC*~Dk~{Uct~PsP^c(ZDw3j*sjP)5P9mX@sDWE~X=zYUD=Hw+ zh9Vai78ZmurZTe`Szak5k^rxG1!2Sp7IXwmT$C?Lq6+p@(lSO6gpgoJLP$m4aU?8G zy=u0x3nEt3LeR?C!WI3Ah&fa1$*r}7a(MIrtk-&Xrou8qGFF~j(zN*muuZP9Aw;5J z8&fa})|$|Dr!Wfa8V4cG3^a9@!$N!QE`~JE!Wq*dXb2_goiZg8Dpj5dXNI)EOg58I kDGP}>MT2xGwwaQ2nIw>sO&{-(3IB_^BAh5lC+-hhfEZ~etpET3 diff --git a/man/espn_mbb_conferences.Rd b/man/espn_mbb_conferences.Rd index 4299b5aa..08239d53 100644 --- a/man/espn_mbb_conferences.Rd +++ b/man/espn_mbb_conferences.Rd @@ -9,12 +9,13 @@ espn_mbb_conferences() \value{ A conferences data frame\tabular{ll}{ col_name \tab types \cr - group_id \tab character \cr - short_name \tab character \cr - uid \tab character \cr - name \tab character \cr - logo \tab character \cr + group_id \tab integer \cr + conference_short_name \tab character \cr + conference_uid \tab character \cr + conference_name \tab character \cr + conference_logo \tab character \cr parent_group_id \tab character \cr + conference_id \tab integer \cr } } \description{ diff --git a/man/espn_mbb_standings.Rd b/man/espn_mbb_standings.Rd index d964b4ae..32a8f4ed 100644 --- a/man/espn_mbb_standings.Rd +++ b/man/espn_mbb_standings.Rd @@ -4,7 +4,7 @@ \alias{espn_mbb_standings} \title{\strong{Get ESPN men's college basketball standings}} \usage{ -espn_mbb_standings(year) +espn_mbb_standings(year = most_recent_mbb_season()) } \arguments{ \item{year}{Either numeric or character (YYYY)} diff --git a/man/espn_mbb_teams.Rd b/man/espn_mbb_teams.Rd index 589c4120..fe98d6b4 100644 --- a/man/espn_mbb_teams.Rd +++ b/man/espn_mbb_teams.Rd @@ -4,12 +4,15 @@ \alias{espn_mbb_teams} \title{\strong{Get ESPN men's college basketball team names and IDs}} \usage{ -espn_mbb_teams() +espn_mbb_teams(year = most_recent_mbb_season()) +} +\arguments{ +\item{year}{Either numeric or character (YYYY)} } \value{ A teams data frame\tabular{ll}{ col_name \tab types \cr - team_id \tab character \cr + team_id \tab integer \cr abbreviation \tab character \cr display_name \tab character \cr short_name \tab character \cr @@ -20,6 +23,15 @@ A teams data frame\tabular{ll}{ alternate_color \tab character \cr logo \tab character \cr logo_dark \tab character \cr + href \tab character \cr + conference_url \tab character \cr + group_id \tab integer \cr + conference_short_name \tab character \cr + conference_uid \tab character \cr + conference_name \tab character \cr + conference_logo \tab character \cr + parent_group_id \tab character \cr + conference_id \tab integer \cr } } \description{ @@ -27,7 +39,7 @@ A teams data frame\tabular{ll}{ } \examples{ \donttest{ - try(espn_mbb_teams()) + x<-try(espn_mbb_teams()) } } \seealso{ diff --git a/man/nba_leaguedashteamstats.Rd b/man/nba_leaguedashteamstats.Rd index d2d66b49..294074f2 100644 --- a/man/nba_leaguedashteamstats.Rd +++ b/man/nba_leaguedashteamstats.Rd @@ -216,6 +216,7 @@ Other NBA Team Functions: \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffdetails}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()}, \code{\link{nba_teamyearbyyearstats}()} } diff --git a/man/nba_teamdashboardbyclutch.Rd b/man/nba_teamdashboardbyclutch.Rd index 0840a5c4..e82037df 100644 --- a/man/nba_teamdashboardbyclutch.Rd +++ b/man/nba_teamdashboardbyclutch.Rd @@ -770,6 +770,7 @@ Other NBA Team Functions: \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffdetails}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()}, \code{\link{nba_teamyearbyyearstats}()} diff --git a/man/nba_teamdashboardbygamesplits.Rd b/man/nba_teamdashboardbygamesplits.Rd index 470e450f..5500f8fa 100644 --- a/man/nba_teamdashboardbygamesplits.Rd +++ b/man/nba_teamdashboardbygamesplits.Rd @@ -414,6 +414,7 @@ Other NBA Team Functions: \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffdetails}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()}, \code{\link{nba_teamyearbyyearstats}()} } diff --git a/man/nba_teamdashboardbygeneralsplits.Rd b/man/nba_teamdashboardbygeneralsplits.Rd index f182e2c5..2048221d 100644 --- a/man/nba_teamdashboardbygeneralsplits.Rd +++ b/man/nba_teamdashboardbygeneralsplits.Rd @@ -479,6 +479,7 @@ Other NBA Team Functions: \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffdetails}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()}, \code{\link{nba_teamyearbyyearstats}()} } diff --git a/man/nba_teamdashboardbylastngames.Rd b/man/nba_teamdashboardbylastngames.Rd index 08e406da..e58c0eae 100644 --- a/man/nba_teamdashboardbylastngames.Rd +++ b/man/nba_teamdashboardbylastngames.Rd @@ -473,6 +473,7 @@ Other NBA Team Functions: \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffdetails}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()}, \code{\link{nba_teamyearbyyearstats}()} } diff --git a/man/nba_teamdashboardbyopponent.Rd b/man/nba_teamdashboardbyopponent.Rd index a6017d6b..fe82cb0d 100644 --- a/man/nba_teamdashboardbyopponent.Rd +++ b/man/nba_teamdashboardbyopponent.Rd @@ -354,6 +354,7 @@ Other NBA Team Functions: \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffdetails}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()}, \code{\link{nba_teamyearbyyearstats}()} } diff --git a/man/nba_teamdashboardbyshootingsplits.Rd b/man/nba_teamdashboardbyshootingsplits.Rd index d26935f9..dd09ff26 100644 --- a/man/nba_teamdashboardbyshootingsplits.Rd +++ b/man/nba_teamdashboardbyshootingsplits.Rd @@ -365,6 +365,7 @@ Other NBA Team Functions: \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffdetails}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()}, \code{\link{nba_teamyearbyyearstats}()} diff --git a/man/nba_teamdashboardbyteamperformance.Rd b/man/nba_teamdashboardbyteamperformance.Rd index f42090bc..1c0db02b 100644 --- a/man/nba_teamdashboardbyteamperformance.Rd +++ b/man/nba_teamdashboardbyteamperformance.Rd @@ -360,6 +360,7 @@ Other NBA Team Functions: \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffdetails}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()}, \code{\link{nba_teamyearbyyearstats}()} } diff --git a/man/nba_teamdashboardbyyearoveryear.Rd b/man/nba_teamdashboardbyyearoveryear.Rd index 65831931..8092f3f9 100644 --- a/man/nba_teamdashboardbyyearoveryear.Rd +++ b/man/nba_teamdashboardbyyearoveryear.Rd @@ -235,6 +235,7 @@ Other NBA Team Functions: \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffdetails}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()}, \code{\link{nba_teamyearbyyearstats}()} } diff --git a/man/nba_teamdashlineups.Rd b/man/nba_teamdashlineups.Rd index 434a2a46..9560c2a5 100644 --- a/man/nba_teamdashlineups.Rd +++ b/man/nba_teamdashlineups.Rd @@ -245,6 +245,7 @@ Other NBA Team Functions: \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffdetails}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()}, \code{\link{nba_teamyearbyyearstats}()} diff --git a/man/nba_teamdashptpass.Rd b/man/nba_teamdashptpass.Rd index d2fd0982..787d9149 100644 --- a/man/nba_teamdashptpass.Rd +++ b/man/nba_teamdashptpass.Rd @@ -139,6 +139,7 @@ Other NBA Team Functions: \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffdetails}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()}, \code{\link{nba_teamyearbyyearstats}()} diff --git a/man/nba_teamdashptreb.Rd b/man/nba_teamdashptreb.Rd index f0c61201..bb13982a 100644 --- a/man/nba_teamdashptreb.Rd +++ b/man/nba_teamdashptreb.Rd @@ -209,6 +209,7 @@ Other NBA Team Functions: \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffdetails}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()}, \code{\link{nba_teamyearbyyearstats}()} diff --git a/man/nba_teamdashptshots.Rd b/man/nba_teamdashptshots.Rd index 5c6a023a..577306c7 100644 --- a/man/nba_teamdashptshots.Rd +++ b/man/nba_teamdashptshots.Rd @@ -239,6 +239,7 @@ Other NBA Team Functions: \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffdetails}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()}, \code{\link{nba_teamyearbyyearstats}()} diff --git a/man/nba_teamdetails.Rd b/man/nba_teamdetails.Rd index 3973a881..d51afe5f 100644 --- a/man/nba_teamdetails.Rd +++ b/man/nba_teamdetails.Rd @@ -124,6 +124,7 @@ Other NBA Team Functions: \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffdetails}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()}, \code{\link{nba_teamyearbyyearstats}()} } diff --git a/man/nba_teamestimatedmetrics.Rd b/man/nba_teamestimatedmetrics.Rd index aa9e6627..88dc0834 100644 --- a/man/nba_teamestimatedmetrics.Rd +++ b/man/nba_teamestimatedmetrics.Rd @@ -92,6 +92,7 @@ Other NBA Team Functions: \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffdetails}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()}, \code{\link{nba_teamyearbyyearstats}()} } diff --git a/man/nba_teamgamelog.Rd b/man/nba_teamgamelog.Rd index 42ffa8be..dd610705 100644 --- a/man/nba_teamgamelog.Rd +++ b/man/nba_teamgamelog.Rd @@ -98,6 +98,7 @@ Other NBA Team Functions: \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffdetails}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()}, \code{\link{nba_teamyearbyyearstats}()} } diff --git a/man/nba_teamgamelogs.Rd b/man/nba_teamgamelogs.Rd index 19355559..22156c9b 100644 --- a/man/nba_teamgamelogs.Rd +++ b/man/nba_teamgamelogs.Rd @@ -169,6 +169,7 @@ Other NBA Team Functions: \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffdetails}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()}, \code{\link{nba_teamyearbyyearstats}()} } diff --git a/man/nba_teamgamestreakfinder.Rd b/man/nba_teamgamestreakfinder.Rd index b27c7611..5d5e2c64 100644 --- a/man/nba_teamgamestreakfinder.Rd +++ b/man/nba_teamgamestreakfinder.Rd @@ -625,6 +625,7 @@ Other NBA Team Functions: \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffdetails}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()}, \code{\link{nba_teamyearbyyearstats}()} diff --git a/man/nba_teamhistoricalleaders.Rd b/man/nba_teamhistoricalleaders.Rd index ecbdd112..62953741 100644 --- a/man/nba_teamhistoricalleaders.Rd +++ b/man/nba_teamhistoricalleaders.Rd @@ -77,6 +77,7 @@ Other NBA Team Functions: \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffdetails}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()}, \code{\link{nba_teamyearbyyearstats}()} } diff --git a/man/nba_teaminfocommon.Rd b/man/nba_teaminfocommon.Rd index b3cdc1d0..5d777ec2 100644 --- a/man/nba_teaminfocommon.Rd +++ b/man/nba_teaminfocommon.Rd @@ -102,6 +102,7 @@ Other NBA Team Functions: \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffdetails}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()}, \code{\link{nba_teamyearbyyearstats}()} } diff --git a/man/nba_teamplayerdashboard.Rd b/man/nba_teamplayerdashboard.Rd index e99dd10a..37004317 100644 --- a/man/nba_teamplayerdashboard.Rd +++ b/man/nba_teamplayerdashboard.Rd @@ -245,6 +245,7 @@ Other NBA Team Functions: \code{\link{nba_teaminfocommon}()}, \code{\link{nba_teamplayeronoffdetails}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()}, \code{\link{nba_teamyearbyyearstats}()} } diff --git a/man/nba_teamplayeronoffdetails.Rd b/man/nba_teamplayeronoffdetails.Rd index 4cccabec..b8608a68 100644 --- a/man/nba_teamplayeronoffdetails.Rd +++ b/man/nba_teamplayeronoffdetails.Rd @@ -306,6 +306,7 @@ Other NBA Team Functions: \code{\link{nba_teaminfocommon}()}, \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()}, \code{\link{nba_teamyearbyyearstats}()} } diff --git a/man/nba_teamplayeronoffsummary.Rd b/man/nba_teamplayeronoffsummary.Rd index ad29dd38..b6de0dcb 100644 --- a/man/nba_teamplayeronoffsummary.Rd +++ b/man/nba_teamplayeronoffsummary.Rd @@ -214,6 +214,7 @@ Other NBA Team Functions: \code{\link{nba_teaminfocommon}()}, \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffdetails}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()}, \code{\link{nba_teamyearbyyearstats}()} } diff --git a/man/nba_teams.Rd b/man/nba_teams.Rd index 4d81a82b..d97bec4f 100644 --- a/man/nba_teams.Rd +++ b/man/nba_teams.Rd @@ -1,40 +1,80 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/data.R -\docType{data} +% Please edit documentation in R/nba_stats_team.R \name{nba_teams} \alias{nba_teams} -\title{\strong{NBA Stats API's Teams Dictionary}} -\format{ -A data frame with 30 rows and 10 variables:\ -\describe{ -\item{\code{LeagueID}}{character.} -\item{\code{SeasonID}}{character.} -\item{\code{TeamID}}{character.} -\item{\code{TeamCity}}{character.} -\item{\code{TeamName}}{character.} -\item{\code{TeamSlug}}{double.} -\item{\code{Conference}}{character.} -\item{\code{Division}}{character.} -\item{\code{Season}}{character.} -\item{\code{TeamNameFull}}{character.} -\item{\code{espn_team_id}}{integer.} -\item{\code{abbreviation}}{character.} -\item{\code{display_name}}{character.} -\item{\code{mascot}}{character.} -\item{\code{nickname}}{character.} -\item{\code{team}}{character.} -\item{\code{color}}{character.} -\item{\code{alternate_color}}{character.} -\item{\code{logo}}{character.} -\item{\code{logo_dark}}{character.} -\item{\code{logos_href_3}}{character.} -\item{\code{logos_href_4}}{character.} +\title{\strong{Get NBA Stats API Teams}} +\usage{ +nba_teams(...) } +\arguments{ +\item{...}{Additional arguments passed to an underlying function like httr.} +} +\value{ +Return a data frame with the following columns:\tabular{ll}{ + col_name \tab types \cr + league_id \tab character \cr + season_id \tab character \cr + team_id \tab character \cr + team_city \tab character \cr + team_name \tab character \cr + team_slug \tab character \cr + conference \tab character \cr + division \tab character \cr + season \tab character \cr + team_name_full \tab character \cr + espn_team_id \tab integer \cr + abbreviation \tab character \cr + display_name \tab character \cr + mascot \tab character \cr + nickname \tab character \cr + team \tab character \cr + color \tab character \cr + alternate_color \tab character \cr + logo \tab character \cr + logo_dark \tab character \cr + logos_href_3 \tab character \cr + logos_href_4 \tab character \cr + nba_logo_svg \tab character \cr } -\usage{ -nba_teams } \description{ -\strong{NBA Stats API's Teams Dictionary} +\strong{Get NBA Stats API Teams} + +\strong{Get NBA Stats API Teams} +} +\details{ +\if{html}{\out{
}}\preformatted{ nba_teams() +}\if{html}{\out{
}} +} +\seealso{ +Other NBA Team Functions: +\code{\link{nba_leaguedashteamstats}()}, +\code{\link{nba_teamdashboardbyclutch}()}, +\code{\link{nba_teamdashboardbygamesplits}()}, +\code{\link{nba_teamdashboardbygeneralsplits}()}, +\code{\link{nba_teamdashboardbylastngames}()}, +\code{\link{nba_teamdashboardbyopponent}()}, +\code{\link{nba_teamdashboardbyshootingsplits}()}, +\code{\link{nba_teamdashboardbyteamperformance}()}, +\code{\link{nba_teamdashboardbyyearoveryear}()}, +\code{\link{nba_teamdashlineups}()}, +\code{\link{nba_teamdashptpass}()}, +\code{\link{nba_teamdashptreb}()}, +\code{\link{nba_teamdashptshots}()}, +\code{\link{nba_teamdetails}()}, +\code{\link{nba_teamestimatedmetrics}()}, +\code{\link{nba_teamgamelogs}()}, +\code{\link{nba_teamgamelog}()}, +\code{\link{nba_teamgamestreakfinder}()}, +\code{\link{nba_teamhistoricalleaders}()}, +\code{\link{nba_teaminfocommon}()}, +\code{\link{nba_teamplayerdashboard}()}, +\code{\link{nba_teamplayeronoffdetails}()}, +\code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teamvsplayer}()}, +\code{\link{nba_teamyearbyyearstats}()} +} +\author{ +Saiem Gilani } -\keyword{datasets} +\concept{NBA Team Functions} diff --git a/man/nba_teamvsplayer.Rd b/man/nba_teamvsplayer.Rd index 3d4ebe30..02206a1b 100644 --- a/man/nba_teamvsplayer.Rd +++ b/man/nba_teamvsplayer.Rd @@ -407,6 +407,7 @@ Other NBA Team Functions: \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffdetails}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamyearbyyearstats}()} } \author{ diff --git a/man/nba_teamyearbyyearstats.Rd b/man/nba_teamyearbyyearstats.Rd index 577863b5..a6eccbfd 100644 --- a/man/nba_teamyearbyyearstats.Rd +++ b/man/nba_teamyearbyyearstats.Rd @@ -100,6 +100,7 @@ Other NBA Team Functions: \code{\link{nba_teamplayerdashboard}()}, \code{\link{nba_teamplayeronoffdetails}()}, \code{\link{nba_teamplayeronoffsummary}()}, +\code{\link{nba_teams}()}, \code{\link{nba_teamvsplayer}()} } \author{ diff --git a/man/ncaa_mbb_teams.Rd b/man/ncaa_mbb_teams.Rd new file mode 100644 index 00000000..e8771f2c --- /dev/null +++ b/man/ncaa_mbb_teams.Rd @@ -0,0 +1,35 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/ncaa_mbb_data.R +\name{ncaa_mbb_teams} +\alias{ncaa_mbb_teams} +\title{\strong{Scrape NCAA Men's Baskebtall Teams (Division I, II, and III)}} +\usage{ +ncaa_mbb_teams(year = most_recent_mbb_season(), division = 1, ...) +} +\arguments{ +\item{year}{The season for which data should be returned, in the form of "YYYY". Years currently available: 2002 onward.} + +\item{division}{Division - 1, 2, 3} + +\item{...}{Additional arguments passed to an underlying function like httr.} +} +\value{ +A data frame with the following variables\tabular{ll}{ + col_name \tab types \cr + team_id \tab character \cr + team_name \tab character \cr + team_url \tab character \cr + conference_id \tab character \cr + conference \tab character \cr + division \tab numeric \cr + year \tab numeric \cr + season_id \tab character \cr +} +} +\description{ +This function allows the user to obtain NCAA teams by year and division +} +\details{ +\if{html}{\out{
}}\preformatted{ ncaa_mbb_teams(year = 2023, division = 1) +}\if{html}{\out{
}} +} diff --git a/tests/testthat/test-espn_mbb_conferences.R b/tests/testthat/test-espn_mbb_conferences.R index df6e5a0c..bac4d9ea 100644 --- a/tests/testthat/test-espn_mbb_conferences.R +++ b/tests/testthat/test-espn_mbb_conferences.R @@ -3,8 +3,13 @@ test_that("ESPN - Get MBB conferences", { x <- espn_mbb_conferences() cols <- c( - "group_id", "short_name", "uid", - "name", "logo", "parent_group_id" + "group_id", + "conference_short_name", + "conference_uid", + "conference_name", + "conference_logo", + "parent_group_id", + "conference_id" ) expect_equal(colnames(x), cols) expect_s3_class(x, "data.frame") diff --git a/tests/testthat/test-espn_mbb_teams.R b/tests/testthat/test-espn_mbb_teams.R index 3965070c..2124a224 100644 --- a/tests/testthat/test-espn_mbb_teams.R +++ b/tests/testthat/test-espn_mbb_teams.R @@ -13,7 +13,16 @@ test_that("ESPN - Get MBB teams", { "color", "alternate_color", "logo", - "logo_dark") + "logo_dark", + "href", + "conference_url", + "group_id", + "conference_short_name", + "conference_uid", + "conference_name", + "conference_logo", + "parent_group_id", + "conference_id") expect_equal(colnames(x), cols) expect_s3_class(x, "data.frame") diff --git a/tests/testthat/test-nba_teams.R b/tests/testthat/test-nba_teams.R new file mode 100644 index 00000000..c4dd61c6 --- /dev/null +++ b/tests/testthat/test-nba_teams.R @@ -0,0 +1,39 @@ +test_that("NBA Teams", { + skip_on_cran() + skip_on_ci() + + x <- nba_teams() + + cols_x1 <- c( + "league_id", + "season_id", + "team_id", + "team_city", + "team_name", + "team_slug", + "conference", + "division", + "season", + "team_name_full", + "espn_team_id", + "abbreviation", + "display_name", + "mascot", + "nickname", + "team", + "color", + "alternate_color", + "logo", + "logo_dark", + "logos_href_3", + "logos_href_4", + "nba_logo_svg" + ) + + + expect_equal(sort(colnames(x)), sort(cols_x1)) + expect_s3_class(x, "data.frame") + + Sys.sleep(3) + +}) diff --git a/tests/testthat/test-ncaa_mbb_teams.R b/tests/testthat/test-ncaa_mbb_teams.R new file mode 100644 index 00000000..d0a1b616 --- /dev/null +++ b/tests/testthat/test-ncaa_mbb_teams.R @@ -0,0 +1,19 @@ +test_that("NCAA - Get MBB Teams", { + skip_on_cran() + skip_on_ci() + x <- ncaa_mbb_teams(year = most_recent_mbb_season(), division = 1) + + cols <- c( + "team_id", + "team_name", + "team_url", + "conference_id", + "conference", + "division", + "year", + "season_id" + ) + expect_equal(colnames(x), cols) + expect_s3_class(x, 'data.frame') + +})