├── .gitignore ├── README.md ├── libs ├── data.service.js ├── network.service.js ├── predictor.service.js └── stats.service.js ├── package-lock.json ├── package.json ├── server.js ├── talent ├── 2015.json ├── 2016.json └── 2017.json └── teamMappings.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | networks/ 3 | datasets/ 4 | .vscode/ 5 | .eslintrc.json 6 | .env -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # predictor 2 | Application for generating college football score and win probability predictions 3 | 4 | # method 5 | 6 | This application utilizes two different neural networks (NN) generated using the SynapticJS library. The first NN outputs game score predictions. The second NN outputs win probability percentage for the home team 7 | 8 | # data 9 | 10 | The neural networks utilize a variety of play- and drive-based data. Additional data incorporated includes a team's talent level based on recruiting data as well as home-field advantage as well as whether the game takes place at a neutral site and if it is a conference competition. -------------------------------------------------------------------------------- /libs/data.service.js: -------------------------------------------------------------------------------- 1 | module.exports = async(cfb, statsService, fs) => { 2 | const processEvent = (event, stats) => { 3 | let game = event.competitions[0]; 4 | 5 | if (!game.status.type.completed) { 6 | return; 7 | } 8 | 9 | let homeTeam = game.competitors.find(t => t.homeAway == 'home'); 10 | let awayTeam = game.competitors.find(t => t.homeAway == 'away'); 11 | let homeStats = stats.find(t => t.id == homeTeam.id); 12 | let awayStats = stats.find(t => t.id == awayTeam.id); 13 | 14 | if (!homeStats || !awayStats) { 15 | return; 16 | } 17 | 18 | let input = [ 19 | game.neutralSite ? 1 : 0, 20 | game.conferenceCompetition ? 1 : 0, 21 | homeStats.talent, 22 | homeStats.SOS, 23 | homeStats.dRushP, 24 | homeStats.dPPP, 25 | homeStats.dYPP, 26 | homeStats.dYdsAtt, 27 | homeStats.oRushP, 28 | homeStats.oPPP, 29 | homeStats.oYPP, 30 | homeStats.oYdsAtt, 31 | homeStats.oThirdD, 32 | homeStats.dThirdDown, 33 | homeStats.giveaways, 34 | homeStats.takeaways, 35 | homeStats.oRZ, 36 | homeStats.dRZ, 37 | homeStats.oDriveYardsAvg, 38 | homeStats.dDriveYardsAvg, 39 | homeStats.oDrivePlaysAvg, 40 | homeStats.dDrivePlaysAvg, 41 | homeStats.oDriveTimeAvg, 42 | homeStats.dDriveTimeAvg, 43 | awayStats.talent, 44 | awayStats.SOS, 45 | awayStats.dRushP, 46 | awayStats.dPPP, 47 | awayStats.dYPP, 48 | awayStats.dYdsAtt, 49 | awayStats.oRushP, 50 | awayStats.oPPP, 51 | awayStats.oYPP, 52 | awayStats.oYdsAtt, 53 | awayStats.oThirdD, 54 | awayStats.dThirdDown, 55 | awayStats.giveaways, 56 | awayStats.takeaways, 57 | awayStats.oRZ, 58 | awayStats.dRZ, 59 | awayStats.oDriveYardsAvg, 60 | awayStats.dDriveYardsAvg, 61 | awayStats.oDrivePlaysAvg, 62 | awayStats.dDrivePlaysAvg, 63 | awayStats.oDriveTimeAvg, 64 | awayStats.dDriveTimeAvg 65 | ]; 66 | 67 | let output = [ 68 | homeTeam.score / 100.0, 69 | awayTeam.score / 100.0 70 | ]; 71 | 72 | return { 73 | input: input, 74 | output: output 75 | }; 76 | } 77 | 78 | let processYear = async(year) => { 79 | let stats = statsService.getStatsForYear(year); 80 | 81 | const scoreboard = await cfb.scoreboard.getScoreboard({ 82 | year: year 83 | }); 84 | if (!scoreboard || !scoreboard.events) { 85 | return; 86 | } 87 | 88 | const bowlScoreboard = await cfb.scoreboard.getScoreboard({ 89 | year: year, 90 | seasontype: 3, 91 | week: 1 92 | }); 93 | 94 | let events = [ 95 | ...scoreboard.events.filter(e => e.season.year == year) 96 | ]; 97 | 98 | for (let event of bowlScoreboard.events) { 99 | if (!events.find(e => e.id == event.id)) { 100 | events.push(event); 101 | } 102 | } 103 | 104 | statsService.processSOS(stats, events); 105 | 106 | return events.map(event => { 107 | return processEvent(event, stats); 108 | }).filter(e => e); 109 | } 110 | 111 | let generateTraningData = async() => { 112 | const dataset = [ 113 | ...(await processYear(2015)), 114 | ...(await processYear(2016)) 115 | ]; 116 | await fs.appendFile('./dataset.json', JSON.stringify(dataset, null, '\t')); 117 | 118 | const testData = await processYear(2017); 119 | await fs.appendFile('./testData.json', JSON.stringify(testData, null, '\t')); 120 | } 121 | 122 | return { 123 | generateTraningData: generateTraningData 124 | } 125 | } -------------------------------------------------------------------------------- /libs/network.service.js: -------------------------------------------------------------------------------- 1 | module.exports = (fs) => { 2 | const synaptic = require('synaptic'); 3 | const Architect = synaptic.Architect; 4 | 5 | const networkPath = process.env.NETWORK; 6 | const networkPathProb = process.env.NETWORK_PROB; 7 | 8 | const retrieveNetwork = () => { 9 | let network = require(networkPath); 10 | let myNetwork = Architect.Perceptron.fromJSON(network); 11 | 12 | return myNetwork; 13 | } 14 | 15 | const retrieveProbNetwork = () => { 16 | const network = require(networkPathProb); 17 | const myNetwork = Architect.Perceptron.fromJSON(network); 18 | 19 | return myNetwork; 20 | } 21 | 22 | return { 23 | retrieveNetwork: retrieveNetwork, 24 | retrieveProbNetwork: retrieveProbNetwork, 25 | } 26 | } -------------------------------------------------------------------------------- /libs/predictor.service.js: -------------------------------------------------------------------------------- 1 | module.exports = async(fs, statsService, networkService, cfb) => { 2 | const csvPath = process.env.CSV_PATH; 3 | const recordsPath = process.env.RECORDS_PATH; 4 | const rankingsPath = process.env.RANKINGS_PATH; 5 | const playoffPath = process.env.PLAYOFFS_PATH; 6 | 7 | const myNetwork = networkService.retrieveNetwork(); 8 | const probNetwork = networkService.retrieveProbNetwork(); 9 | 10 | const stats = statsService.getStatsForYear(2017); 11 | const scoreboard = await cfb.scoreboard.getScoreboard({ 12 | year: 2017 13 | }); 14 | 15 | const bowlScoreboard = await cfb.scoreboard.getScoreboard({ 16 | year: 2017, 17 | seasontype: 3, 18 | week: 1 19 | }); 20 | 21 | const events = [ 22 | ...scoreboard.events.filter(e => e.season.year == 2017) 23 | ]; 24 | 25 | for (let event of bowlScoreboard.events){ 26 | if (!events.find(e => e.id == event.id)){ 27 | events.push(event); 28 | } 29 | } 30 | 31 | await statsService.processSOS(stats, events); 32 | 33 | const projectGame = (network, homeTeam, awayTeam, neutralSite = 1, conferenceCompetition = 0) => { 34 | let homeStats = stats.find(t => t.id == homeTeam.id); 35 | let awayStats = stats.find(t => t.id == awayTeam.id); 36 | 37 | if (!homeStats || !awayStats) { 38 | return; 39 | } 40 | 41 | let input = [ 42 | neutralSite, 43 | conferenceCompetition, 44 | homeStats.talent, 45 | homeStats.SOS, 46 | homeStats.dRushP, 47 | homeStats.dPPP, 48 | homeStats.dYPP, 49 | homeStats.dYdsAtt, 50 | homeStats.oRushP, 51 | homeStats.oPPP, 52 | homeStats.oYPP, 53 | homeStats.oYdsAtt, 54 | homeStats.oThirdD, 55 | homeStats.dThirdDown, 56 | homeStats.giveaways, 57 | homeStats.takeaways, 58 | homeStats.oRZ, 59 | homeStats.dRZ, 60 | homeStats.oDriveYardsAvg, 61 | homeStats.dDriveYardsAvg, 62 | homeStats.oDrivePlaysAvg, 63 | homeStats.dDrivePlaysAvg, 64 | homeStats.oDriveTimeAvg, 65 | homeStats.dDriveTimeAvg, 66 | awayStats.talent, 67 | awayStats.SOS, 68 | awayStats.dRushP, 69 | awayStats.dPPP, 70 | awayStats.dYPP, 71 | awayStats.dYdsAtt, 72 | awayStats.oRushP, 73 | awayStats.oPPP, 74 | awayStats.oYPP, 75 | awayStats.oYdsAtt, 76 | awayStats.oThirdD, 77 | awayStats.dThirdDown, 78 | awayStats.giveaways, 79 | awayStats.takeaways, 80 | awayStats.oRZ, 81 | awayStats.dRZ, 82 | awayStats.oDriveYardsAvg, 83 | awayStats.dDriveYardsAvg, 84 | awayStats.oDrivePlaysAvg, 85 | awayStats.dDrivePlaysAvg, 86 | awayStats.oDriveTimeAvg, 87 | awayStats.dDriveTimeAvg 88 | ]; 89 | 90 | let result = network.activate(input); 91 | 92 | return { 93 | homeTeam: homeTeam, 94 | projection: result, 95 | awayTeam: awayTeam 96 | } 97 | } 98 | 99 | let rankTeams = () => { 100 | let ranks = []; 101 | 102 | for (let team of stats) { 103 | let wins = 0; 104 | let totalMargin = 0; 105 | 106 | let others = stats.filter((t) => { 107 | return t.id != team.id; 108 | }); 109 | 110 | for (let other of others) { 111 | let result = projectGame(myNetwork, { 112 | id: team.id 113 | }, { 114 | id: other.id 115 | }, 0, 1); 116 | 117 | if (!result) { 118 | result; 119 | } 120 | 121 | if (result.projection[0] > result.projection[1]) { 122 | wins++; 123 | } 124 | 125 | totalMargin += (result.projection[0] - result.projection[1]); 126 | } 127 | 128 | ranks.push({ 129 | id: team.id, 130 | location: team.location, 131 | wins: wins, 132 | averageMargin: (totalMargin / others.length) 133 | }); 134 | } 135 | 136 | return ranks; 137 | } 138 | 139 | let simulatePlayoff = () => { 140 | let sorted = stats.sort((a, b) => { 141 | return b.talent - a.talent; 142 | }).slice(); 143 | 144 | sorted.pop(); 145 | sorted.pop(); 146 | sorted.pop(); 147 | 148 | for (let stat of stats) { 149 | stat.playoffHistory = ''; 150 | } 151 | 152 | let results = []; 153 | 154 | simulateRound(sorted, results, 1); 155 | 156 | for (let stat of stats) { 157 | fs.appendFile(rankingsPath, `\r\n${stat.playoffHistory},${stat.location}`); 158 | } 159 | 160 | for (let result of results) { 161 | fs.appendFile(playoffPath, `\r\n${result.round},${result.homeId},${result.homeLocation},${result.homeScore},${result.awayId},${result.awayLocation},${result.awayScore}`); 162 | } 163 | } 164 | 165 | let simulateRound = (teams, results, round) => { 166 | if (teams.length == 1) { 167 | return; 168 | } 169 | 170 | let winners = []; 171 | let losers = []; 172 | 173 | let numGames = teams.length / 2; 174 | 175 | let topTier = teams.splice(0, numGames); 176 | 177 | for (var i = 0; i < numGames; i++) { 178 | let topTeam = topTier[i]; 179 | let bottomTeam = teams[numGames - (i + 1)]; 180 | 181 | let topStat = stats.find(t => t.id == topTeam.id); 182 | let bottomStat = stats.find(t => t.id == bottomTeam.id); 183 | 184 | let result = projectGame(myNetwork, { 185 | id: topTeam.id 186 | }, { 187 | id: bottomTeam.id 188 | }, 0, 1); 189 | 190 | if (result.projection[0] > result.projection[1]) { 191 | topStat.playoffHistory += '1'; 192 | bottomStat.playoffHistory += '0'; 193 | winners.push(topTeam); 194 | losers.push(bottomTeam); 195 | } else { 196 | topStat.playoffHistory += '0'; 197 | bottomStat.playoffHistory += '1'; 198 | winners.push(bottomTeam); 199 | losers.push(topTeam); 200 | } 201 | 202 | results.push({ 203 | round: round, 204 | homeId: topTeam.id, 205 | homeLocation: topTeam.location, 206 | homeScore: result.projection[0], 207 | awayId: bottomTeam.id, 208 | awayLocation: bottomTeam.location, 209 | awayScore: result.projection[1] 210 | }); 211 | } 212 | 213 | let newRound = round + 1; 214 | 215 | simulateRound(winners, results, newRound); 216 | simulateRound(losers, results, newRound); 217 | } 218 | 219 | let getGamePrediction = (network, event) => { 220 | let game = event.competitions[0]; 221 | let homeTeam = game.competitors.find(t => t.homeAway == 'home'); 222 | let awayTeam = game.competitors.find(t => t.homeAway == 'away'); 223 | let homeStats = stats.find(t => t.id == homeTeam.id); 224 | let awayStats = stats.find(t => t.id == awayTeam.id); 225 | 226 | if (!homeStats || !awayStats) { 227 | return; 228 | } 229 | 230 | let input = [ 231 | game.neutralSite ? 1 : 0, 232 | game.conferenceCompetition ? 1 : 0, 233 | homeStats.talent, 234 | homeStats.SOS, 235 | homeStats.dRushP, 236 | homeStats.dPPP, 237 | homeStats.dYPP, 238 | homeStats.dYdsAtt, 239 | homeStats.oRushP, 240 | homeStats.oPPP, 241 | homeStats.oYPP, 242 | homeStats.oYdsAtt, 243 | homeStats.oThirdD, 244 | homeStats.dThirdDown, 245 | homeStats.giveaways, 246 | homeStats.takeaways, 247 | homeStats.oRZ, 248 | homeStats.dRZ, 249 | homeStats.oDriveYardsAvg, 250 | homeStats.dDriveYardsAvg, 251 | homeStats.oDrivePlaysAvg, 252 | homeStats.dDrivePlaysAvg, 253 | homeStats.oDriveTimeAvg, 254 | homeStats.dDriveTimeAvg, 255 | awayStats.talent, 256 | awayStats.SOS, 257 | awayStats.dRushP, 258 | awayStats.dPPP, 259 | awayStats.dYPP, 260 | awayStats.dYdsAtt, 261 | awayStats.oRushP, 262 | awayStats.oPPP, 263 | awayStats.oYPP, 264 | awayStats.oYdsAtt, 265 | awayStats.oThirdD, 266 | awayStats.dThirdDown, 267 | awayStats.giveaways, 268 | awayStats.takeaways, 269 | awayStats.oRZ, 270 | awayStats.dRZ, 271 | awayStats.oDriveYardsAvg, 272 | awayStats.dDriveYardsAvg, 273 | awayStats.oDrivePlaysAvg, 274 | awayStats.dDrivePlaysAvg, 275 | awayStats.oDriveTimeAvg, 276 | awayStats.dDriveTimeAvg 277 | ]; 278 | 279 | let result = network.activate(input); 280 | 281 | return { 282 | id: event.id, 283 | date: game.date, 284 | homeTeam: homeTeam, 285 | awayTeam: awayTeam, 286 | projection: result 287 | } 288 | } 289 | 290 | let writeGamePrediction = (event) => { 291 | let result = getGamePrediction(myNetwork, event); 292 | let probResult = getGamePrediction(probNetwork, event); 293 | 294 | if (!result) { 295 | return; 296 | } 297 | 298 | if (!event.competitions[0].status.type.completed && event.competitions[0].status.type.id != 5 && event.competitions[0].status.type.id != 6) { 299 | let margin = result.projection[0] - result.projection[1]; 300 | let game = event.competitions[0]; 301 | 302 | let homeTeam = game.competitors.find(t => t.homeAway == 'home'); 303 | let awayTeam = game.competitors.find(t => t.homeAway == 'away'); 304 | let homeStats = stats.find(t => t.id == homeTeam.id); 305 | let awayStats = stats.find(t => t.id == awayTeam.id); 306 | 307 | if (margin > 0) { 308 | homeStats.record.wins++; 309 | awayStats.record.losses++; 310 | 311 | if (game.conferenceCompetition) { 312 | homeStats.conferenceRecord.wins++; 313 | awayStats.conferenceRecord.losses++ 314 | } 315 | } else { 316 | homeStats.record.losses++; 317 | awayStats.record.wins++; 318 | 319 | if (game.conferenceCompetition) { 320 | homeStats.conferenceRecord.losses++; 321 | awayStats.conferenceRecord.wins++ 322 | } 323 | } 324 | 325 | homeStats.record.winsProb += probResult.projection[0]; 326 | homeStats.record.lossesProb += (1 - probResult.projection[0]); 327 | awayStats.record.winsProb += (1 - probResult.projection[0]); 328 | awayStats.record.lossesProb += probResult.projection[0]; 329 | 330 | if (game.conferenceCompetition) { 331 | homeStats.conferenceRecord.winsProb += probResult.projection[0]; 332 | homeStats.conferenceRecord.lossesProb += (1 - probResult.projection[0]); 333 | awayStats.conferenceRecord.winsProb += (1 - probResult.projection[0]); 334 | awayStats.conferenceRecord.lossesProb += probResult.projection[0]; 335 | } 336 | } 337 | 338 | fs.appendFile(csvPath, `\r\n${result.id},${result.date},${result.homeTeam.team.location},${Math.round(result.projection[0] * 1000)/10},${result.homeTeam.score},${result.awayTeam.team.location},${Math.round(result.projection[1] * 1000)/10},${result.awayTeam.score},${probResult.projection[0]}`); 339 | } 340 | 341 | let updatePredictions = async() => { 342 | const scoreboard = await cfb.scoreboard.getScoreboard({ 343 | year: 2017 344 | }); 345 | 346 | const bowlScoreboard = await cfb.scoreboard.getScoreboard({ 347 | year: 2017, 348 | seasontype: 3, 349 | week: 1 350 | }); 351 | 352 | const events = [ 353 | ...scoreboard.events.filter(e => e.season.year == 2017) 354 | ]; 355 | 356 | for (let event of bowlScoreboard.events){ 357 | if (!events.find(e => e.id == event.id)){ 358 | events.push(event); 359 | } 360 | } 361 | 362 | statsService.processSOS(stats, events); 363 | 364 | for (let event of events) { 365 | writeGamePrediction(event); 366 | } 367 | 368 | for (let stat of stats) { 369 | fs.appendFile(recordsPath, `\r\n${stat.id},${stat.location},${stat.record.wins},${stat.record.losses},${stat.conferenceRecord == null ? 0 : stat.conferenceRecord.wins},${stat.conferenceRecord == null ? 0 : stat.conferenceRecord.losses},${stat.record.winsProb},${stat.record.lossesProb},${stat.conferenceRecord == null ? 0 : stat.conferenceRecord.winsProb},${stat.conferenceRecord == null ? 0 : stat.conferenceRecord.lossesProb}`); 370 | } 371 | } 372 | 373 | return { 374 | getGamePrediction: getGamePrediction, 375 | updatePredictions: updatePredictions, 376 | projectGame: projectGame, 377 | rankTeams: rankTeams, 378 | simulatePlayoff: simulatePlayoff, 379 | stats: stats 380 | } 381 | } -------------------------------------------------------------------------------- /libs/stats.service.js: -------------------------------------------------------------------------------- 1 | module.exports = (fs, csvjson) => { 2 | const statsPath = process.env.STATS_PATH; 3 | const mappings = require('../teamMappings'); 4 | 5 | const readData = (year, type) => { 6 | let data = fs.readFileSync(`${statsPath}\\${year}\\Team\\${type}.csv`, { 7 | encoding: 'utf8' 8 | }); 9 | return csvjson.toObject(data, { 10 | quote: '"' 11 | }); 12 | } 13 | 14 | const getStatsForYear = (year) => { 15 | const rushingOffense = readData(year, 'Rushing Offense'); 16 | const rushingDefense = readData(year, 'Rushing Defense'); 17 | const scoringOffense = readData(year, 'Scoring Offense'); 18 | const scoringDefense = readData(year, 'Scoring Defense'); 19 | const totalOffense = readData(year, 'Total Offense'); 20 | const totalDefense = readData(year, 'Total Defense'); 21 | const passingOffense = readData(year, 'Passing Offense'); 22 | const passingDefense = readData(year, 'Passing Yards Allowed'); 23 | const thirdDownOffense = readData(year, '3rd Down Conversion Pct'); 24 | const thirdDownDefense = readData(year, '3rd Down Conversion Pct Defense'); 25 | const toOffense = readData(year, 'Turnovers Lost'); 26 | const toDefense = readData(year, 'Turnovers Gained'); 27 | const redzoneO = readData(year, 'Red Zone Offense'); 28 | const redzoneD = readData(year, 'Red Zone Defense'); 29 | const driveOffense = readData(year, 'drive_offense'); 30 | const driveDefense = readData(year, 'drive_defense'); 31 | const talent = require(`../talent/${year}`); 32 | 33 | let teamStats = []; 34 | 35 | for (let oRushing of rushingOffense) { 36 | let mapMatch = mappings.find(t => oRushing.Team == t.location || oRushing.Team == t.ncaaName || oRushing.Team == t.abbreviation || oRushing.Team == t.altName); 37 | 38 | if (!mapMatch) { 39 | console.log(oRushing.Team); 40 | continue; 41 | } 42 | 43 | let findTeam = t => t.Team == mapMatch.location || t.Team == mapMatch.ncaaName || t.Team == mapMatch.abbreviation || t.Team == mapMatch.altName; 44 | 45 | let dRushing = rushingDefense.find(findTeam); 46 | let oScoring = scoringOffense.find(findTeam); 47 | let dScoring = scoringDefense.find(findTeam); 48 | let oTotal = totalOffense.find(findTeam); 49 | let dTotal = totalDefense.find(findTeam); 50 | let oPassing = passingOffense.find(findTeam); 51 | let dPassing = passingDefense.find(findTeam); 52 | let oThirdDown = thirdDownOffense.find(findTeam); 53 | let dThirdDown = thirdDownDefense.find(findTeam); 54 | let giveaways = toOffense.find(findTeam); 55 | let takeaways = toDefense.find(findTeam); 56 | let oRedZone = redzoneO.find(findTeam); 57 | let dRedZone = redzoneD.find(findTeam); 58 | let oDrive = driveOffense.find(t => t.id == mapMatch.id); 59 | let dDrive = driveDefense.find(t => t.id == mapMatch.id); 60 | let teamTalent = talent.find(t => { 61 | return t.name == mapMatch.location || t.name == mapMatch.ncaaName || t.name == mapMatch.abbreviation || t.name == mapMatch.altName; 62 | }); 63 | 64 | if (!dRushing || 65 | !oScoring || 66 | !dScoring || 67 | !oTotal || 68 | !dTotal || 69 | !oPassing || 70 | !dPassing || 71 | !oThirdDown || 72 | !dThirdDown || 73 | !giveaways || 74 | !takeaways || 75 | !redzoneO || 76 | !redzoneD || 77 | !oDrive || 78 | ! dDrive || 79 | !teamTalent) { 80 | continue; 81 | } 82 | 83 | teamStats.push({ 84 | id: mapMatch.id, 85 | location: mapMatch.location, 86 | talent: teamTalent.talent / 1000, 87 | oRushP: oRushing['Yds/Rush'] / 10, 88 | dRushP: dRushing['Yds/Rush'] / 10, 89 | oPPP: parseFloat(oScoring.Pts.replace(/,/g, '')) / parseFloat(oTotal.Plays.replace(/,/g, '')), 90 | dPPP: parseFloat(dScoring.Pts.replace(/,/g, '')) / parseFloat(dTotal.Plays.replace(/,/g, '')), 91 | oYPP: oTotal['Yds/Play'] / 10, 92 | dYPP: dTotal['Yds/Play'] / 10, 93 | oYdsAtt: oPassing['Yds/Att'] / 20, 94 | dYdsAtt: dPassing['Yds/Att'] / 20, 95 | oThirdD: oThirdDown.Pct * 1.0, 96 | dThirdDown: dThirdDown.Pct * 1.0, 97 | giveaways: (giveaways['Turn Lost'] / giveaways.G) / 5, 98 | takeaways: (takeaways['Turn Gain'] / takeaways.G) / 5, 99 | oRZ: oRedZone.Pct * 1.0, 100 | dRZ: dRedZone.Pct * 1.0, 101 | oDriveYardsAvg: oDrive.avgYards / 100, 102 | dDriveYardsAvg: dDrive.avgYards / 100, 103 | oDrivePlaysAvg: oDrive.avgPlays / 10, 104 | dDrivePlaysAvg: dDrive.avgPlays / 10, 105 | oDriveTimeAvg: oDrive.avgSeconds / 240, 106 | dDriveTimeAvg: dDrive.avgSeconds / 240 107 | }); 108 | } 109 | 110 | return teamStats; 111 | } 112 | 113 | let processSOS = (stats, events) => { 114 | for (let stat of stats) { 115 | stat.record = {}; 116 | stat.conferenceRecord = {}; 117 | 118 | let teamEvents = events.filter((event) => { 119 | let game = event.competitions[0]; 120 | let team = game.competitors.find(t => { 121 | return t.id == stat.id; 122 | }) 123 | 124 | return team && game.status.type.completed; 125 | }); 126 | 127 | let talent = 0; 128 | 129 | for (let event of teamEvents) { 130 | let otherTeam = event.competitions[0].competitors.find(t => { 131 | return t.id != stat.id; 132 | }); 133 | 134 | let otherTeamStats = stats.find(t => { 135 | return t.id == otherTeam.id; 136 | }); 137 | 138 | if (!otherTeamStats) { 139 | continue; 140 | } 141 | 142 | talent += otherTeamStats.talent; 143 | } 144 | 145 | let orderedEvents = teamEvents.sort((a, b) => { 146 | return new Date(a.date) < new Date(b.date) ? 1 : 0; 147 | }); 148 | 149 | let last = orderedEvents[0].competitions[0]; 150 | let teamRecords = last.competitors.find(t => { 151 | return t.id == stat.id; 152 | }).records; 153 | 154 | let totalRecord = teamRecords.find(r => { 155 | return r.type == 'total'; 156 | }); 157 | 158 | stat.record.wins = totalRecord.summary.split('-')[0] * 1.0; 159 | stat.record.losses = totalRecord.summary.split('-')[1] * 1.0; 160 | stat.record.winsProb = totalRecord.summary.split('-')[0] * 1.0; 161 | stat.record.lossesProb = totalRecord.summary.split('-')[1] * 1.0; 162 | 163 | let conferenceRecord = teamRecords.find(r => { 164 | return r.type == 'vsconf'; 165 | }); 166 | 167 | if (conferenceRecord && conferenceRecord.summary) { 168 | stat.conferenceRecord.wins = conferenceRecord.summary.split('-')[0] * 1.0; 169 | stat.conferenceRecord.losses = conferenceRecord.summary.split('-')[1] * 1.0; 170 | stat.conferenceRecord.winsProb = conferenceRecord.summary.split('-')[0] * 1.0; 171 | stat.conferenceRecord.lossesProb = conferenceRecord.summary.split('-')[1] * 1.0; 172 | } 173 | 174 | stat.SOS = talent / teamEvents.length; 175 | } 176 | } 177 | 178 | return { 179 | getStatsForYear: getStatsForYear, 180 | processSOS: processSOS 181 | } 182 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "predictor", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/node": { 8 | "version": "6.0.88", 9 | "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.88.tgz", 10 | "integrity": "sha512-bYDPZTX0/s1aihdjLuAgogUAT5M+TpoWChEMea2p0yOcfn5bu3k6cJb9cp6nw268XeSNIGGr+4+/8V5K6BGzLQ==" 11 | }, 12 | "ajv": { 13 | "version": "5.2.2", 14 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", 15 | "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", 16 | "requires": { 17 | "co": "4.6.0", 18 | "fast-deep-equal": "1.0.0", 19 | "json-schema-traverse": "0.3.1", 20 | "json-stable-stringify": "1.0.1" 21 | } 22 | }, 23 | "asn1": { 24 | "version": "0.2.3", 25 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 26 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" 27 | }, 28 | "assert-plus": { 29 | "version": "1.0.0", 30 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 31 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 32 | }, 33 | "asynckit": { 34 | "version": "0.4.0", 35 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 36 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 37 | }, 38 | "aws-sign2": { 39 | "version": "0.7.0", 40 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 41 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 42 | }, 43 | "aws4": { 44 | "version": "1.6.0", 45 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", 46 | "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" 47 | }, 48 | "bcrypt-pbkdf": { 49 | "version": "1.0.1", 50 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", 51 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", 52 | "optional": true, 53 | "requires": { 54 | "tweetnacl": "0.14.5" 55 | } 56 | }, 57 | "bluebird": { 58 | "version": "3.5.0", 59 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", 60 | "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" 61 | }, 62 | "boolbase": { 63 | "version": "1.0.0", 64 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 65 | "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" 66 | }, 67 | "boom": { 68 | "version": "4.3.1", 69 | "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", 70 | "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", 71 | "requires": { 72 | "hoek": "4.2.0" 73 | } 74 | }, 75 | "caseless": { 76 | "version": "0.12.0", 77 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 78 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 79 | }, 80 | "cfb-data": { 81 | "version": "2.2.1", 82 | "resolved": "https://registry.npmjs.org/cfb-data/-/cfb-data-2.2.1.tgz", 83 | "integrity": "sha512-9Bwu2XfrGax+7UEN1o1OF7WiGl9LF18MnK+iB0TJvbhF1JCIE+grpTxjZZBLVne8grK2qWlu3DRZBeoWcjGdtA==", 84 | "requires": { 85 | "cheerio": "1.0.0-rc.2", 86 | "request": "2.82.0", 87 | "request-promise": "4.2.1" 88 | } 89 | }, 90 | "cheerio": { 91 | "version": "1.0.0-rc.2", 92 | "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", 93 | "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", 94 | "requires": { 95 | "css-select": "1.2.0", 96 | "dom-serializer": "0.1.0", 97 | "entities": "1.1.1", 98 | "htmlparser2": "3.9.2", 99 | "lodash": "4.17.4", 100 | "parse5": "3.0.2" 101 | } 102 | }, 103 | "co": { 104 | "version": "4.6.0", 105 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 106 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 107 | }, 108 | "combined-stream": { 109 | "version": "1.0.5", 110 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", 111 | "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", 112 | "requires": { 113 | "delayed-stream": "1.0.0" 114 | } 115 | }, 116 | "core-util-is": { 117 | "version": "1.0.2", 118 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 119 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 120 | }, 121 | "cryptiles": { 122 | "version": "3.1.2", 123 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", 124 | "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", 125 | "requires": { 126 | "boom": "5.2.0" 127 | }, 128 | "dependencies": { 129 | "boom": { 130 | "version": "5.2.0", 131 | "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", 132 | "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", 133 | "requires": { 134 | "hoek": "4.2.0" 135 | } 136 | } 137 | } 138 | }, 139 | "css-select": { 140 | "version": "1.2.0", 141 | "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", 142 | "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", 143 | "requires": { 144 | "boolbase": "1.0.0", 145 | "css-what": "2.1.0", 146 | "domutils": "1.5.1", 147 | "nth-check": "1.0.1" 148 | } 149 | }, 150 | "css-what": { 151 | "version": "2.1.0", 152 | "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", 153 | "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=" 154 | }, 155 | "csvjson": { 156 | "version": "4.3.4", 157 | "resolved": "https://registry.npmjs.org/csvjson/-/csvjson-4.3.4.tgz", 158 | "integrity": "sha1-3Ew3XAJGIctuMVcsElQAm0CpOaM=" 159 | }, 160 | "dashdash": { 161 | "version": "1.14.1", 162 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 163 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 164 | "requires": { 165 | "assert-plus": "1.0.0" 166 | } 167 | }, 168 | "delayed-stream": { 169 | "version": "1.0.0", 170 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 171 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 172 | }, 173 | "dom-serializer": { 174 | "version": "0.1.0", 175 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", 176 | "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", 177 | "requires": { 178 | "domelementtype": "1.1.3", 179 | "entities": "1.1.1" 180 | }, 181 | "dependencies": { 182 | "domelementtype": { 183 | "version": "1.1.3", 184 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", 185 | "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" 186 | } 187 | } 188 | }, 189 | "domelementtype": { 190 | "version": "1.3.0", 191 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", 192 | "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" 193 | }, 194 | "domhandler": { 195 | "version": "2.4.1", 196 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", 197 | "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", 198 | "requires": { 199 | "domelementtype": "1.3.0" 200 | } 201 | }, 202 | "domutils": { 203 | "version": "1.5.1", 204 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", 205 | "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", 206 | "requires": { 207 | "dom-serializer": "0.1.0", 208 | "domelementtype": "1.3.0" 209 | } 210 | }, 211 | "dotenv": { 212 | "version": "4.0.0", 213 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", 214 | "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=" 215 | }, 216 | "ecc-jsbn": { 217 | "version": "0.1.1", 218 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 219 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", 220 | "optional": true, 221 | "requires": { 222 | "jsbn": "0.1.1" 223 | } 224 | }, 225 | "entities": { 226 | "version": "1.1.1", 227 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", 228 | "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" 229 | }, 230 | "extend": { 231 | "version": "3.0.1", 232 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", 233 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" 234 | }, 235 | "extsprintf": { 236 | "version": "1.3.0", 237 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 238 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 239 | }, 240 | "fast-deep-equal": { 241 | "version": "1.0.0", 242 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", 243 | "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" 244 | }, 245 | "forever-agent": { 246 | "version": "0.6.1", 247 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 248 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 249 | }, 250 | "form-data": { 251 | "version": "2.3.1", 252 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", 253 | "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", 254 | "requires": { 255 | "asynckit": "0.4.0", 256 | "combined-stream": "1.0.5", 257 | "mime-types": "2.1.17" 258 | } 259 | }, 260 | "getpass": { 261 | "version": "0.1.7", 262 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 263 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 264 | "requires": { 265 | "assert-plus": "1.0.0" 266 | } 267 | }, 268 | "har-schema": { 269 | "version": "2.0.0", 270 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 271 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 272 | }, 273 | "har-validator": { 274 | "version": "5.0.3", 275 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", 276 | "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", 277 | "requires": { 278 | "ajv": "5.2.2", 279 | "har-schema": "2.0.0" 280 | } 281 | }, 282 | "hawk": { 283 | "version": "6.0.2", 284 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", 285 | "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", 286 | "requires": { 287 | "boom": "4.3.1", 288 | "cryptiles": "3.1.2", 289 | "hoek": "4.2.0", 290 | "sntp": "2.0.2" 291 | } 292 | }, 293 | "hoek": { 294 | "version": "4.2.0", 295 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", 296 | "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" 297 | }, 298 | "htmlparser2": { 299 | "version": "3.9.2", 300 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", 301 | "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", 302 | "requires": { 303 | "domelementtype": "1.3.0", 304 | "domhandler": "2.4.1", 305 | "domutils": "1.5.1", 306 | "entities": "1.1.1", 307 | "inherits": "2.0.3", 308 | "readable-stream": "2.3.3" 309 | } 310 | }, 311 | "http-signature": { 312 | "version": "1.2.0", 313 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 314 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 315 | "requires": { 316 | "assert-plus": "1.0.0", 317 | "jsprim": "1.4.1", 318 | "sshpk": "1.13.1" 319 | } 320 | }, 321 | "inherits": { 322 | "version": "2.0.3", 323 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 324 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 325 | }, 326 | "is-typedarray": { 327 | "version": "1.0.0", 328 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 329 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 330 | }, 331 | "isarray": { 332 | "version": "1.0.0", 333 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 334 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 335 | }, 336 | "isstream": { 337 | "version": "0.1.2", 338 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 339 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 340 | }, 341 | "jsbn": { 342 | "version": "0.1.1", 343 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 344 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 345 | "optional": true 346 | }, 347 | "json-schema": { 348 | "version": "0.2.3", 349 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 350 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 351 | }, 352 | "json-schema-traverse": { 353 | "version": "0.3.1", 354 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 355 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" 356 | }, 357 | "json-stable-stringify": { 358 | "version": "1.0.1", 359 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 360 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 361 | "requires": { 362 | "jsonify": "0.0.0" 363 | } 364 | }, 365 | "json-stringify-safe": { 366 | "version": "5.0.1", 367 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 368 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 369 | }, 370 | "jsonify": { 371 | "version": "0.0.0", 372 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 373 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" 374 | }, 375 | "jsprim": { 376 | "version": "1.4.1", 377 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 378 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 379 | "requires": { 380 | "assert-plus": "1.0.0", 381 | "extsprintf": "1.3.0", 382 | "json-schema": "0.2.3", 383 | "verror": "1.10.0" 384 | } 385 | }, 386 | "lodash": { 387 | "version": "4.17.4", 388 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 389 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" 390 | }, 391 | "mime-db": { 392 | "version": "1.30.0", 393 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", 394 | "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" 395 | }, 396 | "mime-types": { 397 | "version": "2.1.17", 398 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", 399 | "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", 400 | "requires": { 401 | "mime-db": "1.30.0" 402 | } 403 | }, 404 | "nth-check": { 405 | "version": "1.0.1", 406 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", 407 | "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", 408 | "requires": { 409 | "boolbase": "1.0.0" 410 | } 411 | }, 412 | "oauth-sign": { 413 | "version": "0.8.2", 414 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 415 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" 416 | }, 417 | "parse5": { 418 | "version": "3.0.2", 419 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.2.tgz", 420 | "integrity": "sha1-Be/1fw70V3+xRKefi5qWemzERRA=", 421 | "requires": { 422 | "@types/node": "6.0.88" 423 | } 424 | }, 425 | "performance-now": { 426 | "version": "2.1.0", 427 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 428 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 429 | }, 430 | "process-nextick-args": { 431 | "version": "1.0.7", 432 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 433 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" 434 | }, 435 | "punycode": { 436 | "version": "1.4.1", 437 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 438 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 439 | }, 440 | "qs": { 441 | "version": "6.5.1", 442 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", 443 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" 444 | }, 445 | "readable-stream": { 446 | "version": "2.3.3", 447 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 448 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 449 | "requires": { 450 | "core-util-is": "1.0.2", 451 | "inherits": "2.0.3", 452 | "isarray": "1.0.0", 453 | "process-nextick-args": "1.0.7", 454 | "safe-buffer": "5.1.1", 455 | "string_decoder": "1.0.3", 456 | "util-deprecate": "1.0.2" 457 | } 458 | }, 459 | "request": { 460 | "version": "2.82.0", 461 | "resolved": "https://registry.npmjs.org/request/-/request-2.82.0.tgz", 462 | "integrity": "sha512-/QWqfmyTfQ4OYs6EhB1h2wQsX9ZxbuNePCvCm0Mdz/mxw73mjdg0D4QdIl0TQBFs35CZmMXLjk0iCGK395CUDg==", 463 | "requires": { 464 | "aws-sign2": "0.7.0", 465 | "aws4": "1.6.0", 466 | "caseless": "0.12.0", 467 | "combined-stream": "1.0.5", 468 | "extend": "3.0.1", 469 | "forever-agent": "0.6.1", 470 | "form-data": "2.3.1", 471 | "har-validator": "5.0.3", 472 | "hawk": "6.0.2", 473 | "http-signature": "1.2.0", 474 | "is-typedarray": "1.0.0", 475 | "isstream": "0.1.2", 476 | "json-stringify-safe": "5.0.1", 477 | "mime-types": "2.1.17", 478 | "oauth-sign": "0.8.2", 479 | "performance-now": "2.1.0", 480 | "qs": "6.5.1", 481 | "safe-buffer": "5.1.1", 482 | "stringstream": "0.0.5", 483 | "tough-cookie": "2.3.2", 484 | "tunnel-agent": "0.6.0", 485 | "uuid": "3.1.0" 486 | } 487 | }, 488 | "request-promise": { 489 | "version": "4.2.1", 490 | "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.1.tgz", 491 | "integrity": "sha1-fuxWyJMXqCLL/qmbA5zlQ8LhX2c=", 492 | "requires": { 493 | "bluebird": "3.5.0", 494 | "request-promise-core": "1.1.1", 495 | "stealthy-require": "1.1.1", 496 | "tough-cookie": "2.3.2" 497 | } 498 | }, 499 | "request-promise-core": { 500 | "version": "1.1.1", 501 | "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", 502 | "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", 503 | "requires": { 504 | "lodash": "4.17.4" 505 | } 506 | }, 507 | "safe-buffer": { 508 | "version": "5.1.1", 509 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 510 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 511 | }, 512 | "sntp": { 513 | "version": "2.0.2", 514 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.0.2.tgz", 515 | "integrity": "sha1-UGQRDwr4X3z9t9a2ekACjOUrSys=", 516 | "requires": { 517 | "hoek": "4.2.0" 518 | } 519 | }, 520 | "sshpk": { 521 | "version": "1.13.1", 522 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", 523 | "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", 524 | "requires": { 525 | "asn1": "0.2.3", 526 | "assert-plus": "1.0.0", 527 | "bcrypt-pbkdf": "1.0.1", 528 | "dashdash": "1.14.1", 529 | "ecc-jsbn": "0.1.1", 530 | "getpass": "0.1.7", 531 | "jsbn": "0.1.1", 532 | "tweetnacl": "0.14.5" 533 | } 534 | }, 535 | "stealthy-require": { 536 | "version": "1.1.1", 537 | "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", 538 | "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" 539 | }, 540 | "string_decoder": { 541 | "version": "1.0.3", 542 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 543 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 544 | "requires": { 545 | "safe-buffer": "5.1.1" 546 | } 547 | }, 548 | "stringstream": { 549 | "version": "0.0.5", 550 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", 551 | "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" 552 | }, 553 | "synaptic": { 554 | "version": "1.1.2", 555 | "resolved": "https://registry.npmjs.org/synaptic/-/synaptic-1.1.2.tgz", 556 | "integrity": "sha512-+xdm8LPFFt4wa8mwT66qZdeEiYhSO3hwOmVYu5SsRaIqPjtXuM58JbR48UlI0hFGNURMZvGs0owz86W95zcGVA==" 557 | }, 558 | "tough-cookie": { 559 | "version": "2.3.2", 560 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", 561 | "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", 562 | "requires": { 563 | "punycode": "1.4.1" 564 | } 565 | }, 566 | "tunnel-agent": { 567 | "version": "0.6.0", 568 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 569 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 570 | "requires": { 571 | "safe-buffer": "5.1.1" 572 | } 573 | }, 574 | "tweetnacl": { 575 | "version": "0.14.5", 576 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 577 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 578 | "optional": true 579 | }, 580 | "util-deprecate": { 581 | "version": "1.0.2", 582 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 583 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 584 | }, 585 | "uuid": { 586 | "version": "3.1.0", 587 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", 588 | "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" 589 | }, 590 | "verror": { 591 | "version": "1.10.0", 592 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 593 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 594 | "requires": { 595 | "assert-plus": "1.0.0", 596 | "core-util-is": "1.0.2", 597 | "extsprintf": "1.3.0" 598 | } 599 | } 600 | } 601 | } 602 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "predictor", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "server.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "MIT", 11 | "dependencies": { 12 | "bluebird": "^3.5.0", 13 | "cfb-data": "^2.2.1", 14 | "csvjson": "^4.3.4", 15 | "dotenv": "^4.0.0", 16 | "synaptic": "^1.1.2" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | (async() => { 2 | const dotEnv = require('dotenv'); 3 | dotEnv.config(); 4 | 5 | const cfb = require('cfb-data'); 6 | const csvjson = require('csvjson'); 7 | const fs = require('fs'); 8 | 9 | const networkService = require('./libs/network.service')(fs); 10 | const statsService = require('./libs/stats.service')(fs, csvjson); 11 | const predictorService = await require('./libs/predictor.service')(fs, statsService, networkService, cfb); 12 | 13 | predictorService.updatePredictions(); 14 | })(); -------------------------------------------------------------------------------- /talent/2015.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "name": "Alabama", 3 | "talent": 981.9 4 | }, { 5 | "name": "USC", 6 | "talent": 926.71 7 | }, { 8 | "name": "Ohio State", 9 | "talent": 907.32 10 | }, { 11 | "name": "Florida State", 12 | "talent": 889.92 13 | }, { 14 | "name": "LSU", 15 | "talent": 889.37 16 | }, { 17 | "name": "Georgia", 18 | "talent": 877.74 19 | }, { 20 | "name": "Auburn", 21 | "talent": 865.41 22 | }, { 23 | "name": "Notre Dame", 24 | "talent": 857.33 25 | }, { 26 | "name": "Michigan", 27 | "talent": 851.12 28 | }, { 29 | "name": "Texas A&M", 30 | "talent": 830.34 31 | }, { 32 | "name": "Texas", 33 | "talent": 821.26 34 | }, { 35 | "name": "Tennessee", 36 | "talent": 810.53 37 | }, { 38 | "name": "Clemson", 39 | "talent": 807.56 40 | }, { 41 | "name": "UCLA", 42 | "talent": 793.22 43 | }, { 44 | "name": "Florida", 45 | "talent": 789.79 46 | }, { 47 | "name": "Oklahoma", 48 | "talent": 775.9 49 | }, { 50 | "name": "Miami", 51 | "talent": 773.23 52 | }, { 53 | "name": "Stanford", 54 | "talent": 765.98 55 | }, { 56 | "name": "Ole Miss", 57 | "talent": 764.34 58 | }, { 59 | "name": "Oregon", 60 | "talent": 757.52 61 | }, { 62 | "name": "Penn State", 63 | "talent": 732.36 64 | }, { 65 | "name": "South Carolina", 66 | "talent": 725.72 67 | }, { 68 | "name": "Michigan State", 69 | "talent": 715.3 70 | }, { 71 | "name": "Nebraska", 72 | "talent": 699.89 73 | }, { 74 | "name": "Arkansas", 75 | "talent": 695.04 76 | }, { 77 | "name": "North Carolina", 78 | "talent": 683.03 79 | }, { 80 | "name": "Arizona State", 81 | "talent": 680.87 82 | }, { 83 | "name": "Mississippi State", 84 | "talent": 680.06 85 | }, { 86 | "name": "Washington", 87 | "talent": 667.45 88 | }, { 89 | "name": "Virginia", 90 | "talent": 667.05 91 | }, { 92 | "name": "Baylor", 93 | "talent": 660.35 94 | }, { 95 | "name": "Virginia Tech", 96 | "talent": 658.38 97 | }, { 98 | "name": "Oklahoma State", 99 | "talent": 651.83 100 | }, { 101 | "name": "Missouri", 102 | "talent": 642.93 103 | }, { 104 | "name": "Texas Tech", 105 | "talent": 641.07 106 | }, { 107 | "name": "Louisville", 108 | "talent": 641.05 109 | }, { 110 | "name": "Wisconsin", 111 | "talent": 635.77 112 | }, { 113 | "name": "Kentucky", 114 | "talent": 634.52 115 | }, { 116 | "name": "TCU", 117 | "talent": 630.38 118 | }, { 119 | "name": "California", 120 | "talent": 626 121 | }, { 122 | "name": "West Virginia", 123 | "talent": 625.85 124 | }, { 125 | "name": "Pittsburgh", 126 | "talent": 611.18 127 | }, { 128 | "name": "NC State", 129 | "talent": 610.33 130 | }, { 131 | "name": "Vanderbilt", 132 | "talent": 609.76 133 | }, { 134 | "name": "Arizona", 135 | "talent": 606.92 136 | }, { 137 | "name": "Maryland", 138 | "talent": 603.76 139 | }, { 140 | "name": "Rutgers", 141 | "talent": 602.35 142 | }, { 143 | "name": "Northwestern", 144 | "talent": 595.75 145 | }, { 146 | "name": "Georgia Tech", 147 | "talent": 590.34 148 | }, { 149 | "name": "Utah", 150 | "talent": 574.41 151 | }, { 152 | "name": "Iowa", 153 | "talent": 573.06 154 | }, { 155 | "name": "Boise State", 156 | "talent": 568.96 157 | }, { 158 | "name": "Duke", 159 | "talent": 563.19 160 | }, { 161 | "name": "Indiana", 162 | "talent": 559.08 163 | }, { 164 | "name": "Oregon State", 165 | "talent": 544.66 166 | }, { 167 | "name": "Colorado", 168 | "talent": 542.06 169 | }, { 170 | "name": "Washington State", 171 | "talent": 540.86 172 | }, { 173 | "name": "Boston College", 174 | "talent": 534.6 175 | }, { 176 | "name": "Purdue", 177 | "talent": 534.26 178 | }, { 179 | "name": "Illinois", 180 | "talent": 530.96 181 | }, { 182 | "name": "USF", 183 | "talent": 529.65 184 | }, { 185 | "name": "Iowa State", 186 | "talent": 529.12 187 | }, { 188 | "name": "BYU", 189 | "talent": 521.43 190 | }, { 191 | "name": "Minnesota", 192 | "talent": 516.1 193 | }, { 194 | "name": "Houston", 195 | "talent": 511.45 196 | }, { 197 | "name": "Syracuse", 198 | "talent": 508.8 199 | }, { 200 | "name": "Kansas State", 201 | "talent": 503.64 202 | }, { 203 | "name": "Kansas", 204 | "talent": 499.97 205 | }, { 206 | "name": "Wake Forest", 207 | "talent": 497.48 208 | }, { 209 | "name": "San Diego State", 210 | "talent": 494.77 211 | }, { 212 | "name": "Cincinnati", 213 | "talent": 494.65 214 | }, { 215 | "name": "Marshall", 216 | "talent": 489.77 217 | }, { 218 | "name": "UCF", 219 | "talent": 484.54 220 | }, { 221 | "name": "Southern Mississippi", 222 | "talent": 470.84 223 | }, { 224 | "name": "SMU", 225 | "talent": 446.83 226 | }, { 227 | "name": "Western Michigan", 228 | "talent": 442.13 229 | }, { 230 | "name": "Louisiana Tech", 231 | "talent": 437.99 232 | }, { 233 | "name": "Bowling Green", 234 | "talent": 433.59 235 | }, { 236 | "name": "Louisiana-Lafayette", 237 | "talent": 430.17 238 | }, { 239 | "name": "Toledo", 240 | "talent": 429.03 241 | }, { 242 | "name": "Akron", 243 | "talent": 412.65 244 | }, { 245 | "name": "Middle Tennessee", 246 | "talent": 409.82 247 | }, { 248 | "name": "Tulane", 249 | "talent": 408.22 250 | }, { 251 | "name": "Arkansas State", 252 | "talent": 408.08 253 | }, { 254 | "name": "Temple", 255 | "talent": 405.92 256 | }, { 257 | "name": "Tulsa", 258 | "talent": 404.03 259 | }, { 260 | "name": "East Carolina", 261 | "talent": 403.62 262 | }, { 263 | "name": "Fresno State", 264 | "talent": 402.58 265 | }, { 266 | "name": "Connecticut", 267 | "talent": 402.23 268 | }, { 269 | "name": "Florida Atlantic", 270 | "talent": 401.61 271 | }, { 272 | "name": "Rice", 273 | "talent": 399.58 274 | }, { 275 | "name": "Miami (OH)", 276 | "talent": 397.13 277 | }, { 278 | "name": "Georgia Southern", 279 | "talent": 391.18 280 | }, { 281 | "name": "Colorado State", 282 | "talent": 389.1 283 | }, { 284 | "name": "Hawai'i", 285 | "talent": 385.63 286 | }, { 287 | "name": "Memphis", 288 | "talent": 381.8 289 | }, { 290 | "name": "North Texas", 291 | "talent": 380.69 292 | }, { 293 | "name": "Northern Illinois", 294 | "talent": 380.69 295 | }, { 296 | "name": "Nevada", 297 | "talent": 380.53 298 | }, { 299 | "name": "San Jose State", 300 | "talent": 379.6 301 | }, { 302 | "name": "Central Michigan", 303 | "talent": 376.81 304 | }, { 305 | "name": "South Alabama", 306 | "talent": 367.16 307 | }, { 308 | "name": "Texas State", 309 | "talent": 360.49 310 | }, { 311 | "name": "FIU", 312 | "talent": 360.11 313 | }, { 314 | "name": "UT San Antonio", 315 | "talent": 356.37 316 | }, { 317 | "name": "Western Kentucky", 318 | "talent": 353.5 319 | }, { 320 | "name": "Ball State", 321 | "talent": 349.94 322 | }, { 323 | "name": "New Mexico", 324 | "talent": 341.72 325 | }, { 326 | "name": "Eastern Michigan", 327 | "talent": 341.36 328 | }, { 329 | "name": "Kent State", 330 | "talent": 338.4 331 | }, { 332 | "name": "Georgia State", 333 | "talent": 335.67 334 | }, { 335 | "name": "Troy", 336 | "talent": 335.43 337 | }, { 338 | "name": "UNLV", 339 | "talent": 332.69 340 | }, { 341 | "name": "Utah State", 342 | "talent": 331.44 343 | }, { 344 | "name": "Ohio", 345 | "talent": 330.61 346 | }, { 347 | "name": "Massachusetts", 348 | "talent": 323.73 349 | }, { 350 | "name": "Old Dominion", 351 | "talent": 319.6 352 | }, { 353 | "name": "Buffalo", 354 | "talent": 316.44 355 | }, { 356 | "name": "Wyoming", 357 | "talent": 314.72 358 | }, { 359 | "name": "Appalachian State", 360 | "talent": 312.88 361 | }, { 362 | "name": "Navy", 363 | "talent": 306.87 364 | }, { 365 | "name": "Charlotte", 366 | "talent": 304.05 367 | }, { 368 | "name": "Louisiana-Monroe", 369 | "talent": 292.73 370 | }, { 371 | "name": "Idaho", 372 | "talent": 262.39 373 | }, { 374 | "name": "UTEP", 375 | "talent": 256.12 376 | }, { 377 | "name": "New Mexico State", 378 | "talent": 251.16 379 | }, { 380 | "name": "UAB", 381 | "talent": 236.34 382 | }, { 383 | "name": "Northern Iowa", 384 | "talent": 202.77 385 | }, { 386 | "name": "Army", 387 | "talent": 186.45 388 | }, { 389 | "name": "Yale", 390 | "talent": 181.76 391 | }, { 392 | "name": "Jacksonville State", 393 | "talent": 173.32 394 | }, { 395 | "name": "Chattanooga", 396 | "talent": 137.06 397 | }, { 398 | "name": "Portland State", 399 | "talent": 123.61 400 | }, { 401 | "name": "Youngstown State", 402 | "talent": 116.79 403 | }, { 404 | "name": "Bethune-Cookman", 405 | "talent": 116.09 406 | }, { 407 | "name": "South Carolina State", 408 | "talent": 105.01 409 | }, { 410 | "name": "Stephen F. Austin", 411 | "talent": 103.72 412 | }, { 413 | "name": "Cal Poly", 414 | "talent": 97.73 415 | }, { 416 | "name": "Samford", 417 | "talent": 95.68 418 | }, { 419 | "name": "Illinois State", 420 | "talent": 92.42 421 | }, { 422 | "name": "Murray State", 423 | "talent": 89.72 424 | }, { 425 | "name": "James Madison", 426 | "talent": 84.74 427 | }, { 428 | "name": "North Dakota State", 429 | "talent": 82.26 430 | }, { 431 | "name": "Jackson State", 432 | "talent": 78.26 433 | }, { 434 | "name": "Indiana State", 435 | "talent": 74.6 436 | }, { 437 | "name": "Tennessee State", 438 | "talent": 74.37 439 | }, { 440 | "name": "Towson", 441 | "talent": 74.05 442 | }, { 443 | "name": "Pennsylvania", 444 | "talent": 73.07 445 | }, { 446 | "name": "Air Force", 447 | "talent": 70.95 448 | }, { 449 | "name": "Northern Arizona", 450 | "talent": 68.35 451 | }, { 452 | "name": "Abilene Christian", 453 | "talent": 66.43 454 | }, { 455 | "name": "Montana", 456 | "talent": 64.46 457 | }, { 458 | "name": "Wagner", 459 | "talent": 64.14 460 | }, { 461 | "name": "Tennessee-Martin", 462 | "talent": 62.12 463 | }, { 464 | "name": "Stony Brook", 465 | "talent": 61.96 466 | }, { 467 | "name": "Furman", 468 | "talent": 61.89 469 | }, { 470 | "name": "Southern Illinois", 471 | "talent": 60.76 472 | }, { 473 | "name": "Hampton", 474 | "talent": 58.39 475 | }, { 476 | "name": "Southeastern Louisiana", 477 | "talent": 58.08 478 | }, { 479 | "name": "Villanova", 480 | "talent": 57.42 481 | }, { 482 | "name": "Valparaiso", 483 | "talent": 56.37 484 | }, { 485 | "name": "Western Illinois", 486 | "talent": 51.28 487 | }, { 488 | "name": "McNeese State", 489 | "talent": 51.19 490 | }, { 491 | "name": "Duquesne", 492 | "talent": 50.43 493 | }, { 494 | "name": "Charleston Southern", 495 | "talent": 48.43 496 | }, { 497 | "name": "Citadel", 498 | "talent": 47.12 499 | }, { 500 | "name": "Eastern Illinois", 501 | "talent": 46.56 502 | }, { 503 | "name": "Eastern Kentucky", 504 | "talent": 46.5 505 | }, { 506 | "name": "Richmond", 507 | "talent": 46.34 508 | }, { 509 | "name": "Eastern Washington", 510 | "talent": 45.1 511 | }, { 512 | "name": "Texas Southern", 513 | "talent": 43.1 514 | }, { 515 | "name": "Grambling", 516 | "talent": 41.62 517 | }, { 518 | "name": "Coastal Carolina", 519 | "talent": 41.5 520 | }, { 521 | "name": "Houston Baptist", 522 | "talent": 39.71 523 | }, { 524 | "name": "Southern University", 525 | "talent": 37.48 526 | }, { 527 | "name": "Sacramento State", 528 | "talent": 37.46 529 | }, { 530 | "name": "Rhode Island", 531 | "talent": 37.17 532 | }, { 533 | "name": "Austin Peay", 534 | "talent": 36.99 535 | }, { 536 | "name": "Fordham", 537 | "talent": 36.98 538 | }, { 539 | "name": "Northern Colorado", 540 | "talent": 36.95 541 | }, { 542 | "name": "Central Arkansas", 543 | "talent": 35.29 544 | }, { 545 | "name": "Mercer", 546 | "talent": 35.02 547 | }, { 548 | "name": "Norfolk State", 549 | "talent": 32.59 550 | }, { 551 | "name": "Tennessee Tech", 552 | "talent": 31.74 553 | }, { 554 | "name": "Virginia Military", 555 | "talent": 31.43 556 | }, { 557 | "name": "Campbell", 558 | "talent": 31.21 559 | }, { 560 | "name": "Harvard", 561 | "talent": 30.49 562 | }, { 563 | "name": "Southeast Missouri State", 564 | "talent": 29.79 565 | }, { 566 | "name": "Cornell", 567 | "talent": 29.11 568 | }, { 569 | "name": "Northwestern State", 570 | "talent": 28.02 571 | }, { 572 | "name": "Presbyterian", 573 | "talent": 25.63 574 | }, { 575 | "name": "Delaware State", 576 | "talent": 25.26 577 | }, { 578 | "name": "South Dakota State", 579 | "talent": 25.25 580 | }, { 581 | "name": "Lamar", 582 | "talent": 24.84 583 | }, { 584 | "name": "Nicholls State", 585 | "talent": 24.71 586 | }, { 587 | "name": "Alabama State", 588 | "talent": 24.46 589 | }, { 590 | "name": "Kennesaw State", 591 | "talent": 23.49 592 | }, { 593 | "name": "Idaho State", 594 | "talent": 21.69 595 | }, { 596 | "name": "Columbia", 597 | "talent": 21.24 598 | }, { 599 | "name": "New Hampshire", 600 | "talent": 21.17 601 | }, { 602 | "name": "Prairie View A&M", 603 | "talent": 20.76 604 | }, { 605 | "name": "East Tennessee State", 606 | "talent": 20.07 607 | }, { 608 | "name": "Weber State", 609 | "talent": 19.8 610 | }, { 611 | "name": "Liberty", 612 | "talent": 19.57 613 | }, { 614 | "name": "Wofford", 615 | "talent": 19.48 616 | }, { 617 | "name": "Jacksonville", 618 | "talent": 18.58 619 | }, { 620 | "name": "Brown", 621 | "talent": 16.92 622 | }, { 623 | "name": "Western Carolina", 624 | "talent": 15.77 625 | }, { 626 | "name": "Davidson", 627 | "talent": 15.67 628 | }, { 629 | "name": "William & Mary", 630 | "talent": 15.65 631 | }, { 632 | "name": "Florida A&M", 633 | "talent": 15.6 634 | }, { 635 | "name": "Incarnate Word", 636 | "talent": 15.59 637 | }, { 638 | "name": "North Carolina Central", 639 | "talent": 14.26 640 | }, { 641 | "name": "Alabama A&M", 642 | "talent": 13.33 643 | }, { 644 | "name": "Montana State", 645 | "talent": 11.86 646 | }, { 647 | "name": "Butler", 648 | "talent": 9.96 649 | }, { 650 | "name": "Gardner-Webb", 651 | "talent": 8.58 652 | }, { 653 | "name": "Monmouth", 654 | "talent": 7.93 655 | }, { 656 | "name": "Holy Cross", 657 | "talent": 7.45 658 | }, { 659 | "name": "Drake", 660 | "talent": 7.43 661 | }, { 662 | "name": "Maine", 663 | "talent": 7.24 664 | }, { 665 | "name": "Lehigh", 666 | "talent": 6.66 667 | }, { 668 | "name": "Stetson", 669 | "talent": 6.66 670 | }, { 671 | "name": "Arkansas-Pine Bluff", 672 | "talent": 6.66 673 | }, { 674 | "name": "Southern Utah", 675 | "talent": 6.66 676 | }, { 677 | "name": "UC Davis", 678 | "talent": 6.66 679 | }, { 680 | "name": "South Dakota", 681 | "talent": 3.36 682 | }, { 683 | "name": "Robert Morris", 684 | "talent": 3.06 685 | }, { 686 | "name": "Dartmouth", 687 | "talent": 2.96 688 | }, { 689 | "name": "Marist", 690 | "talent": 2.63 691 | }, { 692 | "name": "Howard", 693 | "talent": 2.22 694 | }, { 695 | "name": "St Francis (PA)", 696 | "talent": 1.74 697 | }] -------------------------------------------------------------------------------- /talent/2016.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "name": "Alabama", 3 | "talent": 982.66 4 | }, { 5 | "name": "USC", 6 | "talent": 936.86 7 | }, { 8 | "name": "LSU", 9 | "talent": 917.72 10 | }, { 11 | "name": "Florida State", 12 | "talent": 906.64 13 | }, { 14 | "name": "Ohio State", 15 | "talent": 902.46 16 | }, { 17 | "name": "Georgia", 18 | "talent": 872 19 | }, { 20 | "name": "Auburn", 21 | "talent": 865.36 22 | }, { 23 | "name": "Michigan", 24 | "talent": 852.78 25 | }, { 26 | "name": "Clemson", 27 | "talent": 846 28 | }, { 29 | "name": "Notre Dame", 30 | "talent": 842.35 31 | }, { 32 | "name": "Texas", 33 | "talent": 838.97 34 | }, { 35 | "name": "UCLA", 36 | "talent": 819.16 37 | }, { 38 | "name": "Texas A&M", 39 | "talent": 814.63 40 | }, { 41 | "name": "Tennessee", 42 | "talent": 813.92 43 | }, { 44 | "name": "Ole Miss", 45 | "talent": 808.15 46 | }, { 47 | "name": "Florida", 48 | "talent": 798.44 49 | }, { 50 | "name": "Stanford", 51 | "talent": 778.45 52 | }, { 53 | "name": "Oklahoma", 54 | "talent": 777.48 55 | }, { 56 | "name": "Miami", 57 | "talent": 745.93 58 | }, { 59 | "name": "Penn State", 60 | "talent": 742.52 61 | }, { 62 | "name": "Oregon", 63 | "talent": 738.29 64 | }, { 65 | "name": "Michigan State", 66 | "talent": 719.7 67 | }, { 68 | "name": "South Carolina", 69 | "talent": 706.9 70 | }, { 71 | "name": "Washington", 72 | "talent": 699.64 73 | }, { 74 | "name": "Arizona State", 75 | "talent": 694.21 76 | }, { 77 | "name": "Nebraska", 78 | "talent": 691.61 79 | }, { 80 | "name": "Arkansas", 81 | "talent": 689.41 82 | }, { 83 | "name": "Mississippi State", 84 | "talent": 679.14 85 | }, { 86 | "name": "North Carolina", 87 | "talent": 669.61 88 | }, { 89 | "name": "TCU", 90 | "talent": 665.53 91 | }, { 92 | "name": "West Virginia", 93 | "talent": 654.64 94 | }, { 95 | "name": "Louisville", 96 | "talent": 654.13 97 | }, { 98 | "name": "Kentucky", 99 | "talent": 652.07 100 | }, { 101 | "name": "Maryland", 102 | "talent": 651.99 103 | }, { 104 | "name": "Pittsburgh", 105 | "talent": 649.85 106 | }, { 107 | "name": "Virginia Tech", 108 | "talent": 646.82 109 | }, { 110 | "name": "Wisconsin", 111 | "talent": 643.76 112 | }, { 113 | "name": "Missouri", 114 | "talent": 633.76 115 | }, { 116 | "name": "Oklahoma State", 117 | "talent": 631.68 118 | }, { 119 | "name": "Baylor", 120 | "talent": 619.18 121 | }, { 122 | "name": "Vanderbilt", 123 | "talent": 619.03 124 | }, { 125 | "name": "Virginia", 126 | "talent": 618.91 127 | }, { 128 | "name": "Arizona", 129 | "talent": 616.31 130 | }, { 131 | "name": "NC State", 132 | "talent": 616.29 133 | }, { 134 | "name": "Northwestern", 135 | "talent": 613.55 136 | }, { 137 | "name": "Texas Tech", 138 | "talent": 604.93 139 | }, { 140 | "name": "California", 141 | "talent": 601.17 142 | }, { 143 | "name": "Duke", 144 | "talent": 599.82 145 | }, { 146 | "name": "Rutgers", 147 | "talent": 585.47 148 | }, { 149 | "name": "Georgia Tech", 150 | "talent": 582.55 151 | }, { 152 | "name": "Utah", 153 | "talent": 580.07 154 | }, { 155 | "name": "Houston", 156 | "talent": 572.7 157 | }, { 158 | "name": "Indiana", 159 | "talent": 565.47 160 | }, { 161 | "name": "USF", 162 | "talent": 563.99 163 | }, { 164 | "name": "Iowa", 165 | "talent": 558.73 166 | }, { 167 | "name": "Iowa State", 168 | "talent": 552.17 169 | }, { 170 | "name": "Boise State", 171 | "talent": 548.82 172 | }, { 173 | "name": "Cincinnati", 174 | "talent": 541.58 175 | }, { 176 | "name": "Minnesota", 177 | "talent": 535.44 178 | }, { 179 | "name": "Boston College", 180 | "talent": 533.39 181 | }, { 182 | "name": "BYU", 183 | "talent": 529.05 184 | }, { 185 | "name": "Colorado", 186 | "talent": 526.39 187 | }, { 188 | "name": "Oregon State", 189 | "talent": 524.89 190 | }, { 191 | "name": "Illinois", 192 | "talent": 523.91 193 | }, { 194 | "name": "Washington State", 195 | "talent": 522.58 196 | }, { 197 | "name": "Syracuse", 198 | "talent": 520.26 199 | }, { 200 | "name": "Wake Forest", 201 | "talent": 517.63 202 | }, { 203 | "name": "Purdue", 204 | "talent": 512.72 205 | }, { 206 | "name": "UCF", 207 | "talent": 510.27 208 | }, { 209 | "name": "Kansas State", 210 | "talent": 505.29 211 | }, { 212 | "name": "Temple", 213 | "talent": 492.72 214 | }, { 215 | "name": "Kansas", 216 | "talent": 491 217 | }, { 218 | "name": "Marshall", 219 | "talent": 485.46 220 | }, { 221 | "name": "San Diego State", 222 | "talent": 482.31 223 | }, { 224 | "name": "SMU", 225 | "talent": 474.03 226 | }, { 227 | "name": "Arkansas State", 228 | "talent": 471.45 229 | }, { 230 | "name": "Toledo", 231 | "talent": 460.86 232 | }, { 233 | "name": "Louisiana Tech", 234 | "talent": 451.38 235 | }, { 236 | "name": "Memphis", 237 | "talent": 451.24 238 | }, { 239 | "name": "Akron", 240 | "talent": 443.73 241 | }, { 242 | "name": "Western Michigan", 243 | "talent": 443.16 244 | }, { 245 | "name": "East Carolina", 246 | "talent": 442.26 247 | }, { 248 | "name": "Southern Mississippi", 249 | "talent": 441.29 250 | }, { 251 | "name": "San Jose State", 252 | "talent": 437.36 253 | }, { 254 | "name": "Middle Tennessee", 255 | "talent": 436.6 256 | }, { 257 | "name": "Georgia Southern", 258 | "talent": 435.33 259 | }, { 260 | "name": "Connecticut", 261 | "talent": 423.56 262 | }, { 263 | "name": "Louisiana-Lafayette", 264 | "talent": 421.37 265 | }, { 266 | "name": "Miami (OH)", 267 | "talent": 418.04 268 | }, { 269 | "name": "Colorado State", 270 | "talent": 412.28 271 | }, { 272 | "name": "Tulsa", 273 | "talent": 409.17 274 | }, { 275 | "name": "Florida Atlantic", 276 | "talent": 408.4 277 | }, { 278 | "name": "Fresno State", 279 | "talent": 404.97 280 | }, { 281 | "name": "Northern Illinois", 282 | "talent": 403.27 283 | }, { 284 | "name": "Western Kentucky", 285 | "talent": 401.82 286 | }, { 287 | "name": "UT San Antonio", 288 | "talent": 397.64 289 | }, { 290 | "name": "Rice", 291 | "talent": 394.83 292 | }, { 293 | "name": "Bowling Green", 294 | "talent": 392.66 295 | }, { 296 | "name": "Central Michigan", 297 | "talent": 391.81 298 | }, { 299 | "name": "Troy", 300 | "talent": 390.47 301 | }, { 302 | "name": "Nevada", 303 | "talent": 389.56 304 | }, { 305 | "name": "South Alabama", 306 | "talent": 389.36 307 | }, { 308 | "name": "Tulane", 309 | "talent": 388.04 310 | }, { 311 | "name": "New Mexico", 312 | "talent": 387.26 313 | }, { 314 | "name": "Hawai'i", 315 | "talent": 384.97 316 | }, { 317 | "name": "UNLV", 318 | "talent": 376.26 319 | }, { 320 | "name": "Ohio", 321 | "talent": 372.56 322 | }, { 323 | "name": "Massachusetts", 324 | "talent": 370.9 325 | }, { 326 | "name": "Ball State", 327 | "talent": 365.94 328 | }, { 329 | "name": "FIU", 330 | "talent": 362.84 331 | }, { 332 | "name": "Utah State", 333 | "talent": 357.13 334 | }, { 335 | "name": "Texas State", 336 | "talent": 351.76 337 | }, { 338 | "name": "North Texas", 339 | "talent": 351.58 340 | }, { 341 | "name": "Eastern Michigan", 342 | "talent": 347.7 343 | }, { 344 | "name": "Old Dominion", 345 | "talent": 347.2 346 | }, { 347 | "name": "Buffalo", 348 | "talent": 343.64 349 | }, { 350 | "name": "Navy", 351 | "talent": 342.77 352 | }, { 353 | "name": "Kent State", 354 | "talent": 334.01 355 | }, { 356 | "name": "Appalachian State", 357 | "talent": 333.36 358 | }, { 359 | "name": "Charlotte", 360 | "talent": 330.55 361 | }, { 362 | "name": "Louisiana-Monroe", 363 | "talent": 322.82 364 | }, { 365 | "name": "Georgia State", 366 | "talent": 321.79 367 | }, { 368 | "name": "Wyoming", 369 | "talent": 316.18 370 | }, { 371 | "name": "UTEP", 372 | "talent": 290.4 373 | }, { 374 | "name": "New Mexico State", 375 | "talent": 267.66 376 | }, { 377 | "name": "Idaho", 378 | "talent": 256.78 379 | }, { 380 | "name": "Jacksonville State", 381 | "talent": 254.26 382 | }, { 383 | "name": "Eastern Kentucky", 384 | "talent": 184.88 385 | }, { 386 | "name": "Yale", 387 | "talent": 165.17 388 | }, { 389 | "name": "Northern Iowa", 390 | "talent": 164.16 391 | }, { 392 | "name": "Portland State", 393 | "talent": 154.68 394 | }, { 395 | "name": "Army", 396 | "talent": 131.74 397 | }, { 398 | "name": "Youngstown State", 399 | "talent": 130.84 400 | }, { 401 | "name": "James Madison", 402 | "talent": 128.58 403 | }, { 404 | "name": "Southern Illinois", 405 | "talent": 123.69 406 | }, { 407 | "name": "Southeastern Louisiana", 408 | "talent": 121.61 409 | }, { 410 | "name": "Chattanooga", 411 | "talent": 119.2 412 | }, { 413 | "name": "Eastern Illinois", 414 | "talent": 119.04 415 | }, { 416 | "name": "Wagner", 417 | "talent": 118.43 418 | }, { 419 | "name": "Stony Brook", 420 | "talent": 118.15 421 | }, { 422 | "name": "Duquesne", 423 | "talent": 116.15 424 | }, { 425 | "name": "Tennessee-Martin", 426 | "talent": 107.98 427 | }, { 428 | "name": "Northern Arizona", 429 | "talent": 104.38 430 | }, { 431 | "name": "Illinois State", 432 | "talent": 102.21 433 | }, { 434 | "name": "Hampton", 435 | "talent": 99.46 436 | }, { 437 | "name": "Towson", 438 | "talent": 95.18 439 | }, { 440 | "name": "Samford", 441 | "talent": 94.57 442 | }, { 443 | "name": "Grambling", 444 | "talent": 93.31 445 | }, { 446 | "name": "Cal Poly", 447 | "talent": 91.73 448 | }, { 449 | "name": "Nicholls State", 450 | "talent": 89.59 451 | }, { 452 | "name": "Jackson State", 453 | "talent": 86.85 454 | }, { 455 | "name": "Montana", 456 | "talent": 83.1 457 | }, { 458 | "name": "North Dakota State", 459 | "talent": 81.65 460 | }, { 461 | "name": "Stephen F. Austin", 462 | "talent": 80.33 463 | }, { 464 | "name": "Western Illinois", 465 | "talent": 78.62 466 | }, { 467 | "name": "Southeast Missouri State", 468 | "talent": 76.33 469 | }, { 470 | "name": "South Carolina State", 471 | "talent": 75.71 472 | }, { 473 | "name": "Coastal Carolina", 474 | "talent": 71.67 475 | }, { 476 | "name": "McNeese State", 477 | "talent": 69.85 478 | }, { 479 | "name": "Southern Utah", 480 | "talent": 68.79 481 | }, { 482 | "name": "Prairie View A&M", 483 | "talent": 67.68 484 | }, { 485 | "name": "Norfolk State", 486 | "talent": 67.07 487 | }, { 488 | "name": "Furman", 489 | "talent": 66.86 490 | }, { 491 | "name": "Charleston Southern", 492 | "talent": 65.6 493 | }, { 494 | "name": "Montana State", 495 | "talent": 64.33 496 | }, { 497 | "name": "Bethune-Cookman", 498 | "talent": 63.39 499 | }, { 500 | "name": "Murray State", 501 | "talent": 62.79 502 | }, { 503 | "name": "Central Arkansas", 504 | "talent": 62.11 505 | }, { 506 | "name": "Houston Baptist", 507 | "talent": 61.17 508 | }, { 509 | "name": "Pennsylvania", 510 | "talent": 60.95 511 | }, { 512 | "name": "Mercer", 513 | "talent": 57.71 514 | }, { 515 | "name": "Kennesaw State", 516 | "talent": 54.76 517 | }, { 518 | "name": "Weber State", 519 | "talent": 54.68 520 | }, { 521 | "name": "Alabama State", 522 | "talent": 53.46 523 | }, { 524 | "name": "Tennessee Tech", 525 | "talent": 53 526 | }, { 527 | "name": "Richmond", 528 | "talent": 51.95 529 | }, { 530 | "name": "Tennessee State", 531 | "talent": 51.82 532 | }, { 533 | "name": "Southern University", 534 | "talent": 46.97 535 | }, { 536 | "name": "Sacramento State", 537 | "talent": 45.18 538 | }, { 539 | "name": "Eastern Washington", 540 | "talent": 45.1 541 | }, { 542 | "name": "Austin Peay", 543 | "talent": 44.67 544 | }, { 545 | "name": "Air Force", 546 | "talent": 44.58 547 | }, { 548 | "name": "Texas Southern", 549 | "talent": 43.86 550 | }, { 551 | "name": "Lamar", 552 | "talent": 43.84 553 | }, { 554 | "name": "Indiana State", 555 | "talent": 43.84 556 | }, { 557 | "name": "William & Mary", 558 | "talent": 43.54 559 | }, { 560 | "name": "Presbyterian", 561 | "talent": 41.4 562 | }, { 563 | "name": "Rhode Island", 564 | "talent": 41.24 565 | }, { 566 | "name": "Campbell", 567 | "talent": 40.68 568 | }, { 569 | "name": "Alcorn State", 570 | "talent": 39.3 571 | }, { 572 | "name": "Citadel", 573 | "talent": 37.64 574 | }, { 575 | "name": "Fordham", 576 | "talent": 36.98 577 | }, { 578 | "name": "Princeton", 579 | "talent": 36.73 580 | }, { 581 | "name": "Monmouth", 582 | "talent": 35.77 583 | }, { 584 | "name": "South Dakota", 585 | "talent": 32.89 586 | }, { 587 | "name": "Northwestern State", 588 | "talent": 32.06 589 | }, { 590 | "name": "Virginia Military", 591 | "talent": 31.43 592 | }, { 593 | "name": "East Tennessee State", 594 | "talent": 31.35 595 | }, { 596 | "name": "Valparaiso", 597 | "talent": 29.84 598 | }, { 599 | "name": "Northern Colorado", 600 | "talent": 29.66 601 | }, { 602 | "name": "Drake", 603 | "talent": 27.37 604 | }, { 605 | "name": "Robert Morris", 606 | "talent": 26.7 607 | }, { 608 | "name": "Alabama A&M", 609 | "talent": 26.31 610 | }, { 611 | "name": "Idaho State", 612 | "talent": 25.18 613 | }, { 614 | "name": "Villanova", 615 | "talent": 23.98 616 | }, { 617 | "name": "Savannah State", 618 | "talent": 23.51 619 | }, { 620 | "name": "Maine", 621 | "talent": 23.37 622 | }, { 623 | "name": "Delaware State", 624 | "talent": 22.84 625 | }, { 626 | "name": "Gardner-Webb", 627 | "talent": 22.66 628 | }, { 629 | "name": "Butler", 630 | "talent": 21.56 631 | }, { 632 | "name": "Columbia", 633 | "talent": 21.24 634 | }, { 635 | "name": "Liberty", 636 | "talent": 21.04 637 | }, { 638 | "name": "Abilene Christian", 639 | "talent": 19.77 640 | }, { 641 | "name": "Wofford", 642 | "talent": 19.48 643 | }, { 644 | "name": "Sacred Heart", 645 | "talent": 19.44 646 | }, { 647 | "name": "Harvard", 648 | "talent": 17.28 649 | }, { 650 | "name": "Brown", 651 | "talent": 16.92 652 | }, { 653 | "name": "Florida A&M", 654 | "talent": 16.64 655 | }, { 656 | "name": "Cornell", 657 | "talent": 15.89 658 | }, { 659 | "name": "Dayton", 660 | "talent": 14.99 661 | }, { 662 | "name": "Holy Cross", 663 | "talent": 14.75 664 | }, { 665 | "name": "Western Carolina", 666 | "talent": 13.67 667 | }, { 668 | "name": "Jacksonville", 669 | "talent": 13.41 670 | }, { 671 | "name": "North Carolina Central", 672 | "talent": 13.15 673 | }, { 674 | "name": "Missouri State", 675 | "talent": 12.7 676 | }, { 677 | "name": "Georgetown", 678 | "talent": 12.6 679 | }, { 680 | "name": "New Hampshire", 681 | "talent": 11.21 682 | }, { 683 | "name": "Stetson", 684 | "talent": 9.99 685 | }, { 686 | "name": "Howard", 687 | "talent": 7.53 688 | }, { 689 | "name": "Lehigh", 690 | "talent": 6.66 691 | }, { 692 | "name": "Arkansas-Pine Bluff", 693 | "talent": 6.66 694 | }, { 695 | "name": "Morehead State", 696 | "talent": 6.66 697 | }, { 698 | "name": "Central Connecticut", 699 | "talent": 6.66 700 | }, { 701 | "name": "San Diego", 702 | "talent": 6.66 703 | }, { 704 | "name": "Bryant", 705 | "talent": 6.24 706 | }, { 707 | "name": "North Carolina A&T", 708 | "talent": 3.81 709 | }, { 710 | "name": "St Francis (PA)", 711 | "talent": 1.74 712 | }] -------------------------------------------------------------------------------- /talent/2017.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "name": "Alabama", 3 | "talent": 997.57 4 | }, { 5 | "name": "Ohio State", 6 | "talent": 959.12 7 | }, { 8 | "name": "USC", 9 | "talent": 934 10 | }, { 11 | "name": "Georgia", 12 | "talent": 930.34 13 | }, { 14 | "name": "Florida State", 15 | "talent": 924.97 16 | }, { 17 | "name": "LSU", 18 | "talent": 907.1 19 | }, { 20 | "name": "Michigan", 21 | "talent": 874.28 22 | }, { 23 | "name": "Auburn", 24 | "talent": 867.43 25 | }, { 26 | "name": "Clemson", 27 | "talent": 853.65 28 | }, { 29 | "name": "Notre Dame", 30 | "talent": 837.71 31 | }, { 32 | "name": "UCLA", 33 | "talent": 830.58 34 | }, { 35 | "name": "Tennessee", 36 | "talent": 817.34 37 | }, { 38 | "name": "Texas", 39 | "talent": 811.03 40 | }, { 41 | "name": "Stanford", 42 | "talent": 810.31 43 | }, { 44 | "name": "Texas A&M", 45 | "talent": 807.27 46 | }, { 47 | "name": "Oklahoma", 48 | "talent": 801.67 49 | }, { 50 | "name": "Ole Miss", 51 | "talent": 795.7 52 | }, { 53 | "name": "Florida", 54 | "talent": 793.83 55 | }, { 56 | "name": "Penn State", 57 | "talent": 779.26 58 | }, { 59 | "name": "Miami", 60 | "talent": 749.08 61 | }, { 62 | "name": "Arizona State", 63 | "talent": 720.44 64 | }, { 65 | "name": "Oregon", 66 | "talent": 720.23 67 | }, { 68 | "name": "Arkansas", 69 | "talent": 717.01 70 | }, { 71 | "name": "Washington", 72 | "talent": 706.52 73 | }, { 74 | "name": "South Carolina", 75 | "talent": 702.52 76 | }, { 77 | "name": "Mississippi State", 78 | "talent": 701.06 79 | }, { 80 | "name": "North Carolina", 81 | "talent": 697.54 82 | }, { 83 | "name": "Maryland", 84 | "talent": 696.21 85 | }, { 86 | "name": "Nebraska", 87 | "talent": 693.46 88 | }, { 89 | "name": "Michigan State", 90 | "talent": 680.94 91 | }, { 92 | "name": "TCU", 93 | "talent": 672.81 94 | }, { 95 | "name": "Kentucky", 96 | "talent": 671.45 97 | }, { 98 | "name": "Virginia Tech", 99 | "talent": 662.18 100 | }, { 101 | "name": "Pittsburgh", 102 | "talent": 660.36 103 | }, { 104 | "name": "Baylor", 105 | "talent": 657.22 106 | }, { 107 | "name": "Louisville", 108 | "talent": 640.98 109 | }, { 110 | "name": "Wisconsin", 111 | "talent": 639.76 112 | }, { 113 | "name": "Oklahoma State", 114 | "talent": 633.57 115 | }, { 116 | "name": "Utah", 117 | "talent": 630.95 118 | }, { 119 | "name": "Duke", 120 | "talent": 627.62 121 | }, { 122 | "name": "Northwestern", 123 | "talent": 627.54 124 | }, { 125 | "name": "Missouri", 126 | "talent": 623.33 127 | }, { 128 | "name": "West Virginia", 129 | "talent": 613.18 130 | }, { 131 | "name": "NC State", 132 | "talent": 609.76 133 | }, { 134 | "name": "Vanderbilt", 135 | "talent": 607.68 136 | }, { 137 | "name": "Arizona", 138 | "talent": 607.31 139 | }, { 140 | "name": "Virginia", 141 | "talent": 603.88 142 | }, { 143 | "name": "California", 144 | "talent": 603.06 145 | }, { 146 | "name": "Iowa", 147 | "talent": 592.95 148 | }, { 149 | "name": "Texas Tech", 150 | "talent": 574.93 151 | }, { 152 | "name": "Rutgers", 153 | "talent": 574.78 154 | }, { 155 | "name": "Georgia Tech", 156 | "talent": 574.35 157 | }, { 158 | "name": "BYU", 159 | "talent": 574.09 160 | }, { 161 | "name": "UCF", 162 | "talent": 571.52 163 | }, { 164 | "name": "Colorado", 165 | "talent": 568.59 166 | }, { 167 | "name": "Iowa State", 168 | "talent": 559.34 169 | }, { 170 | "name": "Houston", 171 | "talent": 558.72 172 | }, { 173 | "name": "Oregon State", 174 | "talent": 557.02 175 | }, { 176 | "name": "USF", 177 | "talent": 554.17 178 | }, { 179 | "name": "Washington State", 180 | "talent": 549.42 181 | }, { 182 | "name": "Indiana", 183 | "talent": 547.92 184 | }, { 185 | "name": "Minnesota", 186 | "talent": 543.8 187 | }, { 188 | "name": "Syracuse", 189 | "talent": 539.6 190 | }, { 191 | "name": "Illinois", 192 | "talent": 538.83 193 | }, { 194 | "name": "Boston College", 195 | "talent": 535.21 196 | }, { 197 | "name": "Wake Forest", 198 | "talent": 527.21 199 | }, { 200 | "name": "Kansas State", 201 | "talent": 517.85 202 | }, { 203 | "name": "Kansas", 204 | "talent": 512.24 205 | }, { 206 | "name": "Memphis", 207 | "talent": 504.49 208 | }, { 209 | "name": "Purdue", 210 | "talent": 502.71 211 | }, { 212 | "name": "Boise State", 213 | "talent": 501.53 214 | }, { 215 | "name": "Cincinnati", 216 | "talent": 500.95 217 | }, { 218 | "name": "SMU", 219 | "talent": 492.63 220 | }, { 221 | "name": "East Carolina", 222 | "talent": 471.1 223 | }, { 224 | "name": "Florida Atlantic", 225 | "talent": 470.88 226 | }, { 227 | "name": "Temple", 228 | "talent": 468.29 229 | }, { 230 | "name": "Marshall", 231 | "talent": 445.48 232 | }, { 233 | "name": "Colorado State", 234 | "talent": 441.98 235 | }, { 236 | "name": "Arkansas State", 237 | "talent": 436.05 238 | }, { 239 | "name": "Tulsa", 240 | "talent": 422.77 241 | }, { 242 | "name": "Connecticut", 243 | "talent": 420.17 244 | }, { 245 | "name": "San Diego State", 246 | "talent": 419.43 247 | }, { 248 | "name": "Western Michigan", 249 | "talent": 414.35 250 | }, { 251 | "name": "Miami (OH)", 252 | "talent": 413.24 253 | }, { 254 | "name": "Tulane", 255 | "talent": 396.43 256 | }, { 257 | "name": "Louisiana Tech", 258 | "talent": 394.31 259 | }, { 260 | "name": "Southern Mississippi", 261 | "talent": 394.24 262 | }, { 263 | "name": "South Alabama", 264 | "talent": 387.88 265 | }, { 266 | "name": "Central Michigan", 267 | "talent": 387.2 268 | }, { 269 | "name": "San José State", 270 | "talent": 378.56 271 | }, { 272 | "name": "Navy", 273 | "talent": 376.2 274 | }, { 275 | "name": "Fresno State", 276 | "talent": 374.63 277 | }, { 278 | "name": "Northern Illinois", 279 | "talent": 373.99 280 | }, { 281 | "name": "UMass", 282 | "talent": 367.59 283 | }, { 284 | "name": "Toledo", 285 | "talent": 366.47 286 | }, { 287 | "name": "Georgia Southern", 288 | "talent": 365.57 289 | }, { 290 | "name": "Georgia State", 291 | "talent": 364.16 292 | }, { 293 | "name": "Bowling Green", 294 | "talent": 361.82 295 | }, { 296 | "name": "Troy", 297 | "talent": 352.1 298 | }, { 299 | "name": "Rice", 300 | "talent": 345.79 301 | }, { 302 | "name": "Middle Tennessee", 303 | "talent": 344.65 304 | }, { 305 | "name": "New Mexico", 306 | "talent": 344.64 307 | }, { 308 | "name": "Nevada", 309 | "talent": 341.11 310 | }, { 311 | "name": "Akron", 312 | "talent": 337.11 313 | }, { 314 | "name": "Appalachian State", 315 | "talent": 335.87 316 | }, { 317 | "name": "FIU", 318 | "talent": 334.18 319 | }, { 320 | "name": "Western Kentucky", 321 | "talent": 332.17 322 | }, { 323 | "name": "Old Dominion", 324 | "talent": 331.2 325 | }, { 326 | "name": "UNLV", 327 | "talent": 331.18 328 | }, { 329 | "name": "Hawai'i", 330 | "talent": 330.56 331 | }, { 332 | "name": "Utah State", 333 | "talent": 330.2 334 | }, { 335 | "name": "Louisiana", 336 | "talent": 329.24 337 | }, { 338 | "name": "Ohio", 339 | "talent": 326.14 340 | }, { 341 | "name": "Ball State", 342 | "talent": 318.17 343 | }, { 344 | "name": "Louisiana Monroe", 345 | "talent": 303.96 346 | }, { 347 | "name": "North Texas", 348 | "talent": 303.13 349 | }, { 350 | "name": "Buffalo", 351 | "talent": 294.08 352 | }, { 353 | "name": "Eastern Michigan", 354 | "talent": 292.11 355 | }, { 356 | "name": "UT San Antonio", 357 | "talent": 291.62 358 | }, { 359 | "name": "Kent State", 360 | "talent": 288.56 361 | }, { 362 | "name": "Charlotte", 363 | "talent": 283.01 364 | }, { 365 | "name": "Wyoming", 366 | "talent": 277.07 367 | }, { 368 | "name": "Texas State", 369 | "talent": 274.67 370 | }, { 371 | "name": "UTEP", 372 | "talent": 264.42 373 | }, { 374 | "name": "New Mexico State", 375 | "talent": 233.47 376 | }, { 377 | "name": "Idaho", 378 | "talent": 184.75 379 | }, { 380 | "name": "James Madison", 381 | "talent": 179.5 382 | }, { 383 | "name": "UAB", 384 | "talent": 170.05 385 | }, { 386 | "name": "Portland State", 387 | "talent": 147.63 388 | }, { 389 | "name": "Coastal Carolina", 390 | "talent": 119.43 391 | }, { 392 | "name": "Stony Brook", 393 | "talent": 111.94 394 | }, { 395 | "name": "Towson", 396 | "talent": 106.93 397 | }, { 398 | "name": "Army", 399 | "talent": 88.72 400 | }, { 401 | "name": "Montana", 402 | "talent": 80.03 403 | }, { 404 | "name": "Cal Poly", 405 | "talent": 76.98 406 | }, { 407 | "name": "Charleston Southern", 408 | "talent": 72.38 409 | }, { 410 | "name": "Richmond", 411 | "talent": 71.64 412 | }, { 413 | "name": "Kennesaw State", 414 | "talent": 70.97 415 | }, { 416 | "name": "Northern Arizona", 417 | "talent": 69.2 418 | }, { 419 | "name": "Rhode Island", 420 | "talent": 65.72 421 | }, { 422 | "name": "Weber State", 423 | "talent": 51.74 424 | }, { 425 | "name": "Sacramento State", 426 | "talent": 46.67 427 | }, { 428 | "name": "William & Mary", 429 | "talent": 40.05 430 | }, { 431 | "name": "Maine", 432 | "talent": 38.99 433 | }, { 434 | "name": "Southern Utah", 435 | "talent": 33.11 436 | }, { 437 | "name": "Northern Colorado", 438 | "talent": 32.58 439 | }, { 440 | "name": "Montana State", 441 | "talent": 26.4 442 | }, { 443 | "name": "Gardner-Webb", 444 | "talent": 23.01 445 | }, { 446 | "name": "Monmouth", 447 | "talent": 21.44 448 | }, { 449 | "name": "Air Force", 450 | "talent": 21.1 451 | }, { 452 | "name": "Eastern Washington", 453 | "talent": 19.95 454 | }, { 455 | "name": "Liberty", 456 | "talent": 19.85 457 | }, { 458 | "name": "Idaho State", 459 | "talent": 15.22 460 | }, { 461 | "name": "Presbyterian", 462 | "talent": 14.91 463 | }, { 464 | "name": "Elon", 465 | "talent": 13.41 466 | }, { 467 | "name": "Villanova", 468 | "talent": 11.65 469 | }, { 470 | "name": "New Hampshire", 471 | "talent": 11.21 472 | }] --------------------------------------------------------------------------------