コード例 #1
0
ファイル: test_optimize.py プロジェクト: timcoz88/draftfast
def test_no_opposing_def_dk_nfl():
    players = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        projection_file_location=projection_file,
        game=rules.DRAFT_KINGS,
    )

    roster = run(
        rule_set=rules.DK_NFL_RULE_SET,
        player_pool=players,
        optimizer_settings=OptimizerSettings(no_offense_against_defense=True),
        constraints=LineupConstraints(locked=['Bengals']),
        verbose=True)

    for p in roster.players:
        if p.pos in rules.DK_NFL_RULE_SET.offensive_positions:
            ntools.assert_not_equal(p.team, 'CIN')

    # force impossible lineup
    roster = run(
        rule_set=rules.DK_NFL_RULE_SET,
        player_pool=players,
        optimizer_settings=OptimizerSettings(no_offense_against_defense=True),
        constraints=LineupConstraints(locked=['Bengals', 'Ryan Fitzpatrick']),
        verbose=True)

    ntools.assert_equal(roster, None)
コード例 #2
0
def optimize(all_players: list,
             player_settings: PlayerPoolSettings = PlayerPoolSettings(),
             constraints: LineupConstraints = LineupConstraints()):
    lineup_players = []
    all_players = list(
        filter(add_pickem_contraints(player_settings), all_players))

    if constraints.has_group_constraints():
        raise NotImplementedError('Groups are not supported for pickem')

    for p in all_players:
        if constraints.is_banned(p.name):
            p.ban = True

    for t in TIERS:
        best = sorted(
            [p for p in all_players if p.tier == t and not p.ban],
            key=lambda p: p.proj,
            reverse=True,
        )[0]

        lineup_players.append(best)

    lineup = TieredLineup(lineup_players)

    for p in all_players:
        if constraints.is_locked(p.name):
            p.lock = True
            setattr(lineup, p.tier, p)

    return lineup
コード例 #3
0
ファイル: test_optimize.py プロジェクト: timcoz88/draftfast
def test_no_opposing_def_fd_nfl():
    players = salary_download.generate_players_from_csvs(
        salary_file_location=fd_nfl_salary_file,
        game=rules.FAN_DUEL,
    )
    roster = run(
        rule_set=rules.FD_NFL_RULE_SET,
        player_pool=players,
        optimizer_settings=OptimizerSettings(no_offense_against_defense=True),
        constraints=LineupConstraints(locked=['Jacksonville Jaguars']),
        verbose=True)

    ntools.assert_not_equal(roster, None)

    for p in roster.players:
        if p.pos in rules.DK_NFL_RULE_SET.offensive_positions:
            ntools.assert_not_equal(p.team, 'IND')

    # force impossible lineup
    roster = run(
        rule_set=rules.FD_NFL_RULE_SET,
        player_pool=players,
        optimizer_settings=OptimizerSettings(no_offense_against_defense=True),
        constraints=LineupConstraints(
            locked=['Eric Ebron', 'Jacksonville Jaguars']),
        verbose=True)

    ntools.assert_equal(roster, None)
コード例 #4
0
def test_build_constraint_set():
    lcs = LineupConstraints()
    lcs.add_group_constraint(['Spencer Ware', 'Amari Cooper'], 1)
    lcs.ban(['Packers'])
    lcs.add_group_constraint(['Eli Manning', 'Russell Wilson', 'Doug Martin'],
                             (1, 3))
    lcs.lock(['Will Fuller'])

    ntools.assert_equal(len(lcs), 4)
コード例 #5
0
def test_constraint_contains():
    lcs = LineupConstraints()
    lcs.add_group_constraint(['A', 'B'], 1)
    lcs.ban(['C'])
    lcs.add_group_constraint(['E', 'F', 'G'], (1, 3))
    lcs.lock(['H'])

    for c in ['A', 'B', 'C', 'E', 'F', 'G', 'H']:
        ntools.assert_equal(c in lcs, True)
