Skip to content
Fantasy Trade Calculator
Fantasy Trade Calculator
All data as of May 27th, 2025
Pitchers
library(readr)
library(lubridate)
library(data.table)
library(readxl)
library(dplyr)
library(ggplot2)
library(ggrepel)
library(tibble)
library(tidyr)
today <- as.Date("2025-06-11")
week(today)
start_of_season <- as.Date("2025-03-27")
total_weeks <- week(today) - week(start_of_season)
total_weeks
PitcherStats <- read.csv("stats (17).csv")
PitcherStats <- PitcherStats %>%
mutate(name = as.character(last_name..first_name), K = as.numeric(strikeout), BB = as.numeric(walk), SLG = round(as.numeric(slg_percent), 3), R = as.numeric(p_run), SB = as.numeric(p_total_stolen_base), RBI = as.numeric(p_rbi), GIDP = as.numeric(p_gnd_into_dp), IBB = as.numeric(p_intent_walk), TB = as.numeric(p_total_bases), CS = as.numeric(p_total_caught_stealing)) %>%
mutate(fantasy_points_allowed = (-1 * (K + CS)) + (-2 * GIDP) + SB + RBI + IBB + BB + TB + R)
PitcherStats <- PitcherStats[, c("name", "K", "BB", "SLG", "R", "SB", "RBI", "GIDP", "IBB", "TB", "CS", "fantasy_points_allowed", "K")]
mlb_teams.df <- read_excel("MLB Database(AutoRecovered).xlsx", sheet = 5)
all_pitchers_teams <- read_excel("MLB Database(AutoRecovered).xlsx", sheet = 8)
team_colors <- c("#114078", "#AB1B28", "#122245", "#DF4605", "#F8C52D", "#C30D32", "#FFC525", "#E56D1F", "#FF5104", "#D40133", "#0E3487", "#1F2C60", "#E11938", "#005D5D", "#BD3039", "#014787", "#02426D", "#C1092C", "#FE5B1D", "#BE0B19", "#C51118", "#072E5C", "#003831", "#C10300", "#C70222", "#09A4DE", "#FFC82A", "#B9001E", "#33016F", "#FBFFFE")
alternate_team_colors <- c("#E1D8CF", "#02B3CD", "#DD0429", "#454748", "#96BCD6", "#467CB3", "#EF2D7F", "#1E2766", "#551C68", "#0350AB", "#4D80B6", "#557FD2", "#7C0014", "#F7D24A", "#4F756E", "#5EA9E0", "#F3471B", "#3350A2", "#848485", "#DCE2E5", "#E6E1D1", "#7B67B0", "#F0B52F", "#F5C3CE", "#343434", "#F4293A", "#1F1F1E", "#E0CEB5", "#183831", "#161112")
SavantStatsPitcher <- read.csv("stats (17).csv")
SavantStatsPitcher <- SavantStatsPitcher %>%
mutate(name = as.character(last_name..first_name), G = as.numeric(p_game), AVG = round(as.numeric(batting_avg), 3), SLG = round(as.numeric(slg_percent), 3), OBP = round(as.numeric(on_base_percent), 3), OPS = round(as.numeric(on_base_plus_slg), 3), xBA = round(as.numeric(xba), 3), xSLG = round(as.numeric(xslg), 3), wOBA = round(as.numeric(woba), 3), xwOBA = round(as.numeric(xwoba), 3))
all_pitcher_stats <- SavantStatsPitcher %>%
left_join(PitcherStats, by = "name")
all_pitcher_stats <- all_pitcher_stats %>%
select("name", "G", "AVG", "SLG.x", "OBP", "OPS", "xBA", "xSLG", "wOBA", "xwOBA", "hit", "K", "BB", "R", "SB", "RBI", "GIDP", "IBB", "TB", "CS", "fantasy_points_allowed", "p_earned_run", "p_save", "p_blown_save", "p_win", "p_loss", "p_shutout", "xbadiff", "xslgdiff", "wobadiff", "p_formatted_ip", "p_complete_game", "p_hold", "p_complete_game", "p_out") %>%
mutate(SLG = SLG.x) %>%
select("name", "G", "AVG", "SLG", "OBP", "OPS", "xBA", "xSLG", "wOBA", "xwOBA", "hit", "K", "BB", "R", "SB", "RBI", "GIDP", "IBB", "TB", "CS", "fantasy_points_allowed", "p_earned_run", "p_save", "p_blown_save", "p_win", "p_loss", "p_shutout", "xbadiff", "xslgdiff", "wobadiff", "p_formatted_ip", "p_complete_game", "p_hold", "p_complete_game", "p_out") %>%
mutate(fantasy_ppg = fantasy_points_allowed / G) %>%
mutate(AB = TB / SLG) %>%
mutate(xBases = AB * xSLG) %>%
mutate(xFantasyPA = (-1 * (K + CS)) + (-2 * GIDP) + SB + RBI + IBB + BB + xBases + R) %>%
mutate(xFantasyPPAPG = xFantasyPA / G) %>%
mutate("xFanPPAPG - FPApg" = xFantasyPPAPG - fantasy_ppg) %>%
mutate(short_name = name) %>%
separate(col = short_name, into = c("Last", "First"), sep = " ") %>%
mutate(First = substr(First, 1, 1), Last = substr(Last, 1, 1)) %>%
mutate(short_name = paste(First, Last, sep = "")) %>%
select("name", "G", "fantasy_points_allowed", "xFantasyPPAPG", "AVG", "SLG", "OBP", "OPS", "xBA", "xSLG", "wOBA", "xwOBA", "hit", "K", "BB", "R", "SB", "RBI", "GIDP", "IBB", "TB", "CS", "fantasy_ppg", "short_name", "p_earned_run", "p_save", "p_blown_save", "p_win", "p_loss", "p_shutout", "xbadiff", "xslgdiff", "wobadiff", "p_formatted_ip", "p_hold", "p_complete_game", "p_out", "xBases", "AB") %>%
mutate(fantasy_points_awarded = p_out - (2 * p_earned_run) + (2 * p_win) - (2 * p_loss) + (5 * p_save) - hit - (3 * p_blown_save) + K + G - BB + (3 * p_complete_game) + (2 * p_hold)) %>%
mutate(xFantasyAwarded = p_out - (2 * p_earned_run) + (2 * p_win) - (2 * p_loss) + (5 * p_save) - (xBA * AB) - (3 * p_blown_save) + K + G - BB + (3 * p_complete_game) + (2 * p_hold)) %>%
mutate(xFantasyAwardedPerGame = xFantasyAwarded / G) %>%
mutate(xFantasyAwardedPerWeek = xFantasyAwarded / total_weeks)
mlb_teams.df <- mlb_teams.df %>%
mutate(team_colors = team_colors, alternate_team_colors = alternate_team_colors)
mlb_teams_limited <- mlb_teams.df %>%
select("Team", "Team Name", "team_colors", "alternate_team_colors")
all_pitchers_teams <- all_pitchers_teams %>%
left_join(mlb_teams_limited, by = "Team") %>%
separate(col = Name, into = c("First", "Last"), sep = " ") %>%
mutate(Name = paste(Last, First, sep = ", "))
all_pitcher_stats_and_teams <- all_pitcher_stats %>%
left_join(all_pitchers_teams, by = c("name" = "Name")) %>%
mutate(First = substr(First, 1, 1), Last = substr(Last, 1, 1)) %>%
mutate(short_name = paste(First, Last, sep = "")) %>%
mutate(name_and_team = paste(name, Team, sep = ", ")) %>%
mutate(fantasy_papw = fantasy_points_allowed / total_weeks) %>%
mutate(fantasy_points_awarded_perweek = fantasy_points_awarded / total_weeks) %>%
mutate(fantasy_points_awarded_pergame = fantasy_points_awarded / G) %>%
mutate("xFPAwpg - FPAwpg" = xFantasyAwardedPerGame - fantasy_points_awarded_pergame)
all_pitcher_stats_and_teams_limited <- all_pitcher_stats_and_teams %>%
select(name, G, fantasy_points_awarded, fantasy_points_awarded_pergame, fantasy_points_awarded_perweek, xFantasyAwarded, xFantasyAwardedPerGame, xFantasyAwardedPerWeek, "xFPAwpg - FPAwpg")
all_pitcher_stats_and_teams_limited
library(readxl)
library(dplyr)
library(tidyr)
mlb_player_stats.df <- read_excel("MLB Database(AutoRecovered).xlsx")
savant_stats.df <- read_excel("MLB Database(AutoRecovered).xlsx", sheet = 2)
defense_and_running <- read_excel("MLB Database(AutoRecovered).xlsx", sheet = 3)
fangraphs.df <- read_excel("MLB Database(AutoRecovered).xlsx", sheet = 4)
mlb_teams.df <- read_excel("MLB Database(AutoRecovered).xlsx", sheet = 5)
mlb_standings.df <- read_excel("MLB Database(AutoRecovered).xlsx", sheet = 6)
all_pitchers_teams <- read_excel("MLB Database(AutoRecovered).xlsx", sheet = 8)
team_colors <- c("#114078", "#AB1B28", "#122245", "#DF4605", "#F8C52D", "#C30D32", "#FFC525", "#E56D1F", "#FF5104", "#D40133", "#0E3487", "#1F2C60", "#E11938", "#005D5D", "#BD3039", "#014787", "#02426D", "#C1092C", "#FE5B1D", "#BE0B19", "#C51118", "#072E5C", "#003831", "#C10300", "#C70222", "#09A4DE", "#FFC82A", "#B9001E", "#33016F", "#FBFFFE")
alternate_team_colors <- c("#E1D8CF", "#02B3CD", "#DD0429", "#454748", "#96BCD6", "#467CB3", "#EF2D7F", "#1E2766", "#551C68", "#0350AB", "#4D80B6", "#557FD2", "#7C0014", "#F7D24A", "#4F756E", "#5EA9E0", "#F3471B", "#3350A2", "#848485", "#DCE2E5", "#E6E1D1", "#7B67B0", "#F0B52F", "#F5C3CE", "#343434", "#F4293A", "#1F1F1E", "#E0CEB5", "#183831", "#161112")
mlb_teams.df <- mlb_teams.df %>%
mutate(team_colors = team_colors, alternate_team_colors = alternate_team_colors)
mlb_teams_limited <- mlb_teams.df %>%
select("Team", "Team Name", "team_colors", "alternate_team_colors")
all_pitchers_teams <- all_pitchers_teams %>%
left_join(mlb_teams_limited, by = "Team") %>%
separate(col = Name, into = c("First", "Last"), sep = " ") %>%
mutate(Name = paste(Last, First, sep = ", "))
Hitters
library(readr)
library(lubridate)
library(data.table)
library(readxl)
library(dplyr)
library(ggplot2)
library(ggrepel)
library(tibble)
library(tidyr)
library(stringr)
mlb_player_stats.df <- read_excel("MLB Database(AutoRecovered).xlsx")
mlb_teams.df <- read_excel("MLB Database(AutoRecovered).xlsx", sheet = 5)
# Check the column names of mlb_teams.df to see the available columns
colnames(mlb_teams.df)
# Adjust the select statement based on the actual column names in mlb_teams.df
mlb_teams_limited <- mlb_teams.df %>%
select("Team", "Team Name") # Adjusted to match the actual column names
today <- as.Date("2025-06-04")
start_of_season <- as.Date("2025-03-27")
total_weeks <- week(today) - week(start_of_season)
batter_stats <- read.csv("stats (16).csv")
batters_limited <- mlb_player_stats.df %>%
select(NAME, Bats, Pos, Team) %>%
separate(col = NAME, into = c("First", "Last"), sep = " ") %>%
mutate(Name = paste(First, Last, sep = " ")) %>%
select(Name, Bats, Pos, Team)
batter_stats <- batter_stats %>%
separate(col = last_name..first_name, into = c("Last", "First"), sep = ", ") %>%
mutate(Name = paste(First, Last, sep = " ")) %>%
select(Name, ab, pa, hit, single, double, triple, home_run, strikeout, walk, batting_avg, slg_percent, on_base_percent, on_base_plus_slg, b_rbi, b_total_bases, r_total_caught_stealing, r_total_stolen_base, b_game, b_gnd_into_dp, b_hit_by_pitch, b_intent_walk, r_run, xba, xslg, woba, xwoba, xobp, xbadiff, xslgdiff, wobadiff) %>%
left_join(batters_limited, by = "Name")
batter_stats <- batter_stats %>%
mutate(fantasy_points_awarded = b_total_bases + r_total_stolen_base - r_total_caught_stealing - (2*b_gnd_into_dp) + b_hit_by_pitch + b_intent_walk + r_run + b_rbi + walk - strikeout) %>%
mutate(xtotalbases = xslg * ab) %>%
mutate(xfantasypoints = xtotalbases + r_total_stolen_base - r_total_caught_stealing - (2*b_gnd_into_dp) + b_hit_by_pitch + b_intent_walk + r_run + b_rbi + walk - strikeout) %>%
mutate(fantasypointspergame = fantasy_points_awarded / b_game) %>%
mutate(xfantasypergame = xfantasypoints / b_game)
batter_stats_limited <- batter_stats %>%
select(Name, fantasy_points_awarded, fantasypointspergame, xfantasypoints, xfantasypergame) %>%
mutate("fppg - xfppg" = fantasypointspergame - xfantasypergame) %>%
filter(fantasy_points_awarded > 30) %>%
filter(xfantasypergame > 2.3)
batter_stats_limited
#Need to make separate rows for players appearing on multiple teamsSources:
Major League leaders. FanGraphs Baseball. (n.d.). https://www.fangraphs.com/leaders/major-league?pos=all&stats=pit&lg=all&qual=0&season=2025&season1=2025&ind=0&rost=&filter=&players=0&type=8&team=0&month=0&pagenum=1&pageitems=2000000000
Statcast custom leaderboards. baseballsavant.com. (n.d.). https://baseballsavant.mlb.com/leaderboard/custom?year=2025&type=pitcher&filter=&min=q&selections=pa%2Ck_percent%2Cbb_percent%2Cwoba%2Cxwoba%2Csweet_spot_percent%2Cbarrel_batted_rate%2Chard_hit_percent%2Cavg_best_speed%2Cavg_hyper_speed%2Cwhiff_percent%2Cswing_percent&chart=false&x=pa&y=pa&r=no&chartType=beeswarm&sort=xwoba&sortDir=asc