The first week of May is my favorite on the calendar. I love trying to solve puzzles. No puzzle delights me more than coming up with a winning strategy to make the absolute most of my dynasty rookie drafts. Despite a decade writing a monthly dynasty trade value column, I am rarely the most active trader in my own dynasty leagues. It varies from one league to another, but I average a few trades a year per league overall from June through April. May is a different story. I am a huge believer in moving around in rookie drafts to land as many of my favorite targets as possible. I get my guys as rookies and ride with them long-term.
With so much new information to sift through, May’s Dynasty Trade Value Chart article is a two-parter. Today’s part one will focus exclusively on how to value the incoming rookies. Part two, coming later this week, will focus on the impact of the draft on veteran player values.
Base rookie pick values
Best practices to calculate rookie values
Draft stategy and tier breaks
The importance of adjusting values to account for the specifics of your league
Where to draft Brock Bowers in a wide variety of different formats.
ROADBLOCK
my_values <- gsheet2tbl("https://docs.google.com/spreadsheets/d/1opcVw2hPPdvWZK3lYBeBlO5PcnDjsEWJMC4O2Tan0Uc")
sleeper_join <- gsheet2tbl("https://docs.google.com/spreadsheets/d/1nhoX6VAmd7f3gPHRcLcfmSwE1NIQmKNyqIas7o3BqH0/edit?usp=sharing") %>%
select(dan_id, sleeper_id)
my_values <-
my_values %>%
left_join(sleeper_join) %>%
mutate(sleeper_id = as.character(sleeper_id))
## Joining with `by = join_by(dan_id)`
download_link <-
"https://drive.google.com/uc?export=download&id=1uFG3EvvWRex7id8JPOvNTT9Z58HTvk6v"
positional_model <-
create_download_url(download_link) %>%
url() %>%
readRDS()
players <-
load_players()
players <-
load_ff_playerids() %>%
select(gsis_id, sleeper_id, mfl_id) %>%
right_join(players)
## Joining with `by = join_by(gsis_id)`
teams <-
load_teams()
players <-
teams %>%
select(team_abbr, team_logo_espn) %>%
right_join(players)
## Joining with `by = join_by(team_abbr)`
player_values <-
players %>%
filter(position %in% c("QB", "RB","WR","TE") & entry_year >= 2009) %>%
select(sleeper_id, gsis_id, mfl_id, team_logo_espn, headshot, birth_date, rookie_year, draft_number) %>%
mutate(sleeper_id = as.character(sleeper_id)) %>%
filter(!is.na(sleeper_id)) %>%
right_join(my_values)
## Joining with `by = join_by(sleeper_id)`
picks24 <-
load_draft_picks(seasons = 2024) %>%
filter(position %in% (c("QB","RB","WR","TE")))%>%
select(team, round, pick, Player = pfr_player_name, age, college) %>%
mutate(Player = ifelse(Player == "Marvin Harrison", "Marvin Harrison Jr.", Player),
Player = ifelse(Player == "Tyrone Tracy", "Tyrone Tracy Jr.", Player))
my_rookies <-
my_values %>%
filter(Rookie == "Yes") %>%
select(dan_id, Player, sleeper_id, Position, Value, SF_Value) %>%
left_join(picks24) %>%
filter(!is.na(pick)) %>%
mutate(team = clean_team_abbrs(team))
## Joining with `by = join_by(Player)`
my_rookies <-
load_teams() %>%
select(team = team_abbr, team_logo_espn) %>%
mutate(team = clean_team_abbrs(team)) %>%
right_join(my_rookies)
## Joining with `by = join_by(team)`
my_rookies_sf <-
my_rookies %>%
arrange(-SF_Value) %>%
mutate(rank = row_number())
my_rookies_ppr <-
my_rookies %>%
arrange(-Value) %>%
mutate(rank = row_number())
my_rookies_sf %>%
select(rank, Player, Position, team_logo_espn, college, pick, SF_Value) %>%
gt() %>%
gt_img_rows(columns = team_logo_espn) %>%
gt_theme_nytimes()%>%
tab_header(
title = "Rookie Values",
subtitle = "Superflex Value Rankings (PPR)"
) %>%
cols_label(SF_Value = "Value", team_logo_espn = "Team") %>%
data_color(
columns = SF_Value,
colors = scales::col_numeric(
palette = c( "yellow", "green","blue"),
domain = c(0, 50)
)
)
## Warning: Since gt v0.9.0, the `colors` argument has been deprecated.
## • Please use the `fn` argument instead.
## This warning is displayed once every 8 hours.
| Rookie Values | ||||||
| Superflex Value Rankings (PPR) | ||||||
| rank | Player | Position | Team | college | pick | Value |
|---|---|---|---|---|---|---|
| 1 | Caleb Williams | QB | USC | 1 | 46.0 | |
| 2 | Marvin Harrison Jr. | WR | Ohio St. | 4 | 39.0 | |
| 3 | Malik Nabers | WR | LSU | 6 | 32.0 | |
| 4 | Jayden Daniels | QB | LSU | 2 | 32.0 | |
| 5 | Rome Odunze | WR | Washington | 9 | 28.0 | |
| 6 | Drake Maye | QB | North Carolina | 3 | 22.4 | |
| 7 | Brock Bowers | TE | Georgia | 13 | 20.5 | |
| 8 | J.J. McCarthy | QB | Michigan | 10 | 20.0 | |
| 9 | Xavier Worthy | WR | Texas | 28 | 17.3 | |
| 10 | Jonathon Brooks | RB | Texas | 46 | 16.1 | |
| 11 | Ladd McConkey | WR | Georgia | 34 | 15.9 | |
| 12 | Brian Thomas | WR | LSU | 23 | 15.3 | |
| 13 | Keon Coleman | WR | Florida St. | 33 | 13.8 | |
| 14 | Bo Nix | QB | Oregon | 12 | 13.8 | |
| 15 | Michael Penix | QB | Washington | 8 | 13.4 | |
| 16 | Trey Benson | RB | Florida St. | 66 | 12.8 | |
| 17 | Ricky Pearsall | WR | Florida | 31 | 12.7 | |
| 18 | Xavier Legette | WR | South Carolina | 32 | 10.6 | |
| 19 | Adonai Mitchell | WR | Texas | 52 | 10.1 | |
| 20 | Ja'Lynn Polk | WR | Washington | 37 | 9.4 | |
| 21 | Blake Corum | RB | Michigan | 83 | 7.8 | |
| 22 | Jermaine Burton | WR | Alabama | 80 | 7.5 | |
| 23 | Malachi Corley | WR | Western Kentucky | 65 | 7.4 | |
| 24 | Roman Wilson | WR | Michigan | 84 | 6.4 | |
| 25 | Troy Franklin | WR | Oregon | 102 | 6.3 | |
| 26 | Jaylen Wright | RB | Tennessee | 120 | 6.0 | |
| 27 | MarShawn Lloyd | RB | USC | 88 | 5.9 | |
| 28 | Ben Sinnott | TE | Kansas St. | 53 | 5.7 | |
| 29 | Jalen McMillan | WR | Washington | 92 | 5.1 | |
| 30 | Luke McCaffrey | WR | Rice | 100 | 4.6 | |
| 31 | Devontez Walker | WR | North Carolina | 113 | 4.4 | |
| 32 | Javon Baker | WR | Central Florida | 110 | 4.3 | |
| 33 | Ray Davis | RB | Kentucky | 128 | 4.2 | |
| 34 | Braelon Allen | RB | Wisconsin | 134 | 4.1 | |
| 35 | Bucky Irving | RB | Oregon | 125 | 4.1 | |
| 36 | Isaac Guerendo | RB | Louisville | 129 | 4.0 | |
| 37 | Will Shipley | RB | Clemson | 127 | 3.9 | |
| 38 | Audric Estime | RB | Notre Dame | 147 | 3.8 | |
| 39 | Kimani Vidal | RB | Troy | 181 | 3.7 | |
| 40 | Ja'Tavion Sanders | TE | Texas | 101 | 2.9 | |
| 41 | Malik Washington | WR | Virginia | 184 | 2.8 | |
| 42 | Spencer Rattler | QB | South Carolina | 150 | 2.6 | |
| 43 | Erick All | TE | Iowa | 115 | 2.2 | |
| 44 | Theo Johnson | TE | Penn St. | 107 | 2.2 | |
| 45 | Jacob Cowing | WR | Arizona | 135 | 2.1 | |
| 46 | Tyrone Tracy Jr. | RB | Purdue | 166 | 2.0 | |
| 47 | Dylan Laube | RB | New Hampshire | 208 | 1.9 | |
| 48 | Ainias Smith | WR | Texas A&M | 152 | 1.9 | |
| 49 | Cade Stover | TE | Ohio St. | 123 | 1.8 | |
| 50 | Anthony Gould | WR | Oregon St. | 142 | 1.7 | |
| 51 | Johnny Wilson | WR | Florida St. | 185 | 1.7 | |
| 52 | Rasheen Ali | RB | Marshall | 165 | 1.6 | |
| 53 | Jawhar Jordan | RB | Louisville | 205 | 1.5 | |
| 54 | Tip Reiman | TE | Illinois | 82 | 1.4 | |
| 55 | Jamari Thrash | WR | Louisville | 156 | 1.4 | |
| 56 | Jaheim Bell | TE | Florida St. | 231 | 1.4 | |
| 57 | Isaiah Davis | RB | South Dakota St. | 173 | 1.3 | |
| 58 | Brenden Rice | WR | USC | 225 | 1.2 | |
| 59 | Ryan Flournoy | WR | SE Missouri St. | 216 | 1.1 | |
| 60 | Jared Wiley | TE | TCU | 131 | 1.1 | |
| 61 | Bub Means | WR | Pittsburgh | 170 | 0.9 | |
| 62 | Jordan Travis | QB | Florida St. | 171 | 0.9 | |
| 63 | Jha'Quan Jackson | WR | Tulane | 182 | 0.9 | |
| 64 | Keilan Robinson | RB | Texas | 167 | 0.8 | |
| 65 | Jordan Whittington | WR | Texas | 213 | 0.8 | |
| 66 | Joe Milton | QB | Tennessee | 193 | 0.8 | |
| 67 | Tejhaun Palmer | WR | Ala-Birmingham | 191 | 0.7 | |
| 68 | Casey Washington | WR | Illinois | 187 | 0.7 | |
| 69 | Devin Leary | QB | Kentucky | 218 | 0.7 | |
| 70 | Jase McClellan | RB | Alabama | 186 | 0.5 | |
| 71 | AJ Barner | TE | Michigan | 121 | 0.5 | |
| 72 | Tanner McLachlan | TE | Arizona | 194 | 0.4 | |
| 73 | Michael Pratt | QB | Tulane | 245 | 0.4 | |
The values you see above are based on a number of factors:
stats <-
load_player_stats()
stats %>%
filter(season_type =="REG" & position %in% c("QB","RB","WR","TE")) %>%
group_by(recent_team, position) %>%
summarise(fp = sum(fantasy_points_ppr)) %>%
ungroup() %>%
filter(position =="RB") %>%
arrange(-fp) %>%
mutate(pos_rank = row_number()) %>%
gt()
## `summarise()` has grouped output by 'recent_team'. You can override using the
## `.groups` argument.
| recent_team | position | fp | pos_rank |
|---|---|---|---|
| MIA | RB | 554.80 | 1 |
| DET | RB | 486.30 | 2 |
| SF | RB | 485.60 | 3 |
| ATL | RB | 420.80 | 4 |
| DEN | RB | 406.50 | 5 |
| TEN | RB | 401.56 | 6 |
| BAL | RB | 400.70 | 7 |
| CLE | RB | 397.60 | 8 |
| PIT | RB | 395.00 | 9 |
| KC | RB | 382.36 | 10 |
| LA | RB | 375.60 | 11 |
| NYJ | RB | 374.60 | 12 |
| IND | RB | 373.10 | 13 |
| BUF | RB | 371.00 | 14 |
| WAS | RB | 370.10 | 15 |
| NO | RB | 362.20 | 16 |
| JAX | RB | 342.00 | 17 |
| DAL | RB | 341.80 | 18 |
| NE | RB | 341.50 | 19 |
| CIN | RB | 337.50 | 20 |
| ARI | RB | 336.60 | 21 |
| CHI | RB | 334.20 | 22 |
| PHI | RB | 319.28 | 23 |
| TB | RB | 319.20 | 24 |
| SEA | RB | 317.70 | 25 |
| LV | RB | 307.10 | 26 |
| NYG | RB | 299.20 | 27 |
| GB | RB | 298.30 | 28 |
| CAR | RB | 287.20 | 29 |
| MIN | RB | 273.30 | 30 |
| HOU | RB | 270.64 | 31 |
| LAC | RB | 270.00 | 32 |
my_values %>%
filter(Rookie == "Yes") %>%
arrange(-SF_Value) %>%
mutate(pick = row_number()) %>%
select(pick, Player, team, Position, SF_Value) %>%
gt() %>%
gt_theme_nytimes()%>%
tab_header(
title = "Rookie Values",
subtitle = "Superflex Value Rankings (PPR)"
) %>%
cols_label(SF_Value = "Value") %>%
data_color(
columns = SF_Value,
colors = scales::col_numeric(
palette = c( "yellow", "green","blue"),
domain = c(0, 50)
)
)
| Rookie Values | ||||
| Superflex Value Rankings (PPR) | ||||
| pick | Player | team | Position | Value |
|---|---|---|---|---|
| 1 | Caleb Williams | CHI | QB | 46.0 |
| 2 | Marvin Harrison Jr. | ARI | WR | 39.0 |
| 3 | Malik Nabers | NYG | WR | 32.0 |
| 4 | Jayden Daniels | WAS | QB | 32.0 |
| 5 | Rome Odunze | CHI | WR | 28.0 |
| 6 | Drake Maye | NE | QB | 22.4 |
| 7 | Brock Bowers | LV | TE | 20.5 |
| 8 | J.J. McCarthy | MIN | QB | 20.0 |
| 9 | Xavier Worthy | KC | WR | 17.3 |
| 10 | Jonathon Brooks | CAR | RB | 16.1 |
| 11 | Ladd McConkey | LAC | WR | 15.9 |
| 12 | Brian Thomas | JAX | WR | 15.3 |
| 13 | Keon Coleman | BUF | WR | 13.8 |
| 14 | Bo Nix | DEN | QB | 13.8 |
| 15 | Michael Penix | ATL | QB | 13.4 |
| 16 | Trey Benson | ARI | RB | 12.8 |
| 17 | Ricky Pearsall | SF | WR | 12.7 |
| 18 | Xavier Legette | CAR | WR | 10.6 |
| 19 | Adonai Mitchell | IND | WR | 10.1 |
| 20 | Ja'Lynn Polk | NE | WR | 9.4 |
| 21 | Blake Corum | LAR | RB | 7.8 |
| 22 | Jermaine Burton | CIN | WR | 7.5 |
| 23 | Malachi Corley | NYJ | WR | 7.4 |
| 24 | Roman Wilson | PIT | WR | 6.4 |
| 25 | Troy Franklin | DEN | WR | 6.3 |
| 26 | Jaylen Wright | MIA | RB | 6.0 |
| 27 | MarShawn Lloyd | GB | RB | 5.9 |
| 28 | Ben Sinnott | WAS | TE | 5.7 |
| 29 | Jalen McMillan | TB | WR | 5.1 |
| 30 | Luke McCaffrey | WAS | WR | 4.6 |
| 31 | Devontez Walker | BAL | WR | 4.4 |
| 32 | Javon Baker | NE | WR | 4.3 |
| 33 | Ray Davis | BUF | RB | 4.2 |
| 34 | Braelon Allen | NYJ | RB | 4.1 |
| 35 | Bucky Irving | TB | RB | 4.1 |
| 36 | Isaac Guerendo | SF | RB | 4.0 |
| 37 | Will Shipley | PHI | RB | 3.9 |
| 38 | Audric Estime | DEN | RB | 3.8 |
| 39 | Kimani Vidal | LAC | RB | 3.7 |
| 40 | Ja'Tavion Sanders | CAR | TE | 2.9 |
| 41 | Malik Washington | MIA | WR | 2.8 |
| 42 | Spencer Rattler | NO | QB | 2.6 |
| 43 | Theo Johnson | NYG | TE | 2.2 |
| 44 | Erick All | CIN | TE | 2.2 |
| 45 | Jacob Cowing | SF | WR | 2.1 |
| 46 | Tyrone Tracy Jr. | NYG | RB | 2.0 |
| 47 | Ainias Smith | PHI | WR | 1.9 |
| 48 | Dylan Laube | LV | RB | 1.9 |
| 49 | Cade Stover | HOU | TE | 1.8 |
| 50 | Johnny Wilson | PHI | WR | 1.7 |
| 51 | Anthony Gould | IND | WR | 1.7 |
| 52 | Rasheen Ali | BAL | RB | 1.6 |
| 53 | Jawhar Jordan | HOU | RB | 1.5 |
| 54 | Jaheim Bell | NE | TE | 1.4 |
| 55 | Jamari Thrash | CLE | WR | 1.4 |
| 56 | Tip Reiman | ARI | TE | 1.4 |
| 57 | Isaiah Davis | NYJ | RB | 1.3 |
| 58 | Brenden Rice | LAC | WR | 1.2 |
| 59 | Jared Wiley | KC | TE | 1.1 |
| 60 | Ryan Flournoy | DAL | WR | 1.1 |
| 61 | Bub Means | NO | WR | 0.9 |
| 62 | Jha'Quan Jackson | TEN | WR | 0.9 |
| 63 | Jordan Travis | NYJ | QB | 0.9 |
| 64 | Jordan Whittington | LAR | WR | 0.8 |
| 65 | Kendall Milton | NA | RB | 0.8 |
| 66 | Keilan Robinson | JAX | RB | 0.8 |
| 67 | Joe Milton | NE | QB | 0.8 |
| 68 | Casey Washington | ATL | WR | 0.7 |
| 69 | Tejhaun Palmer | ARI | WR | 0.7 |
| 70 | Devin Leary | BAL | QB | 0.7 |
| 71 | Blake Watson | NA | RB | 0.6 |
| 72 | George Holani | SEA | RB | 0.6 |
| 73 | AJ Barner | SEA | TE | 0.5 |
| 74 | Jase McClellan | ATL | RB | 0.5 |
| 75 | Tanner McLachlan | CIN | TE | 0.4 |
| 76 | Michael Pratt | NA | QB | 0.4 |
| 77 | Dallin Holker | NA | TE | 0.3 |
| 78 | Dillon Johnson | NA | RB | 0.3 |
| 79 | Miyan Williams | NA | RB | 0.2 |
The Lamb/Jefferson year compared to Jonathon Brooks and Trey Benson this year. Have recent events clouded our view? A lot of this lines up very well for Brooks.
I imbibed a ton of draft content and virtually no one had anything overly negative to say about Brooks. It is was almost unanimous among draft analysts that Brooks was a great prospect and as talented as any back in the class.
Under the radar is not the right way to put it but Brooks h
If I can stay in the top 2.05
player_stats <-
load_player_stats(seasons = 1999:2023) %>%
filter(season_type == "REG" &
position %in% c("QB","RB","WR","TE"))
per_passing_yard <- .04
per_passing_td <- 6
per_interception <- -1
per_fumble_lost <- -1
per_carry <- 0
per_rushing_first_down <- 0
per_rushing_yard <- .1
per_rushing_td <- 6
per_reception <- 1
per_receiving_first_down <- 0
per_receiving_yard <- .1
per_receiving_td <- 6
league_size <- 12
num_qb <- 1
num_rb <- 2
num_wr <- 3
num_te <- 1
num_sf <- 0
num_fl <- 1
num_starters <- 8
rb_ppr_prem <- 0
wr_ppr_prem <-0
te_ppr_prem <- 0
#put together all of the different variables into a dataframe
variable_names <- c("per_passing_yard",
"per_passing_td",
"per_interception",
"per_fumble_lost",
"per_carry",
"per_rushing_first_down",
"per_rushing_yard",
"per_rushing_td",
"per_reception",
"per_receiving_first_down",
"per_receiving_yard",
"per_receiving_td",
"league_size",
"num_qb",
"num_rb",
"num_wr",
"num_te",
"num_sf",
"num_fl",
"num_starters",
"rb_ppr_prem",
"wr_ppr_prem",
"te_ppr_prem"
)
# Get the values of variables
variable_values <- mget(variable_names)
# Create a dataframe with one row and columns named after the variable names
combined_data <- data.frame(t(unlist(variable_values)))
# Set the column names of the dataframe to the variable names
colnames(combined_data) <- variable_names
player_stats <-
player_stats %>%
mutate(fumbles_lost = sum(sack_fumbles_lost, rushing_fumbles_lost, receiving_fumbles_lost)) %>%
mutate(fp = per_passing_yard * passing_yards +
per_passing_td * passing_tds +
per_interception * interceptions +
per_fumble_lost * fumbles_lost +
per_carry * carries +
per_rushing_first_down * rushing_first_downs +
per_rushing_yard * rushing_yards +
per_rushing_td * rushing_tds +
per_reception * receptions +
per_receiving_first_down * receiving_first_downs +
per_receiving_yard * receiving_yards +
per_receiving_td * receiving_tds)
player_stats <-
player_stats %>%
mutate(fp = case_when(
position == "RB" ~ fp + (rb_ppr_prem * receptions),
position == "WR" ~ fp + (wr_ppr_prem * receptions),
position == "TE" ~ fp + (te_ppr_prem * receptions),
.default = fp
))
annual_fantasy <-
player_stats %>%
group_by(player_id, player_display_name, position, season) %>%
summarise(fppg = mean(fp),
games = n()) %>%
ungroup()
## `summarise()` has grouped output by 'player_id', 'player_display_name',
## 'position'. You can override using the `.groups` argument.
annual_fantasy <-
annual_fantasy %>%
filter(games >= 5)
annual_fantasy <-
annual_fantasy %>%
group_by(season, position) %>%
mutate(ppg_rank = rank(-fppg)
) %>%
ungroup()
annual_fantasy <-
annual_fantasy %>%
mutate(starter_non_flex =
case_when(
position == "QB" & ppg_rank <= num_qb * league_size ~ "yes",
position == "RB" & ppg_rank <= num_rb * league_size ~ "yes",
position == "WR" & ppg_rank <= num_wr * league_size ~ "yes",
position == "TE" & ppg_rank <= num_te * league_size ~ "yes",
.default = "no"
))
annual_fantasy <-
annual_fantasy %>%
filter(starter_non_flex == "no") %>%
group_by(season) %>%
mutate(superflex_rank = rank(-fppg)) %>%
ungroup() %>%
right_join(annual_fantasy)
## Joining with `by = join_by(player_id, player_display_name, position, season,
## fppg, games, ppg_rank, starter_non_flex)`
annual_fantasy <-
annual_fantasy %>%
mutate(starter_super_flex = ifelse(superflex_rank <= as.numeric(league_size)* as.numeric(num_sf), "yes","no")
)
annual_fantasy <-
annual_fantasy %>%
filter(position != "QB") %>%
filter(starter_non_flex == "no") %>%
filter(starter_super_flex == "no") %>%
group_by(season) %>%
mutate(flex_rank = rank(-fppg)) %>%
right_join(annual_fantasy)
## Joining with `by = join_by(player_id, player_display_name, position, season,
## fppg, games, ppg_rank, starter_non_flex, superflex_rank, starter_super_flex)`
annual_fantasy <-
annual_fantasy %>%
mutate(starter_flex = ifelse(flex_rank <= as.numeric(league_size)*as.numeric(num_fl),
"yes", "no"))
annual_fantasy <-
annual_fantasy %>%
filter(starter_super_flex == "yes" | starter_flex == "yes" | starter_non_flex == "yes") %>%
group_by(season, position) %>%
mutate(replacement_value = min(fppg)) %>%
ungroup()
annual_fantasy <-
annual_fantasy %>%
mutate(PPGAR = fppg - replacement_value) %>%
arrange(-PPGAR)
values <-
annual_fantasy %>%
mutate(
season_value = PPGAR * games/14) %>%
arrange(-season_value) %>%
select(player_id, player_display_name, position, season, season_value)
values <-
values %>%
arrange(season) %>%
pivot_wider(names_from = season, values_from = season_value) %>%
mutate(across(everything(), ~ifelse(is.na(.x), 0, .x))) %>%
mutate(career_value = rowSums(across(where(is.numeric)))) %>%
arrange(-career_value)
ids <-
load_ff_playerids()
values_with_id <-
ids %>%
select(player_id = gsis_id, name, birthdate, draft_year, draft_ovr) %>%
right_join(values)
## Joining with `by = join_by(player_id)`
#table with recent picks
since09 <-
values_with_id %>%
filter(draft_year >= 2009) %>%
arrange(-career_value) %>%
mutate(gsis_id = player_id)
draft_picks <-
load_draft_picks(seasons = 2009:2023) %>%
filter(position %in% c("QB","RB","WR","TE"))
draft_since09 <-
draft_picks %>%
full_join(since09, by = "gsis_id") %>%
filter(!is.na(pfr_player_name))
my_values <- gsheet2tbl("https://docs.google.com/spreadsheets/d/1opcVw2hPPdvWZK3lYBeBlO5PcnDjsEWJMC4O2Tan0Uc")
sleeper_join <- gsheet2tbl("https://docs.google.com/spreadsheets/d/1nhoX6VAmd7f3gPHRcLcfmSwE1NIQmKNyqIas7o3BqH0/edit?usp=sharing") %>%
select(dan_id, sleeper_id)
my_values <-
my_values %>%
left_join(sleeper_join) %>%
mutate(sleeper_id = as.character(sleeper_id))
## Joining with `by = join_by(dan_id)`
download_link <-
"https://drive.google.com/uc?export=download&id=1uFG3EvvWRex7id8JPOvNTT9Z58HTvk6v"
positional_model <-
create_download_url(download_link) %>%
url() %>%
readRDS()
players <-
load_players()
players <-
load_ff_playerids() %>%
select(gsis_id, sleeper_id, mfl_id) %>%
right_join(players)
## Joining with `by = join_by(gsis_id)`
teams <-
load_teams()
players <-
teams %>%
select(team_abbr, team_logo_espn) %>%
right_join(players)
## Joining with `by = join_by(team_abbr)`
player_values <-
players %>%
filter(position %in% c("QB", "RB","WR","TE") & entry_year >= 2009) %>%
select(sleeper_id, gsis_id, mfl_id, team_logo_espn, headshot, birth_date, rookie_year, draft_number) %>%
mutate(sleeper_id = as.character(sleeper_id)) %>%
filter(!is.na(sleeper_id)) %>%
right_join(my_values)
## Joining with `by = join_by(sleeper_id)`
draft_since09_no_id <-
draft_since09 %>%
filter(is.na(gsis_id))
draft_since09 <-
draft_since09 %>%
filter(!is.na(gsis_id)) %>%
left_join(player_values, by = "gsis_id") %>%
arrange(gsis_id) %>%
bind_rows(draft_since09_no_id)
draft_since09 <-
draft_since09 %>%
mutate(career_value = ifelse(!is.na(career_value), career_value, 0),
current_value = ifelse(!is.na(Value), Value, 0),
total_value = career_value + current_value,
position = position.x) %>%
arrange(desc(total_value))
draft_since09 %>%
select(pfr_player_name, position, pick, current_value, career_value, total_value) %>%
filter(position == "WR" & pick >= 1 & pick <6) %>%
summarise(ave = mean(total_value))
## # A tibble: 1 × 1
## ave
## <dbl>
## 1 27.1
draft_since09 %>%
filter(position == "WR" & between(pick, 102-15, 102+15)) %>%
select(player_display_name, Player, pick, total_value) %>%
arrange(-total_value)
## ── nflverse Draft Picks, via Pro Football Reference ────────────────────────────
## ℹ Data updated: 2024-05-03 01:09:30 EDT
## # A tibble: 60 × 4
## player_display_name Player pick total_value
## <chr> <chr> <int> <dbl>
## 1 Amon-Ra St. Brown Amon-Ra St. Brown 112 64.6
## 2 Nico Collins Nico Collins 89 26.8
## 3 T.Y. Hilton <NA> 92 26.0
## 4 Eric Decker <NA> 87 22.2
## 5 Kenny Golladay <NA> 96 7.56
## 6 Mike Williams <NA> 101 6.41
## 7 John Brown <NA> 91 6.03
## 8 <NA> Michael Wilson 94 5.3
## 9 Jamison Crowder Jamison Crowder 105 4.49
## 10 Cecil Shorts <NA> 114 3.75
## # ℹ 50 more rows
draft_since09 %>%
filter(position == "WR") %>%
ggplot(aes(x = pick, y= total_value)) +
geom_point()
Crazy to write off Penix. What is the real difference between him and a rookie like McCarthy, Maye or Nix? If you are a contender this year, you should have two Top 20 quarterbacks. Maye’s early draft ADP is QB23, McCarthy’s is QB27, and Nix is QB31.
You’re underestimating the importance of TE-Premium scoring.