コード例 #6
0
ファイル: test_optimize.py プロジェクト: timcoz88/draftfast
def test_te_combo():
    # use lock and ban to make a non-globally optimal QB/TE combo optimal
    players = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        projection_file_location=projection_file,
        game=rules.DRAFT_KINGS,
    )
    roster = run(
        rule_set=rules.DK_NFL_RULE_SET,
        player_pool=players,
        optimizer_settings=OptimizerSettings(
            force_combo=True,
            combo_allow_te=True,
        ),
        constraints=LineupConstraints(
            banned=['Kellen Davis'],
            locked=['Philip Rivers'],
        ),
        verbose=True,
    )
    qb = roster.sorted_players()[0]
    ntools.assert_equal(qb.pos, 'QB')
    team_count = len([
        x for x in roster.sorted_players()
        if x.team == qb.team and x.pos == 'TE'
    ])
    ntools.assert_equals(team_count, 1)

    # make sure WR/QB still works
    players = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        projection_file_location=projection_file,
        game=rules.DRAFT_KINGS,
    )
    roster = run(
        rule_set=rules.DK_NFL_RULE_SET,
        player_pool=players,
        optimizer_settings=OptimizerSettings(
            force_combo=True,
            combo_allow_te=True,
        ),
        constraints=LineupConstraints(locked=['Andrew Luck'], ),
        verbose=True,
    )
    qb = roster.sorted_players()[0]
    ntools.assert_equal(qb.pos, 'QB')
    team_count = len([
        x for x in roster.sorted_players()
        if x.team == qb.team and x.pos == 'WR'
    ])
    ntools.assert_equals(team_count, 1)
コード例 #7
0
def test_soccer_dk_no_opp_d():
    player_pool = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        game=rules.DRAFT_KINGS,
    )
    roster = run(
        rule_set=rules.DK_SOCCER_RULE_SET,
        player_pool=player_pool,
        constraints=LineupConstraints(
            locked=['Maxi Gomez'],
        ),
        optimizer_settings=OptimizerSettings(
            no_offense_against_defense=False,
        ),
        verbose=True,
    )
    cel_off_players = [
        p for p in roster.players if p.team == 'CEL'
        and p.pos in ['M', 'F']
    ]
    lgn_d_players = [
        p for p in roster.players if p.team == 'LGN'
        and p.pos in ['D', 'GK']
    ]
    ntools.assert_equal(len(cel_off_players), 2)
    ntools.assert_equal(len(lgn_d_players), 2)

    roster = run(
        rule_set=rules.DK_SOCCER_RULE_SET,
        player_pool=player_pool,
        constraints=LineupConstraints(
            locked=['Maxi Gomez'],
        ),
        optimizer_settings=OptimizerSettings(
            no_offense_against_defense=True,
        ),
        verbose=True,
    )
    cel_off_players = [
        p for p in roster.players if p.team == 'CEL'
        and p.pos in ['M', 'F']
    ]
    lgn_d_players = [
        p for p in roster.players if p.team == 'LGN'
        and p.pos in ['D', 'GK']
    ]
    ntools.assert_equal(len(cel_off_players), 2)
    ntools.assert_equal(len(lgn_d_players), 0)
コード例 #8
0
def run_multi(
    iterations: int,
    rule_set: RuleSet,
    player_pool: list,
    constraints: LineupConstraints = LineupConstraints(),
    player_settings: PlayerPoolSettings = PlayerPoolSettings(),
    optimizer_settings: OptimizerSettings = OptimizerSettings(),
    verbose=False,
    exposure_bounds: List[dict] = list(),
    exposure_random_seed=None,
) -> [List[Roster], list]:
    # set the random seed globally for random lineup exposure
    random.seed(exposure_random_seed)

    rosters = []
    for _ in range(0, iterations):
        exposure_dict = get_exposure_args(
            existing_rosters=optimizer_settings.existing_rosters,
            exposure_bounds=exposure_bounds,
            n=iterations,
            use_random=bool(exposure_random_seed),
            random_seed=exposure_random_seed,
        )

        roster = run(
            rule_set=rule_set,
            player_pool=player_pool,
            optimizer_settings=optimizer_settings,
            player_settings=player_settings,
            exposure_dict=exposure_dict,
            constraints=constraints,
            verbose=verbose,
        )
        if roster:
            optimizer_settings.existing_rosters += [roster]

        if roster:
            rosters.append(roster)
        else:
            break

        # clear ban/lock to reset exposure between iterations
        reset_player_ban_lock(player_pool)

    exposure_diffs = {}

    if rosters and verbose:
        print(get_exposure_table(rosters, exposure_bounds))
        print()
        print(get_exposure_matrix(rosters))
        print()

        exposure_diffs = check_exposure(rosters, exposure_bounds)
        for n, d in exposure_diffs.items():
            if d < 0:
                print('{} is UNDER exposure by {} lineups'.format(n, d))
            else:
                print('{} is OVER exposure by {} lineups'.format(n, d))

    return rosters, exposure_diffs
