The dfsOptimizer
package is intended to provide a straightforward way to generate optimal daily fantasy lineups for various sports, sites, and contests.
dfsOptimizer
was built and tested in R 4.0.2
NOTE WELL: This is currently very much in Beta – I’m almost certainly not yet exporting everything I need to, and new issues always crop up once someone who isn’t actually developing the thing gets their hands on it. So, if you decide to use it, I’d very much appreciate any bug reports and/or suggestions!
Sport | Draftkings | FanDuel | Yahoo | Draftkings Single Game | FanDuel Single Game |
---|---|---|---|---|---|
HOCKEY (NHL) | + | + | + | + | - |
FOOTBALL (NFL) | + | + | - | + | - |
BASEBALL (MLB) | + | - | - | + | - |
BASKETBALL (NBA) | + | + | + | + | - |
GOLF | + | + | + | - | - |
NASCAR | + | + | - | - | - |
WNBA | + | - | - | - | - |
SOCCER | + | - | - | - | - |
The package relies on the ROI
package, and comes with one solver as a dependency – ROI.plugin.glpk
. This is to ensure it works out of the box, so to speak. However, the solver
argument in build_lineups()
is compatible with the ompr.roi
package, so if you have ROI.plugin.symphony
installed, it should be as simple as `build_lineups(solver=‘symphony’)
Build Lineups from a Draftkings roster file (i.e., that you download from DK). This example uses the mean Points-per-game provided by draftkings as a projection, which I don’t recommend you actually do.
# Build an optimizer
mod <- create_optimizer(site = 'DRAFTKINGS',
sport = 'HOCKEY',
contest_type = 'CLASSIC',
filepath = '/Path/to/DKSalaries_nhl.csv')
# Build 20 lineups
lineups <- build_lineups(mod, num_lineups = 20)
# Get summary stats (player and team exposure breakdowns, and a cross-lineup similarity measure)
summary(lineups)
# See the lineups
lineups
# OR save them to a list
lineups_extracted <- as.list(lineups)
# OR export them into a format that you can upload to the selected site
export_lineups(lineups, file = '/path/to/lineup_export.csv')
# Build an optimizer
mod <- create_optimizer(site = 'DRAFTKINGS',
sport = 'HOCKEY',
contest_type = 'CLASSIC')
# Parse and add players
mod <- add_players_from_csv(mod, filepath = '/Path/to/DKSalaries_nhl.csv')
You can also add players from a data.frame – see ?add_players_from_df
or ?get_players_from_data_frame
for more detail and examples!
Once you have an existing optimizer model, you can update the FPTS using the function update_fpts
. This requires a data.frame that contains columns id
and fpts
– the easiest way to get players’ ids is using get_player_data
on an optimizer with players added.
# Build an optimizer
mod <- create_optimizer(site = 'DRAFTKINGS',
sport = 'HOCKEY',
contest_type = 'CLASSIC',
filepath = '/Path/to/DKSalaries_nhl.csv')
# Get the data
df <- get_player_data(mod)
# From here, you can replace the value of FPTS in df by either
# merging with another table by player name or ID
# As an example, we'll just toss in some random values
df$fpts <- runif(nrow(df), 0, 1)
# Update the model with the new FPTS
mod <- update_fpts(mod, fpts_data = df)