コード例 #1
0
ファイル: simulateGW.py プロジェクト: harryrgrove/FPLmodel
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)
コード例 #2
0
ファイル: bonus.py プロジェクト: harryrgrove/FPLmodel
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
コード例 #3
0
ファイル: bonus.py プロジェクト: harryrgrove/FPLmodel
        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
        ]))
コード例 #4
0
ファイル: rawDataUpdate.py プロジェクト: harryrgrove/FPLmodel
 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))
コード例 #5
0
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(
コード例 #6
0
ファイル: simulatePts.py プロジェクト: harryrgrove/FPLmodel
    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)))))