コード例 #9
0
def test_banned_players():
    players = _generate_test_player_data()

    optimized = optimize(players,
                         player_settings=PlayerPoolSettings(),
                         constraints=LineupConstraints(banned=['A', 'C']))
    ntools.assert_equal(optimized.total, 49 + 47 + 46 + 44 + 42 + 40)
コード例 #10
0
ファイル: test_optimize.py プロジェクト: timcoz88/draftfast
def test_force_combo():
    # no combo
    players = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        projection_file_location=projection_file,
        game=rules.DRAFT_KINGS,
    )
    roster = run(
        rule_set=rules.DK_NFL_RULE_SET,
        player_pool=players,
        optimizer_settings=OptimizerSettings(
            stacks=[Stack(team='NE', count=5)]),
        constraints=LineupConstraints(locked=['Sam Bradford'], ),
    )
    qb = roster.sorted_players()[0]
    team_count = len([x for x in roster.sorted_players() if x.team == qb.team])
    ntools.assert_equals(team_count, 1)

    # QB/WR combo
    players = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        projection_file_location=projection_file,
        game=rules.DRAFT_KINGS,
    )
    roster = run(
        rule_set=rules.DK_NFL_RULE_SET,
        player_pool=players,
        optimizer_settings=OptimizerSettings(force_combo=True, ),
        constraints=LineupConstraints(banned=['Ryan Fitzpatrick']),
        verbose=True,
    )
    qb = roster.sorted_players()[0]
    ntools.assert_equal(qb.pos, 'QB')

    wr_team_count = len([
        x for x in roster.sorted_players()
        if x.team == qb.team and x.pos == 'WR'
    ])
    ntools.assert_equals(wr_team_count, 1)

    te_team_count = len([
        x for x in roster.sorted_players()
        if x.team == qb.team and x.pos == 'TE'
    ])
    ntools.assert_equals(te_team_count, 0)
コード例 #11
0
ファイル: rostering.py プロジェクト: idhoc/draftfast
    def _compile_params(self):

        if self.stacks:
            optimizers = OptimizerSettings(
                stacks=[
                    Stack(
                        team=good['team'],
                        count=good['count'],
                        stack_lock_pos=good['lock'],
                        stack_eligible_pos=good['eligible']
                    )
                    for good in self.stacks
                ],
            )
        else:
            optimizers = OptimizerSettings()

        exposures = self.exposures

        groups = []

        if self.targets:
            for k in self.targets.keys():
                groups.append(
                    [
                        self.targets[k]['players'],
                        (
                            self.targets[k]['lower'],
                            self.targets[k]['upper']
                        )
                    ]
                )

        if self.banned or groups:
            constraints = LineupConstraints(
                banned=self.banned,
                groups=groups
            )
        else:
            constraints = LineupConstraints()

        return constraints, exposures, optimizers
