Если вам интересно создать программу для автоматического выбора вашей команды в Fantasy Premier League (FPL), вы попали в нужное место. В этой статье я покажу, как мы можем использовать исторические данные для автоматизации выбора вашей команды в простой программе Python. Весь процесс доступа к данным, манипулирования ими и выбора команды доступен по этой ссылке.

Но сначала шаг назад ...

Fantasy Premier League - это игра, в которой вам предоставляется бюджет в 100 миллионов на выбор команды из 15 игроков (2 хранителя, 5 защитников, 5 полузащитников и 3 нападающих). Каждую неделю вы выбираете 11 игроков в свой отряд для игры. Этим игрокам будут начисляться очки в зависимости от их выступлений. Вы выбираете для своей команды капитана и вице-капитана. Капитану начисляются двойные очки, но если он не играет, вице-капитану присуждаются капитанство и двойные очки.

Цель игры - набрать как можно больше очков за весь сезон

Другими словами, вы хотите выбрать игроков, которые, вероятно, принесут больше всего очков вашей команде. Однако на этот выбор может повлиять ваше личное пристрастие к определенным командам или игрокам. Т.е. выбор игроков, которых вы хотите сыграть, а не игроков, которые могут выступить. Итак, как нам избежать предвзятости?… Мы используем исторические данные, чтобы улучшить процесс принятия решений.

Заявление об ограничении ответственности: Выбор игроков, показавших хорошие исторические результаты, никоим образом не гарантирует, что они будут такими же и в будущем. Однако это хороший показатель того, что игроки, скорее всего, проявят себя в будущем.

Стратегия и ограничения

Наша цель - выбрать команду с максимально возможным количеством очков в рамках нашего бюджета в 100 миллионов. Помимо ограничения бюджета, у нас также есть ограничения на заполнение позиций игроков и максимальное количество игроков от одной команды (3). Это так называемая комбинаторная задача оптимизации.

Типичный способ решения этой проблемы:

  • Выберите ограниченное количество «самых эффективных игроков» (т. е. игроков, которые набирают больше всего очков, но часто стоят дорого). Поскольку выбор капитана вашей команды удваивается, всегда хотелось бы иметь несколько альтернатив для капитана.
  • Выберите оставшихся игроков на основе их количества очков по цене («рентабельность инвестиций» - игроки, которые приносят больше очков по сравнению с их ценой).

Автоматизация такой стратегии также описывалась Диляном Ковачевым в прошлом.

FPL имеет недокументированный статический API, по которому вы можете получить доступ к данным из игры. Мы будем использовать это для создания набора данных, который станет основой для выбора нашей командой. Из этого набора данных мы создадим два DataFrames (DataFrame - это, по сути, таблица, содержащая несколько столбцов и строк, поэтому в статье я буду называть их таблицами):

  1. Лучшие игроки / наибольшее количество очков
  2. Самый высокий ROI.

Эти столы фильтруются по «лучшим игрокам» вверху в порядке убывания.

Создание автоматического селектора команды

Когда у нас будут готовы две таблицы, мы можем создать нашу функцию автоматического выбора команды.

Функция состоит из двух циклов for, которые будут проходить через каждую строку двух таблиц, упомянутых ранее. Первый цикл for проходит через таблицу «наиболее эффективных игроков», а второй цикл - через таблицу «наивысшего ROI».

Для содержимого каждой строки (например, игрока) оценивается набор условий. Если все эти условия выполнены, игрок будет добавлен в наш состав. Если какое-либо из этих условий не выполняется, игрок не добавляется в наш отряд, и функция переходит ко второму циклу for. Функция работает до тех пор, пока не заполнится наш состав игроков (всего 15).

Поскольку у нас есть две разные таблицы игроков, которые мы оцениваем, условия оценки игроков не одинаковы для обоих циклов. Например, у нас есть некоторые условия, которые применяются только к одному из циклов (например, мы превысили наш лимит лучших игроков? - Применяется только к таблице «Лучшие игроки»), и у нас есть некоторые условия, которые являются общими для обеих петель. Общие условия, которые необходимо выполнить игроку:

  • Бюджет выше стоимости плеера?
  • Доступен ли игрок (не травмирован и не дисквалифицирован)?
  • Есть ли в нашей команде свободные места на позиции?
  • Неужели количество игроков в нашей команде из того же клуба (что и игрок в оценке) меньше указанного лимита?

Как видно из изображения функции выбора нашей команды, каждый раз, когда мы добавляем игрока в наш состав, мы обязательно обновляем условия перед тем, как сделать следующий выбор.

Задним числом-команда FPL 19/20

На момент написания этой статьи сезон FPL 19/20 был недавно завершен - это означает, что у нас есть доступ к данным за весь сезон. На картинке ниже вы можете увидеть команду, которую выбрала наша программа Python. В сумме эти игроки набрали 2530 очков (и да, я знаю, что вы можете выбрать только 11 игроков за игровую неделю, что делает неточным суммирование очков для всех 15 игроков). Для справки, победитель сезона 19/20 ФПЛ набрал 2575 очков.

Заключительное слово

Критерии выбора, которые мы используем при выборе, довольно просты и могут быть изменены. Например, программу можно использовать в качестве основы для выполнения определенных выборов, если у вас уже есть части вашей команды (путем добавления вашего отряда в пустой список и обновления условий). Или вы можете настроить критерии отбора или количество «самых эффективных игроков».

Поскольку программа основана на исторических данных, я не могу гарантировать, что с ее помощью можно будет доминировать над своими друзьями и коллегами в дружественных лигах FPL… Да, извините за это. История редко повторяется.

Тем не менее, это умный способ выбрать игроков на основе того, кто набирает наибольшее количество очков, а какие игроки экономически разумны - алгоритм ретроспективного анализа, если хотите.