Поиск по сайту Поиск

Панды в Премьер-лиге

Очень жаль, но панды не играют в футбол. Поэтому в этой статье речь пойдёт о возможностях библиотеки “Pandas”, название которой происходит от термина “panel data”. Сегодня мы расскажем, как с её помощью можно проанализировать статистику игр футбольных команд в Премьер-лиге.

Английская Премьер-лига — одно из самых обсуждаемых событий в футбольном мире. Фанаты делают предположения, а букмекерские конторы принимают ставки на то, кто же займёт призовые места. В этом сезоне чемпионом второй раз подряд стал "Манчестер Сити". Насколько вероятным такой исход является с точки зрения Data Science?

Исследователь Стивен Фордхэм (Stephen Fordham) из Борнмутского университета решил продемонстрировать, как можно использовать Python-библиотеку Pandas для анализа таблицы результатов футбольных клубов.

Парсинг сайтов

Для начала добудем саму таблицу с результатами. В Pandas есть встроенная функция read_html, которая использует библиотеки lxml и Beautiful Soup для автоматического сбора данных из HTML-файлов в виде объектов DataFrame. Установим несколько дополнительных модулей, введя в терминале команды:

Метод read_html имеет ряд настраиваемых параметров, но по умолчанию он пытается найти и проанализировать любые табличные данные в html-тегах <table>, собирая их в список DataFrame.

Далее импортируем библиотеку pandas и используем функцию read_html, чтобы проанализировать таблицу Премьер-лиги и присвоить её переменной prem_table. Так мы получим список, из которого возьмём первый элемент — он будет содержать в себе последние доступные результаты.

Поскольку основное внимание сосредоточено на гонке за 4 призовых места, мы отобразим 6 первых записей в таблице с помощью метода .head. Чтобы убедиться, что с данными всё в порядке, можно использовать атрибут shape. Он показывает размер таблицы, в нашем случае в ней 21 строка и 12 столбцов. Проверка оказалась полезной, так как Python начинает считать строки с индекса 0, а в Премьер-лиге всего 20 команд. Похоже, в нашей таблице есть лишние данные. Раз с первыми значениями всё хорошо, проблема должна быть в какой-то дополнительной строке в конце DataFrame.

https://cdn-images-1.medium.com/max/1600/1*Me_kYOQ-wvsMkrJxNs_Hlw.png

Перед тем как начать предварительный анализ, мы почистим данные. Столбец “Unnamed: 1” явно не несёт в себе полезной информации, поэтому удалим его с помощью метода drop с аргументом axis=1:

Результат:

https://cdn-images-1.medium.com/max/1600/1*Wj7YsxcGVXMCFCFEuaQQng.png

Типы данных в DataFrame

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

Взглянув на таблицу, можно сразу предположить, что столбец “Team” содержит в себе строки, а “P” (количество сыгранных игр) — целочисленные значения. Но лучше не доверять предположениям и использовать атрибут dtypes или метод info.

https://cdn-images-1.medium.com/max/1600/1*ybBy5j3BWUYGJ8dB1zVbRA.png

Видим, что все Series содержат в себе данные “object”, то есть строковые значения. Для выполнения численных расчётов нам необходимо преобразовать типы некоторых из них. В Python это тривиальная задача: мы просто используем метод pandas.to_numeric.

Изменим тип данных нескольких столбцов на float:

https://cdn-images-1.medium.com/max/1600/1*8J-RefYIzkSmV-fNfF2iFQ.png

Очищаем DataFrame

Вернёмся к нашим лишним строкам и посмотрим на три последних записи в DataFrame:

https://cdn-images-1.medium.com/max/1600/1*FK26j0rXj7s9dgZz5v--Vg.png

В последней строке содержатся ненужные метаданные. Чтобы удалить их, снова используем метод drop, но на этот раз без параметра axis=1 (поскольку обрабатываем строку, а не столбец). С помощью атрибута shape убедимся, что всё прошло успешно:

https://cdn-images-1.medium.com/max/1600/1*J31bdE0x3JRrlYuBSxDYcA.png

Теперь посмотрим на столбец “Unnamed: 0”. Его название явно не согласуется с содержимым (с позицией команды в общем зачёте). Исправим это методом Pandas Dataframe.rename с аргументом Inplace=True, чтобы применить изменения к исходному DataFrame.

https://cdn-images-1.medium.com/max/1600/1*1uKGTQGBdXiCjnKYHuIVLw.png

Создаём новые столбцы

Наш DataFrame теперь настроен. На этом этапе стоит попробовать создать несколько новых столбцов и проверить, будет ли для них работать преобразование строк в числа, сделанное нами ранее.

Сформируем столбец под названием «Соотношение голов» (“Goal Ratio”), показывающий отношение забитых мячей к пропущенным. Для этого нужно поделить столбец “F” на столбец “A” и округлить значения до одного знака после запятой. По умолчанию новые данные добавляются в конец DataFrame:

https://cdn-images-1.medium.com/max/1600/1*pCMYBIMuBnHQExFaO-OUsw.png

Чтобы переместить столбец, можно просто переопределить таблицу, указав нужный порядок:

https://cdn-images-1.medium.com/max/1600/1*sOBYv2xlg_pf85SqRROYyA.png