コード例 #12
0
ファイル: test_optimize.py プロジェクト: timcoz88/draftfast
def test_no_mutate_side_Effect():
    players = salary_download.generate_players_from_csvs(
        salary_file_location=fd_nfl_salary_file,
        game=rules.FAN_DUEL,
    )
    run(rule_set=rules.FD_NFL_RULE_SET,
        player_pool=players,
        optimizer_settings=OptimizerSettings(no_offense_against_defense=True),
        constraints=LineupConstraints(locked=['Tom Brady']),
        verbose=True)
    brady = next((p for p in players if p.name == 'Tom Brady'))
    ntools.assert_equal(brady.lock, False)
コード例 #13
0
def test_nfl_showdown_ban_general():
    mock_dk_pool = _build_mock_player_pool()

    roster = run(rule_set=rules.DK_NFL_SHOWDOWN_RULE_SET,
                 player_pool=mock_dk_pool,
                 optimizer_settings=OptimizerSettings(
                     showdown_teams=('X', 'Y'),
                     no_defense_against_captain=True,
                 ),
                 constraints=LineupConstraints(banned=['A1'], ),
                 verbose=True)
    ntools.assert_not_equal(roster, None)
    ntools.assert_equal(roster.projected(), 334.0)
    ntools.assert_true('A1' not in [x.name for x in roster.players])
コード例 #14
0
ファイル: test_optimize.py プロジェクト: timcoz88/draftfast
def test_multi_position():
    players = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        projection_file_location=projection_file,
        game=rules.DRAFT_KINGS,
    )
    roster = run(rule_set=rules.DK_NFL_RULE_SET,
                 player_pool=players,
                 constraints=LineupConstraints(locked=['Eli Manning'], ),
                 verbose=True)
    ntools.assert_not_equal(roster, None)
    multi_pos = [p for p in roster.players if p.name == 'Eli Manning']
    ntools.assert_equal(len(multi_pos), 1)
    ntools.assert_equal(multi_pos[0].pos, 'TE')
コード例 #15
0
def test_nfl_showdown_ban_specific():
    mock_dk_pool = _build_mock_player_pool()

    roster = run(rule_set=rules.DK_NFL_SHOWDOWN_RULE_SET,
                 player_pool=mock_dk_pool,
                 optimizer_settings=OptimizerSettings(
                     showdown_teams=('X', 'Y'),
                     no_defense_against_captain=True,
                 ),
                 constraints=LineupConstraints(position_banned=['A1 CPT X'], ),
                 verbose=True)
    ntools.assert_not_equal(roster, None)
    ntools.assert_equal(roster.projected(), 386.0)
    flex = [x for x in roster.players if x.pos == 'FLEX' and x.name == 'A1'][0]
    ntools.assert_equal('A1', flex.name)
コード例 #16
0
ファイル: test_optimize.py プロジェクト: timcoz88/draftfast
def test_respect_ban():
    players = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        projection_file_location=projection_file,
        game=rules.DRAFT_KINGS,
    )

    roster = run(
        rule_set=rules.DK_NFL_RULE_SET,
        player_pool=players,
        verbose=True,
        constraints=LineupConstraints(banned=['Eli Manning'], ),
    )
    for player in roster.sorted_players():
        ntools.assert_not_equal(player.name, 'Eli Manning')
コード例 #17
0
def test_nfl_showdown_lock_captain():
    mock_dk_pool = _build_mock_player_pool()

    roster = run(rule_set=rules.DK_NFL_SHOWDOWN_RULE_SET,
                 player_pool=mock_dk_pool,
                 optimizer_settings=OptimizerSettings(
                     showdown_teams=('X', 'Y'),
                     no_defense_against_captain=True,
                 ),
                 constraints=LineupConstraints(position_locked=['A2 CPT X'], ),
                 verbose=True)
    ntools.assert_not_equal(roster, None)
    ntools.assert_equal(roster.projected(), 370.5)
    cpt = [x for x in roster.players if x.pos == 'CPT'][0]
    ntools.assert_equal('A2', cpt.name)
