R/parse_draftkings_data.R

Defines functions parse_dk_game_lines parse_dk_prop parse_draftkings_data

parse_draftkings_data <- function(draftkings_data, sport, prop = FALSE, game_lines = FALSE, exclude_live = TRUE, exclude_alts = TRUE) {

  output_list <- list()

  for (e in names(draftkings_data)) {

    game_event <- draftkings_data[[e]]

    # nuke live games if specified, which is the default
    if (exclude_live) {
      status <- game_event$event$eventStatus$state
      if (status == "STARTED") next
    }

    # get matchup name and start time
    matchup <- game_event$event$name
    tipoff <- game_event$event$startDate

    # TODO: HANDLE THIS IN THE NEXT LAYER, NOT BETFINDER IF POSSIBLE
    # #### JUMP PAST FUTURE GAMES FOR NOW
    # if (as.Date(tipoff) > as.Date(Sys.Date()) + 1) next

    # break out the offer markets, always necessary
    offer_categories <- game_event$eventCategories
    offer_category_names <- unlist(lapply(offer_categories, '[[', 'name'))

    if (game_lines == TRUE) {
      if (sport %in% c('nba', 'ncaaf', 'nfl', 'mlb')) {
        output_list[[length(output_list) + 1]] <- parse_dk_game_lines(offer_categories, exclude_alts = exclude_alts, matchup = matchup, tipoff = tipoff)
      }
    }
    if (is.null(prop)) {
      next
    }

    # nba ---------------------------------------------------------------------
    if (prop %in% c('first team to score', 'ftts')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Quick Hits', market_subgroup = "Team to Score First FG", offer_label = "Team to Score the First Field Goal", matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('fpts by team')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Quick Hits', market_subgroup = 'First FG - Team', offer_regex = '[a-z] First Field Goal Scorer', matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('game go to overtime', 'game go to ot')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Game Props', market_subgroup = 'To go to OT', market_name = 'Overtime', market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('first player to score', 'fpts')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Quick Hits', market_subgroup = 'First Field Goal', offer_label = 'First Field Goal', matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('ftts shot points')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Quick Hits', market_subgroup = "Exact First FG - Team", offer_label = "First Field Goal Type Exact", matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('first shot points')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Quick Hits', market_subgroup = "First FG - Type", offer_label = "First Field Goal Type", matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('fpts shot points')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Quick Hits', market_subgroup = "First FG - Exact", offer_label = "First Field Goal Scorer Exact", matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('fpts shot points by team')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Quick Hits', market_subgroup = "First FG - Exact", offer_regex = "[a-z] First Field Goal Scorer", matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player points ou', 'player pts ou')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Player Props', market_subgroup = 'Points', prop_regex = ' Points$', market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player assists ou', 'player asts ou')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Player Props', market_subgroup = 'Assists', prop_regex = ' Assists$', market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player rebounds ou', 'player rebs ou')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Player Props', market_subgroup = 'Rebounds', prop_regex = ' Rebounds$', market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player pts-rebs-asts ou')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Player Props', market_subgroup = 'Pts, Reb & Ast', prop_regex = ' Points \\+ Assists \\+ Rebounds$', market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player pts-rebs ou')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Player Props', market_subgroup = 'Pts + Reb', prop_regex = ' Points \\+ Rebounds$', market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player pts-asts ou')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Player Props', market_subgroup = 'Pts + Ast', prop_regex = ' Points \\+ Assists$', market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player rebs-asts ou')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Player Props', market_subgroup = 'Ast + Reb', prop_regex = ' Assists \\+ Rebounds$', market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player three-pointers ou', 'player 3pts ou')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Player Props', market_subgroup = 'Threes', prop_regex = ' Three Pointers Made$', market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player blocks ou')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Player Props', market_subgroup = 'Blocks', prop_regex = ' Blocks$', market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player steals ou')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Player Props', market_subgroup = 'Steals', prop_regex = ' Steals$', market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player turnovers ou', 'player to ou')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Player Props', market_subgroup = 'Turnovers', prop_regex = ' Turnovers$', market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player steals plus blocks ou')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Player Props', market_subgroup = 'Steals + Blocks', prop_regex = ' Steals \\+ Blocks$', market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player most points')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Player Props', market_subgroup = 'Top Point Scorer', market_name = 'Leading Scorer of the Game', market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player double double')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Player Props', market_subgroup = 'Double-Double', prop_regex = ' Double-Double$', market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player triple double')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Player Props', market_subgroup = 'Triple-Double', prop_regex = ' Triple-Double$', market = market, matchup = matchup, tipoff = tipoff)
    }

    # mlb ---------------------------------------------------------------------

    if (prop %in% c('player strikeouts ou', 'strikeouts')) {

      output_list[[length(output_list) + 1]] <-
        parse_dk_prop(offer_categories, market_group = 'Pitcher Props', market_subgroup = 'Strikeouts', market_regex = 'Strikeouts',
                      market_name = prop, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player hits ou')) {
      output_list[[length(output_list) + 1]] <-
        parse_dk_prop(offer_categories, market_group = 'Batter Props', market_subgroup = 'Hits', prop_regex = 'Hits',
                      market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player rbis ou', 'rbis')) {
      output_list[[length(output_list) + 1]] <-
        parse_dk_prop(offer_categories, market_group = 'Batter Props', market_subgroup = 'RBIs', prop_regex = 'RBIs',
                      market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player runs ou')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Batter Props', market_subgroup = 'Runs Scored', prop_regex = 'Runs', market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player hrs ou', 'player home runs ou')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'Batter Props', market_subgroup = 'Home Runs', matchup = matchup, tipoff = tipoff)
    }

    # nfl ---------------------------------------------------------------------

    if (prop %in% c('player rush atts ou')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'RB/WR Props', market_subgroup = 'Rush Attempts', prop_regex = 'Rushing Attempts', market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player rush yds ou')) {
      output_list[[length(output_list) + 1]] <-
        parse_dk_prop(offer_categories, market_group = 'RB/WR Props', market_subgroup = 'Rush Yds', prop_regex = 'Rushing Yards',
                      market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player recs ou')) {
      output_list[[length(output_list) + 1]] <-
        parse_dk_prop(offer_categories, market_group = 'RB/WR Props', market_subgroup = 'Receptions', prop_regex = 'Receptions',
                      market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player rec yds ou')) {
      output_list[[length(output_list) + 1]] <-
        parse_dk_prop(offer_categories, market_group = 'RB/WR Props', market_subgroup = 'Rec Yds', prop_regex = 'Receiving Yards',
                      market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player rush+rec yds ou')) {
      output_list[[length(output_list) + 1]] <-
        parse_dk_prop(offer_categories, market_group = 'RB/WR Props', market_subgroup = 'Rush + Rec Yds', prop_regex = 'Rushing \\+ Receiving Yards',
                      market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player pass atts ou')) {
      output_list[[length(output_list) + 1]] <-
        parse_dk_prop(offer_categories, market_group = 'QB Props', market_subgroup = 'Pass Attempts', prop_regex = 'Passing Attempts',
                      market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player pass yds ou')) {
      output_list[[length(output_list) + 1]] <-
        parse_dk_prop(offer_categories, market_group = 'QB Props', market_subgroup = 'Pass Yds', prop_regex = 'Passing Yards',
                      market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player pass tds ou')) {
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'QB Props', market_subgroup = 'Pass TDs', prop_regex = 'Passing Touchdowns', market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('player anytime td', 'player first td')) {
      # first/last/any tds are all in one big data.frame, which gets re-labeled correctly in tidyup_draftkings_data()
      output_list[[length(output_list) + 1]] <- parse_dk_prop(offer_categories, market_group = 'TD Scorers', market_subgroup = 'TD Scorer', prop_regex = 'Touchdown Scorer', market = market, matchup = matchup, tipoff = tipoff)
    }

    # nhl ---------------------------------------------------------------------

    if (prop %in% c('goalscorer', 'goals', 'player first goal', 'player any goal', 'player last goal')) {
      output_list[[length(output_list) + 1]] <-
        parse_dk_prop(offer_categories, market_group = 'Player Props', market_subgroup = 'Goalscorer', prop_regex = 'Goalscorer',
                      market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('shots')) {
      output_list[[length(output_list) + 1]] <-
        parse_dk_prop(offer_categories, market_group = 'Player Props', market_subgroup = 'Shots', prop_regex = 'Shots',
                      market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('assists')) {
      output_list[[length(output_list) + 1]] <-
        parse_dk_prop(offer_categories, market_group = 'Player Props', market_subgroup = 'Assists', prop_regex = 'Assists',
                      market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('points')) {
      output_list[[length(output_list) + 1]] <-
        parse_dk_prop(offer_categories, market_group = 'Player Props', market_subgroup = 'Points', prop_regex = 'Points',
                      market = market, matchup = matchup, tipoff = tipoff)
    }
    if (prop %in% c('goalie saves')) {
      output_list[[length(output_list) + 1]] <-
        parse_dk_prop(offer_categories, market_group = 'Player Props', market_subgroup = 'Goalie Saves', prop_regex = 'Saves',
                      market = market, matchup = matchup, tipoff = tipoff)
    }
  }

    # if output_list is empty, error
    if (!'output_list' %in% ls()) stop('no draftkings ', prop, ' returned')
    if (length(output_list) == 0 & game_lines == FALSE) stop('no draftkings ', prop, ' returned')
    if (length(output_list) == 0 & game_lines == TRUE) stop('no draftkings game lines returned')

    output_df <- dplyr::bind_rows(output_list)
    output_df$prop <- prop

    return(output_df)
}

parse_dk_prop <- function(offer_categories, market_group, market_subgroup, offer_label = NULL, offer_regex = NULL, offer_not_regex = NULL, matchup, tipoff) {
  outcome_list <- list()
  for (oc in offer_categories) {
    if (oc[['name']] != market_group) next
    market_group_componentizedOffers <- oc[['componentizedOffers']]
    for (sc in market_group_componentizedOffers) {
      if (sc[['subcategoryName']] != market_subgroup) next
      offers <- sc[['offers']]
      for (o in offers) {

        # filter out incorrect markets here

        for (oo in o) {

          if (!'label' %in% names(oo)) next
          if (!is.null(offer_label) && oo['label'] != offer_label) next
          if (is.null(offer_label) && !grepl(offer_regex, oo['label'])) next
          if (!is.null(offer_not_regex) && grepl(offer_not_regex, oo['label'])) next


          all_outcomes <- dplyr::bind_rows(oo[['outcomes']])
          all_outcomes$market_name <- oo['label']
          outcome_list[[length(outcome_list) + 1]] <- all_outcomes
        }
      }
    }
  }

  if (length(outcome_list) == 0) return()

  # make a data.frame
  market_df <- as.data.frame(dplyr::bind_rows(outcome_list))
  market_df$tags <- NULL
  market_df <- unique(market_df)
  market_df$matchup <- matchup
  market_df$tipoff <- tipoff
  return(market_df)
}

parse_dk_game_lines <- function(offer_categories, exclude_alts, matchup, tipoff) {
  offer_category_names <- unlist(lapply(offer_categories, '[[', 'name'))
  if (!'Game Lines' %in% offer_category_names) return()
  game_lines_content <- offer_categories[[which(offer_category_names == 'Game Lines')]]$componentizedOffers

  if (exclude_alts) {
    gl_subgroups <- c('Game')
  } else {
    gl_subgroups <- c('Game', 'Alternate Spread', 'Alternate Total')
  }
  gl_group_names <- unlist(lapply(game_lines_content, '[[', 'subcategoryName'))
  if (!any(gl_subgroups %in% gl_group_names)) return()
  gl_subgroups_content <- game_lines_content[which(gl_group_names %in% gl_subgroups)]
  gl_offers <- lapply(gl_subgroups_content, function(x) x[['offers']][[1]])
  output_list <- list()
  # go through each of the offer groups
  for (o in gl_offers) {
    outcomes <- lapply(o, '[[', 'outcomes')
    outcomes_df <- dplyr::bind_rows(outcomes)
    output_list[[length(output_list) + 1]] <- outcomes_df
  }

  out_df <- dplyr::bind_rows(output_list)
  if (nrow(out_df) < 1) return()

  out_df$bet_type <- ifelse(out_df$label %in% c("Over", "Under"), "Total",
                            ifelse(is.na(out_df$line), "Moneyline", "Spread"))

  out_df$matchup <- matchup
  out_df$tipoff <- tipoff
  return(out_df)
}
jimtheflash/betfinder documentation built on Dec. 6, 2023, 5:58 a.m.