def simulateGW(gw, SD): fixtures = fixtureDict[gw] playerDict = {} for team, lineup in lineups.items(): for player in lineup: playerDict[player] = 0 for fixture in fixtures: print(fixture[0] + '.' * (44 - len(fixture[0] + fixture[1])) + fixture[1]) print(simulate(fixture[0], fixture[1])) for fixture in fixtures: for player, pts in simulateBonus(fixture[0], fixture[1], SD).items(): playerDict[player] += pts print('\n' * 2) print('Most bonus points:', [(getPlayer(i[0], 'understat', 'name'), i[1]) for i in sorted(list(playerDict.items()), key=lambda i: i[1], reverse=True)[:10]]) xPtsDB[str(gw)] = {} for fixture in fixtures: for player, pts in simulateBonus(fixture[0], fixture[1], SD).items(): if player in lineups[fixture[0]]: loc = 'h' elif player in lineups[fixture[1]]: loc = 'a' playerDict[player] += simulatePts(getPosition(player, 'understat'), player, loc, (loc == 'h') * fixture[1] + (loc == 'a') * fixture[0], SD) xPtsDB[str(gw)][str(player)] = playerDict[player] print('\n') for i in sorted(list(playerDict.items()), key=lambda i: i[1], reverse=True): print(getPlayer(i[0], 'understat', 'name') + '.' * (30 - len(getPlayer(i[0], 'understat', 'name'))) + str(i[1])[ :4] + ( 4 - len(str(i[1]))) * '0') print('Mean among top 21 assets: ' + str( np.mean([i[1] for i in sorted(list(playerDict.items()), key=lambda i: i[1], reverse=True)[:30]]))[:4]) with open('xPtsDB.json', 'w') as fp: json.dump(xPtsDB, fp)
def simulateBonus(homeTeam, awayTeam, SD): homeLineup, awayLineup = lineups[homeTeam], lineups[awayTeam] xReturns = {player: [] for player in homeLineup + awayLineup} bonus = {player: [] for player in homeLineup + awayLineup} for player in homeLineup: xReturns[player] = simulateReturns( getPosition(player, 'understat'), player, 'h', awayTeam, SD) + [getPosition(player, 'understat')] for player in awayLineup: xReturns[player] = simulateReturns( getPosition(player, 'understat'), player, 'a', homeTeam, SD) + [getPosition(player, 'understat')] CSOdds = simulateCleanSheet(homeTeam, awayTeam) trials = 10000 for repeat in range(trials): homeBPS, awayBPS = {player: 0 for player in homeLineup }, {player: 0 for player in awayLineup} for player in homeLineup: homeBPS[player] += np.random.normal( baselineDB[homeTeam][str(player)][0], baselineDB[homeTeam][str(player)][1]) goals = np.random.poisson(xReturns[player][0]) for goal in range(goals): homeBPS[player] += { 'GKP': 12, 'DEF': 12, 'MID': 18, 'FOR': 24 }[xReturns[player][2]] if random() < xAConstant: assist = [[ player, xReturns[player][1] ] for player in [i for i in homeLineup if i != player]] r = random() * sum([i[1] for i in assist]) for entry in assist: if r < entry[1]: homeBPS[entry[0]] += 9 break r -= entry[1] if random() < CSOdds[0]: for player in [ player for player in homeLineup if xReturns[player][2] == 'GKP' or xReturns[player][2] == 'DEF' ]: homeBPS[player] += 12 for player in awayLineup: awayBPS[player] += np.random.normal( baselineDB[awayTeam][str(player)][0], baselineDB[awayTeam][str(player)][1]) goals = np.random.poisson(xReturns[player][0]) for goal in range(goals): awayBPS[player] += { 'GKP': 12, 'DEF': 12, 'MID': 18, 'FOR': 24 }[xReturns[player][2]] if random() < xAConstant: assist = [[ player, xReturns[player][1] ] for player in [i for i in awayLineup if i != player]] r = random() * sum([i[1] for i in assist]) for entry in assist: if r < entry[1]: awayBPS[entry[0]] += 9 break r -= entry[1] if random() < CSOdds[1]: for player in [ player for player in awayLineup if xReturns[player][2] == 'GKP' or xReturns[player][2] == 'DEF' ]: awayBPS[player] += 12 BPS = sorted([(i[0], i[1]) for i in list({ **homeBPS, **awayBPS }.items())], key=lambda x: x[1], reverse=True) bonus[BPS[0][0]].append(3) bonus[BPS[1][0]].append(2) bonus[BPS[2][0]].append(1) for player, scores in bonus.items(): bonus[player] = sum(scores) / trials return bonus
bonus[BPS[1][0]].append(2) bonus[BPS[2][0]].append(1) for player, scores in bonus.items(): bonus[player] = sum(scores) / trials return bonus if __name__ == '__main__': print('\n' * 2) print( sorted(list(simulateBonus('Leicester', 'West Ham', 10).items()), key=lambda x: x[1], reverse=True)) print('\n' * 2) baselineArray = [] for team in teams: for player in baselineDB[team]: baselineArray.append((int(player), baselineDB[team][player][0])) for i in sorted(baselineArray, key=lambda i: i[1], reverse=True): if i[1] != 0 or i[0] == 5675: print( getPosition(i[0], 'understat'), getPlayer(i[0], 'understat', 'name') + '.' * (30 - len(getPlayer(i[0], 'understat', 'name'))) + str(round(i[1], 1))) print( np.mean([ i[1] for i in baselineArray if getPosition(i[0], 'understat') == 'FOR' and i[1] != 0 ]))
def baselineBonus(understat): poisition = getPosition(understat, 'understat') mean, sd = 0, 0 GWStats, baselineBPS = [], [] name = getPlayer(understat, 'understat', 'name').replace(' ', '_', 1) exceptions = { 619: 'Sergio_Ag%C3%BCero', 3293: 'Lucas_Rodrigues Moura da Silva', 1040: 'José Ángel_Esmorís Tasende', 1208: 'Felipe Anderson_Pereira Gomes', 5741: 'Jorge Luiz_Frello Filho', 1663: 'Johann Berg_Gudmundsson', 1676: 'David_Luiz Moreira Marinho', 1724: 'Isaac_Success Ajayi', 2132: 'José Ignacio_Peleteiro Romallo', 2379: 'João Pedro Cavaco_Cancelo', 2383: 'André Filipe_Tavares Gomes', 2446: 'Daniel_Ceballos Fernández', 3303: 'Ricardo Domingos_Barbosa Pereira', 3422: 'João Filipe Iria_Santos Moutinho', 5245: 'Bernardo_Fernandes da Silva Junior', 3635: 'Bernardo Mota_Veiga de Carvalho e Silva', 5543: 'Gabriel Fernando_de Jesus', 5675: 'Ismaïla_Sarr', 579: 'Nathan_Aké', 6122: 'Douglas Luiz_Soares de Paulo', 614: 'Fernando_Luiz Rosa', 6817: 'Frederico_Rodrigues de Paula Santos', 6853: 'Rúben Diogo_da Silva Neves', 6856: 'Rúben Gonçalo_Silva Nascimento Vinagre', 700: 'Willian_Borges Da Silva', 7752: 'Gabriel Teodoro_Martinelli Silva', 87: 'Joelinton Cássio_Apolinário de Lira' } if understat in exceptions: name = exceptions[understat] url = 'https://raw.githubusercontent.com/vaastav/Fantasy-Premier-League/master/data/2019-20/players/' + name + '_' + str( getPlayer(understat, 'understat', 'fpl')) + '/gw.csv' r = requests.get(url) text = r.iter_lines() reader = csv.reader(text, delimiter=',') for line in text: if str(line) == "b'404: Not Found'": if understat in exceptions: print(understat) return (0, 0) GWStats.append(str(line)[2:-1].split(",")) for row in GWStats[1:]: if row != ['']: if int(row[12]) >= 60: baselineBPS.append( int(row[2]) - int(row[8]) * (12 * (poisition == 'DEF' or poisition == 'GKP') + 18 * (poisition == 'MID') + 24 * (poisition == 'FOR')) - int(row[0]) * 9 - int(row[3]) * 12 * (poisition == 'DEF' or poisition == 'MID')) if len(baselineBPS) < 1: return (0, 0) return (np.mean(baselineBPS), np.std(baselineBPS))
teamCodes = {team: i for team in teams for i in range(len(teams))} DB = compileGWs(GWStart, GWEnd) players = [ player for player in DB if int(player) not in blacklist and isStarter(int(player), 'understat') == True ] prob = LpProblem("optimiseTeam", LpMaximize) useVars = LpVariable.dicts("usePlayer", players, 0, 1, LpBinary) prob += lpSum([DB[j] * useVars[j] for j in useVars]) prob += lpSum( priceDB[j] * useVars[j] for j in useVars ) <= TV - 3.9 * (5 - lpSum([ useVars[i] for i in useVars if getPosition(int(i), 'understat') == 'DEF' ])) - 4.3 * (5 - lpSum([ useVars[i] for i in useVars if getPosition(int(i), 'understat') == 'MID' ])) - 4.3 * (3 - lpSum( [useVars[i] for i in useVars if getPosition(int(i), 'understat') == 'FOR'])) prob += lpSum([ useVars[i] for i in useVars if getPosition(int(i), 'understat') == 'GKP' ]) == 1 prob += lpSum( [useVars[i] for i in useVars if getPosition(int(i), 'understat') == 'DEF']) >= 3 prob += lpSum( [useVars[i] for i in useVars if getPosition(int(i), 'understat') == 'DEF']) <= 5 prob += lpSum(
points = [] for GW in range(GWStart, GWEnd + 1): points.append(xPtsDB[str(GW)][str(name)]) return points def GWForecast(GW=nextGW): return sorted([(int(i[0]), i[1]) for i in list(xPtsDB[str(GW)].items())], key=lambda i: i[1], reverse=True) if __name__ == '__main__': playerDict = {} for team, lineup in lineups.items(): for player in lineup: playerDict[player] = sum(simulatePtsRun(player, 27)) for player in sorted(list(playerDict.items()), key=lambda i: i[1], reverse=True): print(getPlayer(player[0], 'understat', 'name') + '.' * ( 30 - len(getPlayer(player[0], 'understat', 'name'))) + str(round(player[1], 1))) print('\n') end = 30 player = 'Martial' print(sum(simulatePtsRun(getPlayer(player), end, nextGW)), simulatePtsRun(getPlayer(player), end, nextGW)) player = 'Grealish' print(sum(simulatePtsRun(getPlayer(player), end, nextGW)), simulatePtsRun(getPlayer(player), end, nextGW)) print('\n') for player in GWForecast(nextGW): if getPosition(player[0], 'understat') == 'MID': print(getPlayer(player[0], 'understat', 'name') + '.' * ( 30 - len(getPlayer(player[0], 'understat', 'name'))) + str(round(player[1], 2)) + '0' * ( 4 - len(str(round(player[1], 2)))))