コード例 #18
0
ファイル: test_optimize.py プロジェクト: timcoz88/draftfast
def test_respect_lock():
    players = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        projection_file_location=projection_file,
        game=rules.DRAFT_KINGS,
    )

    roster = run(
        rule_set=rules.DK_NFL_RULE_SET,
        player_pool=players,
        verbose=True,
        constraints=LineupConstraints(locked=['Andrew Luck'], ),
    )
    qb = roster.sorted_players()[0]
    ntools.assert_equal(qb.pos, 'QB')
    ntools.assert_equal(qb.name, 'Andrew Luck')
コード例 #19
0
ファイル: test_optimize.py プロジェクト: timcoz88/draftfast
def test_respect_group1():
    players = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        projection_file_location=projection_file,
        game=rules.DRAFT_KINGS,
    )

    grouped_players = ('DeAndre Hopkins', 'Amari Cooper', 'Sammy Watkins')

    roster = run(
        rule_set=rules.DK_NFL_RULE_SET,
        player_pool=players,
        verbose=True,
        constraints=LineupConstraints(groups=[[grouped_players, 2]], ),
    )

    group_count = len(
        [x for x in roster.sorted_players() if x.name in grouped_players])
    ntools.assert_equal(group_count, 2)
コード例 #20
0
ファイル: test_optimize.py プロジェクト: timcoz88/draftfast
def test_multi_position_group_constraint2():
    players = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        projection_file_location=projection_file,
        game=rules.DRAFT_KINGS,
    )

    grouped_players = ('Eli Manning', 'Dez Bryant', 'Geno Smith')

    roster = run(rule_set=rules.DK_NFL_RULE_SET,
                 player_pool=players,
                 constraints=LineupConstraints(groups=[
                     [grouped_players, 2],
                 ]),
                 verbose=True)

    group_count = len(
        [x for x in roster.sorted_players() if x.name in grouped_players])
    ntools.assert_equal(group_count, 2)
    ntools.assert_equal(roster.projected(), 120.89999999999999)
コード例 #21
0
ファイル: test_optimize.py プロジェクト: timcoz88/draftfast
def test_impossible_constraints():
    players = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        projection_file_location=projection_file,
        game=rules.DRAFT_KINGS,
    )
    roster = run(rule_set=rules.DK_NFL_RULE_SET,
                 player_pool=players,
                 optimizer_settings=OptimizerSettings(
                     stacks=[Stack(team='NE', count=100)],
                     no_offense_against_defense=True),
                 constraints=LineupConstraints(
                     banned=['Sammy Watkins', 'Kellen Davis'],
                     locked=['Spencer Ware'],
                     groups=[[('Philip Rivers', 'Sam Bradford', 'Andrew Luck'),
                              2],
                             [('Saints', 'Alshon Jeffery', 'Lamar Miller'),
                              (1, 3)]]),
                 verbose=True)

    ntools.assert_equal(roster, None)
コード例 #22
0
ファイル: test_optimize.py プロジェクト: timcoz88/draftfast
def test_multi_position_group_constraint():
    players = [
        Player(name='A',
               cost=5500,
               proj=400,
               pos='QB',
               possible_positions='QB/WR',
               multi_position=True),
        Player(name='A',
               cost=5500,
               proj=400,
               pos='WR',
               possible_positions='QB/WR',
               multi_position=True),
        Player(name='B', cost=5500, proj=41, pos='QB'),
        Player(name='C',
               cost=5500,
               proj=500,
               pos='WR',
               possible_positions='RB/WR',
               multi_position=True),
        Player(name='C',
               cost=5500,
               proj=500,
               pos='RB',
               possible_positions='RB/WR',
               multi_position=True),
        Player(name='D', cost=5500, proj=42, pos='WR'),
        Player(name='E', cost=5500, proj=43, pos='WR'),
        Player(name='F', cost=5500, proj=44, pos='WR'),
        Player(name='G', cost=5500, proj=45, pos='RB'),
        Player(name='H', cost=5500, proj=46, pos='RB'),
        Player(name='I', cost=5500, proj=47, pos='RB'),
        Player(name='J',
               cost=5500,
               proj=480,
               pos='TE',
               possible_positions='TE/WR',
               multi_position=True),
        Player(name='J',
               cost=5500,
               proj=480,
               pos='WR',
               possible_positions='TE/WR',
               multi_position=True),
        Player(name='K', cost=5500, proj=49, pos='TE'),
        Player(name='L', cost=5500, proj=51, pos='DST'),
        Player(name='M', cost=5500, proj=52, pos='DST'),
    ]

    grouped_players = ('A', 'C', 'J')

    roster = run(rule_set=rules.DK_NFL_RULE_SET,
                 player_pool=players,
                 constraints=LineupConstraints(groups=[
                     [grouped_players, 2],
                 ]),
                 verbose=True)

    group_count = len(
        [x for x in roster.sorted_players() if x.name in grouped_players])
    ntools.assert_equal(group_count, 2)
    ntools.assert_equal(roster.projected(), 1304)
