├── README.md ├── LPSolve - DFS Lineup Optimization.R └── Rotogrinders MLB Projections 6 17 2016.csv /README.md: -------------------------------------------------------------------------------- 1 | Generate an optimal lineup for daily fantasy sports based on a player's expected points while staying under the salary cap. 2 | 3 | The project uses R package lpsolve to generate the solution. 4 | 5 | I've included a csv data file that you can use to test the code 6 | 7 | -------------------------------------------------------------------------------- /LPSolve - DFS Lineup Optimization.R: -------------------------------------------------------------------------------- 1 | ####Generate optimal daily fantasy baseball line up using lpsolve function#### 2 | #Author: Matt Brown email: Matthew.brown.iowa@gmail.com 3 | # 4 | #The algorithm takes a csv of player names, positions, salaries and expected points scored and generates an optimal lineup based 5 | #based on the constraints in the evaluation function. 6 | # 7 | #The algorithm can be used across a variety of similar linear optimization problems. 8 | 9 | #Install.packages("lpsolve") 10 | 11 | library(lpSolve) 12 | 13 | #Read in dataset 14 | dataset<-read.csv("Rotogrinders MLB Projections 6 17 2016.csv", stringsAsFactors = FALSE) 15 | 16 | #Change variables to appropriate types 17 | dataset$position <- as.factor(dataset$position) 18 | dataset$salary <-as.numeric(dataset$salary) 19 | 20 | 21 | #### Prepare constraint matrix of zeros ##### 22 | A <- matrix(0, nrow = 8, ncol = nrow(dataset)) 23 | 24 | #Designate the positions that are equivalent to each other when generating the optimal lineup 25 | #There are 7 distinct positions and 1 constraint in which salary is < 50,000 26 | #I.e. A player with the position 1B/2B can fill the 1B or the 2B position 27 | #Add a "1" to all position that can fill that position slot 28 | 29 | 30 | #Set 1B parameters 31 | j<-1 32 | i<-1 33 | for (i in 1:nrow(dataset)){ 34 | if (dataset$position[i]=="1B" || 35 | dataset$position[i]=="1B/2B" || 36 | dataset$position[i]=="1B/3B" || 37 | dataset$position[i]=="1B/OF") 38 | A[j,i]<-1 39 | } 40 | #2B 41 | j<-2 42 | i<-1 43 | for (i in 1:nrow(dataset)){ 44 | if (dataset$position[i]=="2B" || 45 | dataset$position[i]=="1B/2B" || 46 | dataset$position[i]== "2B/OF"|| 47 | dataset$position[i]=="2B/SS" || 48 | dataset$position[i]=="2B/3B") 49 | A[j,i]<-1 50 | } 51 | #3B 52 | j<-3 53 | i<-1 54 | for (i in 1:nrow(dataset)){ 55 | if (dataset$position[i]=="3B" || 56 | dataset$position[i]=="1B/3B" || 57 | dataset$position[i]== "2B/3B"|| 58 | dataset$position[i]=="3B/SS" || 59 | dataset$position[i]=="3B/OF") 60 | A[j,i]<-1 61 | } 62 | #SS 63 | j<-4 64 | i<-1 65 | for (i in 1:nrow(dataset)){ 66 | if (dataset$position[i]=="SS" || 67 | dataset$position[i]=="1B/SS" || 68 | dataset$position[i]== "2B/SS"|| 69 | dataset$position[i]=="3B/SS" || 70 | dataset$position[i]=="OF/SS") 71 | A[j,i]<-1 72 | } 73 | #C 74 | j<-5 75 | i<-1 76 | for (i in 1:nrow(dataset)){ 77 | if (dataset$position[i]=="C" || 78 | dataset$position[i]=="1B/C" || 79 | dataset$position[i]== "2B/C"|| 80 | dataset$position[i]=="3B/C" || 81 | dataset$position[i]=="C/OF") 82 | A[j,i]<-1 83 | } 84 | #SP 85 | j<-6 86 | i<-1 87 | for (i in 1:nrow(dataset)){ 88 | if (dataset$position[i]=="SP") 89 | A[j,i]<-1 90 | } 91 | 92 | #OF 93 | j<-7 94 | i<-1 95 | for (i in 1:nrow(dataset)){ 96 | if (dataset$position[i]=="OF" || 97 | dataset$position[i]=="1B/OF" || 98 | dataset$position[i]== "2B/OF"|| 99 | dataset$position[i]=="3B/OF" || 100 | dataset$position[i]=="C/OF") 101 | A[j,i]<-1 102 | } 103 | i<-1 104 | 105 | A[8, ] <- dataset$salary # salary <= 50000 106 | 107 | # Prepare input for LP solver 108 | objective.in <- dataset$fpts 109 | const.mat <- A 110 | const.dir <- c("==", "==", "==", "==","==","==","==", "<=") 111 | const.rhs <- c(1, 1, 1, 1,1,2,3, 50000) 112 | 113 | # Generate optimal lineup with lp solve 114 | require(lpSolve) 115 | sol <- lp(direction = "max", objective.in, # maximize objective function 116 | const.mat, const.dir, const.rhs, # constraints 117 | all.bin = TRUE) # use binary variables only 118 | 119 | ### View the solution 120 | inds <- which(sol$solution == 1) 121 | sum(dataset$salary[inds]) 122 | 123 | 124 | solution<-dataset[inds, ] 125 | 126 | #Print players in optimal lineup 127 | solution 128 | 129 | #Write csv file of the optimal lineup 130 | write.table(solution1, "mydata.txt", sep="\t") 131 | 132 | -------------------------------------------------------------------------------- /Rotogrinders MLB Projections 6 17 2016.csv: -------------------------------------------------------------------------------- 1 | player,salary,team,position,opp,fpts 2 | Yonder Alonso,2700,OAK,1B,LAA,5.1 3 | Pedro Alvarez,3500,BAL,1B,TOR,5.35 4 | John Jaso,2700,PIT,1B,CHC,5.42 5 | Billy Butler,2900,OAK,1B,LAA,5.42 6 | James Loney,3100,NYM,1B,ATL,5.43 7 | C.J. Cron,4000,LAA,1B,OAK,5.5 8 | Mark Reynolds,3500,COL,1B,MIA,5.79 9 | Joe Mauer,4000,MIN,1B,NYY,5.8 10 | Prince Fielder,3300,TEX,1B,STL,6.12 11 | Tommy Joseph,3400,PHI,1B,ARI,6.22 12 | Logan Morrison,3900,TBR,1B,SFG,6.23 13 | Kendrys Morales,2700,KCR,1B,DET,6.31 14 | Chris Carter,3800,MIL,1B,LAD,6.43 15 | Dae-Ho Lee,4300,SEA,1B,BOS,6.59 16 | Justin Bour,2800,MIA,1B,COL,6.81 17 | Ryan Zimmerman,4800,WAS,1B,SDP,6.89 18 | Mike Napoli,4200,CLE,1B,CHW,6.94 19 | Freddie Freeman,4200,ATL,1B,NYM,6.96 20 | Brandon Belt,3800,SFG,1B,TBR,7.02 21 | Hanley Ramirez,3900,BOS,1B,SEA,7.1 22 | Jose Abreu,4300,CHW,1B,CLE,7.12 23 | Carlos Santana,3900,CLE,1B,CHW,7.21 24 | Justin Smoak,4200,TOR,1B,BAL,7.24 25 | Victor Martinez,3800,DET,1B,KCR,7.24 26 | Joey Votto,4100,CIN,1B,HOU,7.32 27 | Wil Myers,4800,SDP,1B,WAS,7.45 28 | Anthony Rizzo,5100,CHC,1B,PIT,7.56 29 | Eric Hosmer,4000,KCR,1B,DET,7.59 30 | Adrian Gonzalez,3000,LAD,1B,MIL,7.73 31 | Chris Davis,4700,BAL,1B,TOR,8.1 32 | Albert Pujols,3600,LAA,1B,OAK,8.25 33 | Miguel Cabrera,4400,DET,1B,KCR,8.57 34 | David Ortiz,5500,BOS,1B,SEA,10.14 35 | Edwin Encarnacion,5400,TOR,1B,BAL,10.45 36 | Paul Goldschmidt,5300,ARI,1B,PHI,10.54 37 | Steve Pearce,4100,TBR,1B/2B,SFG,6.56 38 | Max Muncy,2000,OAK,1B/3B,LAA,4.84 39 | David Freese,3300,PIT,1B/3B,CHC,5.26 40 | Marwin Gonzalez,3700,HOU,1B/3B,CIN,5.55 41 | Travis Shaw,3500,BOS,1B/3B,SEA,7.21 42 | Alex Rodriguez,4200,NYY,1B/3B,MIN,7.44 43 | Robert Refsnyder,3000,NYY,1B/OF,MIN,4.9 44 | Jose Peraza,3000,CIN,2B,HOU,4.51 45 | Jedd Gyorko,3400,STL,2B,TEX,4.93 46 | Josh Harrison,2700,PIT,2B,CHC,5.17 47 | Scooter Gennett,2400,MIL,2B,LAD,5.18 48 | Jimmy Paredes,2500,PHI,2B,ARI,5.23 49 | Johnny Giavotella,3600,LAA,2B,OAK,5.44 50 | Brett Lawrie,2900,CHW,2B,CLE,5.56 51 | Jonathan Schoop,3500,BAL,2B,TOR,5.64 52 | Cesar Hernandez,2900,PHI,2B,ARI,5.94 53 | Starlin Castro,3600,NYY,2B,MIN,6.07 54 | Derek Dietrich,2800,MIA,2B,COL,6.16 55 | Jed Lowrie,2900,OAK,2B,LAA,6.29 56 | DJ LeMahieu,4300,COL,2B,MIA,6.3 57 | Brian Dozier,3900,MIN,2B,NYY,6.35 58 | Joe Panik,4100,SFG,2B,TBR,6.48 59 | Brandon Phillips,3300,CIN,2B,HOU,6.49 60 | Logan Forsythe,3500,TBR,2B,SFG,6.69 61 | Ben Zobrist,4900,CHC,2B,PIT,6.93 62 | Jason Kipnis,3200,CLE,2B,CHW,7.1 63 | Dustin Pedroia,4400,BOS,2B,SEA,7.3 64 | Neil Walker,4000,NYM,2B,ATL,7.32 65 | Chase Utley,3600,LAD,2B,MIL,7.37 66 | Robinson Cano,5200,SEA,2B,BOS,7.46 67 | Jean Segura,4400,ARI,2B,PHI,7.47 68 | Daniel Murphy,4600,WAS,2B,SDP,7.5 69 | Ian Kinsler,5400,DET,2B,KCR,7.83 70 | Rougned Odor,4600,TEX,2B,STL,8.04 71 | Jose Altuve,5600,HOU,2B,CIN,10.24 72 | Alexi Amarista,2200,SDP,2B/3B,WAS,4.26 73 | Aaron Hill,2600,MIL,2B/3B,LAD,4.41 74 | Chase d'Arnaud,2800,ATL,2B/3B,NYM,5.24 75 | Yangervis Solarte,3200,SDP,2B/3B,WAS,6.6 76 | Jace Peterson,2400,ATL,2B/OF,NYM,4.55 77 | Howie Kendrick,2800,LAD,2B/OF,MIL,5.06 78 | Kelly Johnson,3200,NYM,2B/OF,ATL,5.08 79 | Whit Merrifield,3400,KCR,2B/OF,DET,5.52 80 | Ryan Goins,3300,TOR,2B/SS,BAL,3.73 81 | Darwin Barney,3000,TOR,2B/SS,BAL,4.29 82 | Ryan Flaherty,2300,BAL,3B,TOR,4.38 83 | Cheslor Cuthbert,2600,KCR,3B,DET,4.61 84 | Luis Valbuena,3100,HOU,3B,CIN,4.93 85 | Hernan Perez,3200,MIL,3B,LAD,4.99 86 | Brett Wallace,2700,SDP,3B,WAS,5.37 87 | Martin Prado,3400,MIA,3B,COL,5.51 88 | Eugenio Suarez,2900,CIN,3B,HOU,5.58 89 | Trevor Plouffe,3200,MIN,3B,NYY,5.75 90 | Anthony Rendon,4500,WAS,3B,SDP,6.07 91 | Jake Lamb,4800,ARI,3B,PHI,6.09 92 | Matt Duffy,3300,SFG,3B,TBR,6.11 93 | Chase Headley,3200,NYY,3B,MIN,6.44 94 | Yunel Escobar,3700,LAA,3B,OAK,6.78 95 | Justin Turner,3300,LAD,3B,MIL,6.81 96 | Kyle Seager,5000,SEA,3B,BOS,6.92 97 | Evan Longoria,4800,TBR,3B,SFG,6.93 98 | Nick Castellanos,3900,DET,3B,KCR,7.04 99 | Matt Carpenter,4100,STL,3B,TEX,7.19 100 | Adrian Beltre,3700,TEX,3B,STL,7.25 101 | Maikel Franco,3700,PHI,3B,ARI,7.28 102 | Danny Valencia,4000,OAK,3B,LAA,7.31 103 | Todd Frazier,4000,CHW,3B,CLE,7.56 104 | Nolan Arenado,4600,COL,3B,MIA,9.43 105 | Josh Donaldson,5600,TOR,3B,BAL,10.16 106 | Mike Aviles,2800,DET,3B/OF,KCR,5.16 107 | Jefry Marte,3200,LAA,3B/OF,OAK,5.32 108 | Jose Ramirez,3400,CLE,3B/OF,CHW,5.68 109 | Javier Baez,3800,CHC,3B/SS,PIT,6.49 110 | Eduardo Nunez,5000,MIN,3B/SS,NYY,6.63 111 | Manny Machado,4800,BAL,3B/SS,TOR,8 112 | Jason Castro,2800,HOU,C,CIN,3.86 113 | Chris Stewart,2000,PIT,C,CHC,3.95 114 | Kurt Suzuki,2400,MIN,C,NYY,4.1 115 | Kevin Plawecki,2300,NYM,C,ATL,4.14 116 | Francisco Pena,2900,BAL,C,TOR,4.29 117 | Sandy Leon,2900,BOS,C,SEA,4.38 118 | Carlos Perez,2400,LAA,C,OAK,4.48 119 | Jarrod Saltalamacchia,3500,DET,C,KCR,4.5 120 | Miguel Montero,3500,CHC,C,PIT,4.57 121 | Chris Gimenez,2300,CLE,C,CHW,4.57 122 | Ramon Cabrera,2200,CIN,C,HOU,4.64 123 | Alex Avila,2900,CHW,C,CLE,4.65 124 | A.J. Pierzynski,2600,ATL,C,NYM,4.67 125 | Curt Casali,2600,TBR,C,SFG,4.72 126 | Bobby Wilson,2100,TEX,C,STL,4.88 127 | James McCann,2600,DET,C,KCR,4.88 128 | Cameron Rupp,3400,PHI,C,ARI,5.07 129 | Chris Iannetta,4800,SEA,C,BOS,5.18 130 | Derek Norris,3000,SDP,C,WAS,5.24 131 | Yadier Molina,2800,STL,C,TEX,5.32 132 | Yasmani Grandal,2800,LAD,C,MIL,5.5 133 | Nick Hundley,2400,COL,C,MIA,5.62 134 | Wilson Ramos,5000,WAS,C,SDP,5.69 135 | Salvador Perez,3700,KCR,C,DET,5.98 136 | J.T. Realmuto,2900,MIA,C,COL,6.26 137 | Russell Martin,4000,TOR,C,BAL,6.29 138 | Jonathan Lucroy,3800,MIL,C,LAD,6.37 139 | Stephen Vogt,3300,OAK,C,LAA,6.4 140 | Brian McCann,3900,NYY,C,MIN,6.48 141 | Buster Posey,4100,SFG,C,TBR,6.61 142 | Evan Gattis,3500,HOU,C,CIN,6.78 143 | Welington Castillo,4000,ARI,C,PHI,7.38 144 | Michael Martinez,2900,CLE,OF,CHW,4.05 145 | Keon Broxton,2600,MIL,OF,LAD,4.37 146 | Matt Joyce,2700,PIT,OF,CHC,4.41 147 | Jarrett Parker,3000,SFG,OF,TBR,4.47 148 | Michael Taylor,4400,WAS,OF,SDP,4.56 149 | Brett Eibner,2300,KCR,OF,DET,4.59 150 | Jaff Decker,2000,TBR,OF,SFG,4.6 151 | Gregor Blanco,3100,SFG,OF,TBR,4.63 152 | Tyler Goeddel,3000,PHI,OF,ARI,4.78 153 | Angel Pagan,3200,SFG,OF,TBR,4.79 154 | Peter Bourjos,2500,PHI,OF,ARI,4.83 155 | Mallex Smith,3500,ATL,OF,NYM,4.85 156 | Paulo Orlando,2700,KCR,OF,DET,4.87 157 | Lonnie Chisenhall,2900,CLE,OF,CHW,4.88 158 | Ender Inciarte,3500,ATL,OF,NYM,4.89 159 | Cody Asche,2500,PHI,OF,ARI,4.92 160 | Max Kepler,2700,MIN,OF,NYY,4.94 161 | Desmond Jennings,3100,TBR,OF,SFG,4.96 162 | Byron Buxton,3600,MIN,OF,NYY,4.96 163 | J.B. Shuck,3000,CHW,OF,CLE,4.97 164 | Nick Markakis,3300,ATL,OF,NYM,5.14 165 | Peter O'Brien,3500,ARI,OF,PHI,5.17 166 | Avisail Garcia,3200,CHW,OF,CLE,5.2 167 | Ezequiel Carrera,4000,TOR,OF,BAL,5.28 168 | Chris Young,4100,BOS,OF,SEA,5.43 169 | Kevin Pillar,4800,TOR,OF,BAL,5.45 170 | Matthew Szczur,3300,CHC,OF,PIT,5.48 171 | Melvin Upton Jr.,3700,SDP,OF,WAS,5.49 172 | Albert Almora,3400,CHC,OF,PIT,5.51 173 | Hyun-Soo Kim,3200,BAL,OF,TOR,5.51 174 | Ben Revere,3900,WAS,OF,SDP,5.52 175 | Colby Rasmus,4100,HOU,OF,CIN,5.61 176 | Michael Bourn,3700,ARI,OF,PHI,5.63 177 | Rajai Davis,4200,CLE,OF,CHW,5.7 178 | Robbie Grossman,3500,MIN,OF,NYY,5.72 179 | Denard Span,3500,SFG,OF,TBR,5.81 180 | Billy Hamilton,3700,CIN,OF,HOU,5.83 181 | Randal Grichuk,3000,STL,OF,TEX,5.89 182 | Norichika Aoki,4100,SEA,OF,BOS,6.01 183 | Leonys Martin,4700,SEA,OF,BOS,6.06 184 | Corey Dickerson,3800,TBR,OF,SFG,6.07 185 | Melky Cabrera,3400,CHW,OF,CLE,6.08 186 | Jon Jay,3300,SDP,OF,WAS,6.08 187 | Shin-Soo Choo,3400,TEX,OF,STL,6.3 188 | Cameron Maybin,4100,DET,OF,KCR,6.33 189 | Joc Pederson,3800,LAD,OF,MIL,6.35 190 | Franklin Gutierrez,3600,SEA,OF,BOS,6.36 191 | Ryan Raburn,3000,COL,OF,MIA,6.4 192 | Adam Duvall,4500,CIN,OF,HOU,6.41 193 | Coco Crisp,3100,OAK,OF,LAA,6.49 194 | Justin Upton,4300,DET,OF,KCR,6.58 195 | Trayce Thompson,3100,LAD,OF,MIL,6.61 196 | Carlos Gomez,3700,HOU,OF,CIN,6.69 197 | Gregory Polanco,4000,PIT,OF,CHC,6.73 198 | Adam Eaton,4400,CHW,OF,CLE,6.76 199 | Jayson Werth,5100,WAS,OF,SDP,6.76 200 | Yasmany Tomas,3800,ARI,OF,PHI,6.77 201 | Andrew McCutchen,2700,PIT,OF,CHC,6.8 202 | Odubel Herrera,3500,PHI,OF,ARI,6.8 203 | Matt Holliday,3600,STL,OF,TEX,6.8 204 | Jay Bruce,4600,CIN,OF,HOU,6.86 205 | Brett Gardner,4100,NYY,OF,MIN,6.98 206 | Lorenzo Cain,3000,KCR,OF,DET,7.02 207 | Billy Burns,3200,OAK,OF,LAA,7.02 208 | Giancarlo Stanton,2800,MIA,OF,COL,7.06 209 | Christian Yelich,3500,MIA,OF,COL,7.1 210 | Dexter Fowler,4700,CHC,OF,PIT,7.16 211 | Jackie Bradley,4700,BOS,OF,SEA,7.17 212 | Matt Kemp,3600,SDP,OF,WAS,7.17 213 | Adam Jones,4000,BAL,OF,TOR,7.19 214 | Khris Davis,3900,OAK,OF,LAA,7.21 215 | Marcell Ozuna,3600,MIA,OF,COL,7.22 216 | Mark Trumbo,4000,BAL,OF,TOR,7.33 217 | Carlos Gonzalez,3600,COL,OF,MIA,7.34 218 | Charlie Blackmon,4300,COL,OF,MIA,7.44 219 | Stephen Piscotty,3700,STL,OF,TEX,7.44 220 | Carlos Beltran,4900,NYY,OF,MIN,7.6 221 | Jacoby Ellsbury,4300,NYY,OF,MIN,7.86 222 | Nomar Mazara,3400,TEX,OF,STL,7.87 223 | Kole Calhoun,4400,LAA,OF,OAK,7.95 224 | Ryan Braun,4100,MIL,OF,LAD,8.15 225 | Bryce Harper,4400,WAS,OF,SDP,8.22 226 | Ian Desmond,4700,TEX,OF,STL,8.35 227 | Michael Conforto,3800,NYM,OF,ATL,8.51 228 | Michael Saunders,5000,TOR,OF,BAL,9.16 229 | Yoenis Cespedes,4900,NYM,OF,ATL,9.45 230 | Curtis Granderson,4700,NYM,OF,ATL,9.48 231 | Mookie Betts,5300,BOS,OF,SEA,9.63 232 | Nelson Cruz,5500,SEA,OF,BOS,10 233 | George Springer,4600,HOU,OF,CIN,10.3 234 | Mike Trout,5200,LAA,OF,OAK,10.47 235 | John Gant,5600,ATL,SP,NYM,9.36 236 | John Lamb,6000,CIN,SP,HOU,10.17 237 | Mike Wright,4300,BAL,SP,TOR,10.36 238 | Roenis Elias,4500,BOS,SP,SEA,10.71 239 | Patrick Dean,5000,MIN,SP,NYY,10.94 240 | Kendall Graveman,4200,OAK,SP,LAA,12.43 241 | Adam Morgan,5100,PHI,SP,ARI,12.76 242 | Michael Wacha,5900,STL,SP,TEX,14.63 243 | Hisashi Iwakuma,6100,SEA,SP,BOS,14.65 244 | Zach Davies,9800,MIL,SP,LAD,15.91 245 | Yordano Ventura,6500,KCR,SP,DET,16.39 246 | Adam Conley,6200,MIA,SP,COL,16.57 247 | Christian Friedrich,7800,SDP,SP,WAS,17.34 248 | Julio Urias,7600,LAD,SP,MIL,17.78 249 | Francisco Liriano,6300,PIT,SP,CHC,17.88 250 | Trevor Bauer,8200,CLE,SP,CHW,18.23 251 | Jose Quintana,9600,CHW,SP,CLE,18.34 252 | Matt Shoemaker,8700,LAA,SP,OAK,18.35 253 | Jeff Samardzija,10000,SFG,SP,TBR,18.56 254 | Robbie Ray,8400,ARI,SP,PHI,18.6 255 | Aaron Sanchez,9500,TOR,SP,BAL,18.68 256 | Masahiro Tanaka,8300,NYY,SP,MIN,18.79 257 | Michael Fulmer,10600,DET,SP,KCR,19.18 258 | Cole Hamels,8800,TEX,SP,STL,19.35 259 | Joseph Ross,9400,WAS,SP,SDP,19.61 260 | Jon Gray,10100,COL,SP,MIA,20.94 261 | Matt Harvey,10300,NYM,SP,ATL,21.17 262 | Lance McCullers,8900,HOU,SP,CIN,22.19 263 | Chris Archer,8600,TBR,SP,SFG,22.6 264 | Jake Arrieta,12900,CHC,SP,PIT,27.59 265 | Andrelton Simmons,2900,LAA,SS,OAK,4.3 266 | Gregorio Petit,2500,LAA,SS,OAK,4.4 267 | Nick Ahmed,3000,ARI,SS,PHI,4.56 268 | Jordy Mercer,2200,PIT,SS,CHC,4.57 269 | Danny Espinosa,4400,WAS,SS,SDP,4.58 270 | Erick Aybar,2500,ATL,SS,NYM,4.64 271 | Eduardo Escobar,2800,MIN,SS,NYY,4.88 272 | Adeiny Hechavarria,2500,MIA,SS,COL,5.06 273 | Jose Iglesias,3300,DET,SS,KCR,5.15 274 | Alexei Ramirez,2500,SDP,SS,WAS,5.22 275 | Ketel Marte,4000,SEA,SS,BOS,5.41 276 | Timothy Anderson,3700,CHW,SS,CLE,5.46 277 | Freddy Galvis,2600,PHI,SS,ARI,5.52 278 | Didi Gregorius,3400,NYY,SS,MIN,5.58 279 | Marcus Semien,2900,OAK,SS,LAA,5.68 280 | Zack Cozart,3300,CIN,SS,HOU,5.79 281 | Addison Russell,3200,CHC,SS,PIT,5.85 282 | Alcides Escobar,2200,KCR,SS,DET,5.85 283 | Brad Miller,3700,TBR,SS,SFG,5.97 284 | Jhonny Peralta,3800,STL,SS,TEX,6.07 285 | Elvis Andrus,3600,TEX,SS,STL,6.49 286 | Brandon Crawford,3500,SFG,SS,TBR,6.63 287 | Asdrubal Cabrera,3700,NYM,SS,ATL,6.7 288 | Aledmys Diaz,3600,STL,SS,TEX,7.01 289 | Trevor Story,4400,COL,SS,MIA,7.1 290 | Jonathan Villar,3700,MIL,SS,LAD,7.31 291 | Francisco Lindor,4100,CLE,SS,CHW,8 292 | Xander Bogaerts,5300,BOS,SS,SEA,8.53 293 | Corey Seager,4000,LAD,SS,MIL,9.16 294 | Carlos Correa,4200,HOU,SS,CIN,10.07 295 | --------------------------------------------------------------------------------