Мы удалили столбец “Form”, чтобы данные выглядели более аккуратными.

Фильтруем DataFrame

Теперь наша таблица оформлена подобающим образом. Давайте начнём анализ с простого вопроса, например: «Какие команды сыграли на одну игру меньше своих соперников?». Так как все команды на момент написания статьи сыграли 34 или 35 игр, мы просто выводим те, у которых значение столбца “P” равно 34. Для фильтрации используем логическое индексирование:

https://cdn-images-1.medium.com/max/1600/1*_sSnLNfxrTE8MRRoV3ksEw.png

Теперь давайте определим, у какой команды было больше всего результатов «ничья» (столбец “D”).

Клуб "Саутгемптон" изо всех сил пытается избежать вылета, повлияет ли это на их позицию?

https://cdn-images-1.medium.com/max/1600/1*ZDZWg6sJ3ozw_NWcn2H_Vg.png

Наконец, создадим ещё два столбца: число забитых и пропущенных голов за игру (“Goals/game” и “Goal conceded/game”). Отсортируем значения методом sort_values:

После «Хаддерсфилда» и «Фулхэма» у клуба «Кардифф» третье худшее соотношение забитых и пропущенных голов. Смогут ли они продолжать бороться за более высокое место в таблице со своим ближайшим соперником, клубом «Брайтон»? Достаточное ли у них нападение, уязвима ли защита?

Мы можем выяснить это с помощью Pandas!

https://cdn-images-1.medium.com/max/1600/1*2fo1Avu7ipQAH9ZIhAoCog.png
https://cdn-images-1.medium.com/max/1600/1*RugmgUJL-nAFqm1asO-A5w.png

Что ж, похоже, их шансы невысоки.

Хотя английская Премьер-лига завершилась, в России она ещё продолжается — вы можете оценить статистику главных претендентов на первенство и предположить, кто же станет чемпионом. А если вы уже давно знакомы с анализом данных, то для больших вычислений рекомендуем воспользоваться нашими облачными серверами с GPU NVIDIA Tesla V100 (от 90 рублей в час).

Заключение

Надеемся, что представленные в этой статье функции Pandas помогут вам в анализе данных. Напоследок один совет: не анализируйте статистику Премьер-лиги во время соревнований, поскольку пока вы пишете код, данные успеют поменяться. Все расчёты стоит выполнять после матчей. А пока — устраивайтесь поудобнее и наблюдайте за игрой!

С оригинальной статьёй можно ознакомиться на портале towardsdatascience.com.

Стэнфордский курс: лекция 4. Введение в нейронные сети

Стэнфордский курс: лекция 4. Введение в нейронные сети

В прошлый раз мы выяснили, как работает функция потерь и оптимизация, а также рассказали о пользе градиента и градиентного спуска....
Read More
Данные на замке: как двухфакторная аутентификация поможет обезопасить сайт

Данные на замке: как двухфакторная аутентификация поможет обезопасить сайт

Пароли, даже самые сложные, уже давно не препятствие для злоумышленников. В ответ на это владельцы сайтов всё чаще вводят второй...
Read More
Улучшаем графику в старых играх и видео с помощью нейросетей

Улучшаем графику в старых играх и видео с помощью нейросетей

Бывало ли с вами такое: вы решили скачать любимую компьютерную игру детства и ненадолго погрузиться в счастливые воспоминания. Установили её,...
Read More
Как создать сайт-портфолио для творческого проекта

Как создать сайт-портфолио для творческого проекта

Резьба по книгам, money art, тканевые скульптуры — искусство может принимать самые разные формы. А благодаря Интернету современные художники могут...
Read More
Нейросеть описывает мир незрячим людям

Нейросеть описывает мир незрячим людям

Голосовые ассистенты могут не только играть в «города» и рассказывать о погоде — они способны на гораздо большее! Например, помогать...
Read More
Экскурсии в дата-центр: как мы провели 300 человек на закрытый объект и почему нас уже не остановить

Экскурсии в дата-центр: как мы провели 300 человек на закрытый объект и почему нас уже не остановить

Отвлекитесь немного от экрана и посмотрите на вещи, которые вас окружают. Стол, кружка, лампа, смартфон, клавиатура — всё это материальные...
Read More
Стэнфордский курс: лекция 3. Функция потерь и оптимизация

Стэнфордский курс: лекция 3. Функция потерь и оптимизация

На прошлой лекции мы разобрались, как работает классификация изображений. Что же может «потеряться» в процессе и можно ли этого избежать?...
Read More
Как ИИ отслеживает небезопасное поведение водителей

Как ИИ отслеживает небезопасное поведение водителей

Искусственный интеллект может помочь каршеринговым сервисам и таксопаркам сделать поведение водителей на дороге безопаснее. Например, предупреждать их, если они отвлеклись...
Read More
Многозначная классификация с помощью Keras

Многозначная классификация с помощью Keras

Можно ли обучить нейросеть делать не один, а сразу несколько прогнозов? Этот вопрос возникает, когда нам необходимо классифицировать изображения по...
Read More
Большая игра, или Загадочная история домена SEX.COM

Большая игра, или Загадочная история домена SEX.COM

“The Internet is for porn” — так пелось в бродвейском мюзикле Avenue Q (пародия на «Улицу Сезам»). И, несмотря на то,...
Read More