コード例 #23
0
def test_constraint_string_args():
    lcs = LineupConstraints()
    lcs.ban('Sam Bradford')
    lcs.lock('Will Fuller')
    ntools.assert_equal(len(lcs), 2)
コード例 #24
0
def test_locked_players():
    players = _generate_test_player_data()

    optimized = optimize(players,
                         constraints=LineupConstraints(locked=['B', 'D']))
    ntools.assert_equal(optimized.total, 49 + 47 + 46 + 44 + 42 + 40)
コード例 #25
0
def optimizeJSON(payload):
    raw = pd.read_json((payload["raw"]))
    data = pd.read_json((payload["posted"]))
    optimizer = None
    if (payload["site"] == "DRAFTKINGS"):
        if (payload["sport_type"] == "PGA"):
            optimizer = get_optimizer(Site.DRAFTKINGS, Sport.GOLF)
        elif (payload["sport_type"] == "NFL"):
            optimizer = get_optimizer(Site.DRAFTKINGS, Sport.FOOTBALL)
        else:
            optimizer = get_optimizer(Site.DRAFTKINGS, Sport.BASKETBALL)
        raw['AvgPointsPerGame'] = raw[payload["projection"]]
        raw['AvgPointsPerGame'] = pd.to_numeric(raw["AvgPointsPerGame"]).fillna(0)
    else:
        if (payload["sport_type"] != "PGA"):
            optimizer = get_optimizer(Site.FANDUEL, Sport.FOOTBALL)
        if (payload["sport_type"] == "NBA"):
            optimizer = get_optimizer(Site.FANDUEL, Sport.BASKETBALL)
        raw['FPPG'] = raw[payload["projection"]]
        raw['FPPG'] = pd.to_numeric(raw["FPPG"]).fillna(0)
        raw['First Name'] = raw['Name']
        raw['Last Name'] = raw['Name']
        raw['Nickname'] = raw['Name']
        raw["Injury Indicator"] = ""
        raw['Team'] = raw['TeamAbbrev']
    # if os.path.exists("lineup.csv"):
        # os.remove("lineup.csv")
    lineup_writer = open('/home/johnh/lineup.csv', 'w+')
    lineup_writer.close()
    raw.to_csv("/home/johnh/lineup.csv")

    del raw
     
    if payload["site"] == "FANDUEL" and payload["sport_type"] == "PGA":
        
        players = salary_download.generate_players_from_csvs(
            salary_file_location='/home/johnh/lineup.csv',
            game=rules.FAN_DUEL,
        )
        
        iterations=payload["lineups"]
        index = 0
        exposure_players = []
        locked = []
        removed = []

        for r in data["Name"]:
            if (data["Lock"][index] == 0) and (data["Remove"][index] == 0):
                exp_player = {}
                exp_player["name"] = r
                exp_player["min"] = 0.1
                exp_player["max"] = data["Exposure"][index] / 100.0
                exposure_players.append(exp_player)
            if (data["Lock"][index] == 1) and (data["Remove"][index] == 0):
                locked.append(data["Name"][index])
            if (data["Lock"][index] == 0) and (data["Remove"][index] == 1):
                removed.append(data["Name"][index])
            index = index + 1
        
        rosters, exposure_diffs  = run_multi(
            iterations=iterations,
            rule_set=rules.FD_PGA_RULE_SET,
            player_pool=players,
            exposure_bounds=exposure_players,
            constraints=LineupConstraints(
                locked=locked,
                banned=removed
            )
        )
               
        ntools.assert_equal(len(rosters), iterations)
        ntools.assert_equal(len(exposure_diffs), 0)

        lineups = []
        exports = []
        exports.append(["G","G","G","G","G","G","Budget","FPPG"])
        for r in rosters:
            export = []
            for p in r.sorted_players():
                lineup = []
                lineup.append("G")
                lineup.append(p.name)
                lineup.append(p.team)
                lineup.append(p.proj)
                lineup.append(p.cost)
                lineups.append(lineup)
                name_index = list(data["Name"]).index(p.name)
                export.append(data["ID"][name_index] + ":" + p.name)
            total = ["", "", ""]
            total.append("{0:.2f}".format(round(r.projected(),2)))
            total.append(r.spent())
            lineups.append(total)
            exports.append(export)
        
        del lineups
        del exports
        del total
        del iterations
        del exposure_players
        del locked
        del removed

        result = {"lineups": lineups,
                  "export": exports}
        return result

    optimizer.load_players_from_csv("/home/johnh/lineup.csv")

    # advanced options (lock, remove and exposure)
    
    for index, row in data.iterrows():

        if (row['Remove'] == 1):
            print("Removing player: " + row['Name'], row['Remove'])
            player = optimizer.get_player_by_id(row['ID'])
            optimizer.remove_player(player)
        if (row['Lock'] == 1):
            print("Lock player: " + row['Name'], row['Remove'])
            player = optimizer.get_player_by_id(row['ID'])
            optimizer.add_player_to_lineup(player)
        if ((row['Exposure'] >= 0) and (row['Exposure'] < 100)):
            #print("Set exposure : " + row['Name'], row['Exposure'] / 100.0)
            player = optimizer.get_player_by_id(row['ID'])
            #print(player)
            player.max_exposure = row['Exposure'] / 100.0
    if (payload["sport_type"] == "NFL") and (payload["site"] == "DRAFTKINGS"):
        optimizer.set_min_salary_cap(49500)        
    lineupGenerator = optimizer.optimize(payload["lineups"])

    def render_player(player):
        # type: (LineupPlayer) -> str
        result = player.full_name
        #print player.id
        if player.id:
            # if payload["site"] == "FANDUEL" and payload["sport_type"] == "NFL":
                # result = player.id + ":" + result
            # else:
            result += '(%s)' % player.id
        return result

    rows = []
    header = None
    print(lineupGenerator)
    for index, lineup in enumerate(lineupGenerator):
        if index == 0:
            header = [player.lineup_position for player in lineup.lineup]
            header.extend(('Budget', 'FPPG'))
        row = [(render_player)(player) for player in lineup.lineup]
        row.append(str(lineup.salary_costs))
        row.append(str(lineup.fantasy_points_projection))
        rows.append(row)

    data = pd.DataFrame.from_records(rows, columns = header)

    lineups = pd.DataFrame()

    names = []
    positions = []
    teams = []
    fppgs = []
    salaries = []

    # add number to duplicate cols
    def rename_duplicates(old):
        new = []
        seen = {}
        for x in old:
            if x in seen:
                seen[x] += 1
                new.append( "%s_%d" % (x, seen[x]))
            else:
                seen[x] = 0
                new.append(x)
        return new

    data.columns = rename_duplicates(list(data.columns))

    for index, row in data.iterrows():
        for player in data.columns[:-2]:
            playerName = row[player].split("(")[0]
            names.append(playerName)
            positions.append(player)
            player = optimizer.get_player_by_name(playerName)
            fppgs.append(player.fppg)
            teams.append(player.team)
            salaries.append(player.salary)
        positions.append("Totals")
        names.append("")
        teams.append("")
        fppgs.append(row["FPPG"])
        salaries.append(row["Budget"])

        positions.append("")
        names.append("")
        teams.append("")
        fppgs.append("")
        salaries.append("")

        # print row["PG"]

    lineups["Positions"] = positions
    lineups["Name"] = names
    lineups["Team"] = teams
    lineups["Projection"] = fppgs
    lineups["salaries"] = salaries

    result = {"lineups": lineups.values.tolist(),
              "export": [list(data.columns)] + data.values.tolist()}
    
    del payload
    
    return jsonify(result)
コード例 #26
0
ファイル: optimize.py プロジェクト: trackness/draftfast
def run(rule_set: RuleSet,
        player_pool: list,
        constraints: LineupConstraints = LineupConstraints(),
        optimizer_settings: OptimizerSettings = OptimizerSettings(),
        player_settings: PlayerPoolSettings = PlayerPoolSettings(),
        exposure_dict: dict = dict(),
        roster_gen: Roster = None,
        verbose=False) -> Roster:
    players = player_pool
    if player_settings.exist() or constraints.exist():
        players = pool.filter_pool(
            deepcopy(player_pool),
            player_settings,
        )

    if not isinstance(rule_set, RuleSet):
        raise Exception("RuleSet not defined. Please refer to the docs")

    if rule_set.game_type == 'showdown':
        if optimizer_settings.no_offense_against_defense:
            print('WARNING:')
            print('no_offense_against_defense setting ignored for showdown')
            print('game types. Use no_defense_against_captain instead.')
            print()

    optimizer = Optimizer(
        players=players,
        rule_set=rule_set,
        settings=optimizer_settings,
        lineup_constraints=constraints,
        exposure_dict=exposure_dict,
    )

    variables = optimizer.variables

    if optimizer.solve():
        if roster_gen:
            roster = roster_gen()
        else:
            roster = RosterSelect().roster_gen(rule_set.league)

        for i, player in enumerate(players):
            if variables[i].solution_value() == 1:
                roster.add_player(player)

        if verbose:
            print('Optimal roster for: {}'.format(rule_set.league))
            print(roster)

        return roster

    if verbose:
        print('''
No solution found.
Try adjusting your query by taking away constraints.

OPTIMIZER CONSTRAINTS:

{}

LINEUP CONSTRAINTS:

{}

PLAYER POOL SETTINGS:

{}

PLAYER COUNT: {}
        '''.format(optimizer_settings, constraints, player_settings,
                   len(players or [])))
    return None
コード例 #27
0
def test_dup_group_rule2():
    lcs = LineupConstraints()
    lcs.add_group_constraint(['Eli Manning', 'Russell Wilson', 'Doug Martin'],
                             (1, 2))
    lcs.add_group_constraint(['Eli Manning', 'Russell Wilson', 'Doug Martin'],
                             (1, 2))
コード例 #28
0
def test_bad_group_shadow_ban_hi_lo_bound():
    lcs = LineupConstraints()
    lcs.add_group_constraint(['Spencer Ware', 'Amari Cooper'], (0, 0))
コード例 #29
0
import os
import random
from draftfast.pickem.pickem_optimize import optimize
from draftfast.csv_parse import uploaders, salary_download
from draftfast import rules
from draftfast.lineup_constraints import LineupConstraints

salary_file_location = os.environ.get('PICKEM')
pid_file_location = os.environ.get('PICKEM_PIDS')

players = salary_download.generate_players_from_csvs(
    game=rules.DRAFT_KINGS,
    salary_file_location=salary_file_location,
    ruleset=rules.DK_NBA_PICKEM_RULE_SET,
)

rosters = []
for p in range(20):
    player = random.choice(players)
    roster = optimize(
        all_players=players,
        constraints=LineupConstraints(locked=[p.name]),
    )
    rosters.append(roster)

uploader = uploaders.DraftKingsNBAPickemUploader(pid_file=pid_file_location, )

uploader.write_rosters(rosters)
コード例 #30
0
def test_bad_group_duplicate_bounds():
    lcs = LineupConstraints()
    lcs.add_group_constraint(['Spencer Ware', 'Amari Cooper'], (1, 1))