Запросите статистику NBA за 70 лет прямо из командной строки

Вступление

В этой статье будет показан один из способов развертывания функции Python для моделирования такой простой задачи, как поиск статистики любимого баскетболиста за определенный сезон НБА.

Как большой поклонник баскетбола НБА, я часто обнаруживал, что ищу в Интернете информацию о производительности конкретного игрока, и задавался вопросом, могу ли я получить удовольствие, пытаясь воспроизвести этот процесс с помощью Python, с идеей простого запуска поиска и получения результатов из командную строку моего ноутбука, не открывая браузер и не выходя в Интернет.

Если Python выполняет поиск в Интернете за вас, это может быть невероятно мощным инструментом для многих различных типов приложений, и я надеюсь, что этот краткий пример сможет воплотить его полезность в жизнь и вдохновить вас на применение этих концепций в ваших личных проектах.

Шаг 1. Определите свой статистический сайт

В случае сообщества баскетбольных аналитиков BasketballReference.com - это кладезь данных, поскольку он содержит всевозможную релевантную внутриигровую статистику, полезную для многих проектов баскетбольной аналитики. Я буду использовать этот веб-сайт для сбора соответствующих данных.

В частности, для статистики NBA, на сайте есть раздел Per Game, где можно получить статистику производительности за игру для любой соответствующей категории по всему населению из ~ 500 игроков NBA, принимающих участие в любом данном сезоне.

Цель состоит в том, чтобы скомпилировать и выполнить программу на Python, которая может возвращать полную статистику за игру любого игрока за любой сезон. Сайт записывает статистику по играм с начала 1950-х годов, так что вы можете найти данные за 70 (!) Лет, по которым вы можете выполнять поиск.

Шаг 2: напишите функцию Python

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

  1. Импортируйте соответствующие пакеты. В качестве первого шага вам нужно будет импортировать соответствующие пакеты Python и определить переменную url, которая указывает на онлайн-источник данных. Вам также следует импортировать пакет pandas («import pandas as pd»), так как он вам понадобится позже.
import requests
from bs4 import BeautifulSoup
import pandas as pd

2. Определите функцию и получите ввод от пользователя

Вы определяете функцию с помощью ключевого слова def и даете ей репрезентативное имя, например get_NBA_stats; функция не будет принимать никаких параметров, но вместо этого пользователь определит их с помощью двух команд input, в которых программа запрашивает год и имя игрока, для которого нужно вернуть игровая статистика.

def get_NBA_stats():
year=input("Which NBA season are you interested in?: ")
player=input("For which player do you want to get stats?: ")

3. Очистите и сохраните данные

Затем вам нужно получить соответствующий URL-адрес с помощью метода request.get. Обратите внимание, как переменная год используется для направления поиска на веб-страницу, где находится статистика сезонов года. Затем вы можете извлечь его текст с помощью метода .text и, наконец, преобразовать его в объект Beatiful Soup.

url = 'https://www.basketball-reference.com/leagues/NBA_{}_per_game.html'.format(year)
   
r = requests.get(url)
r_html = r.text
soup = BeautifulSoup(r_html,'html.parser')

Чтобы найти таблицу с набором данных игроков в HTML-коде веб-страницы BasketballReference, вы можете проверить код страницы (это можно сделать, нажав Ctrl + Shift + I в Google Chrome) и увидеть, что элемент таблицы вы заинтересованы в class, равном full_table, который вы можете использовать для хранения содержимого таблицы в переменной table через soup. команда find_all.

Затем вы можете использовать soup.find, чтобы найти элемент на странице с class, равным table_head, поскольку этот класс хранит имена столбцов нашего игроки'датасет. Вы можете сохранить их в переменной с именем head, которая затем используется для извлечения и очистки соответствующих имен столбцов для вашего окончательного набора данных, таких как имя каждого игрока, количество очков за игру, отскок за игру и т. Д. Как вы можете видеть ниже.

table=soup.find_all(class_="full_table")
    
""" Extracting List of column names"""
head=soup.find(class_="thead")
column_names_raw=[head.text for item in head][0]
    column_names_polished=column_names_raw.replace("\n",",").split(",")[2:-1]
print(column_names_polished)
['Player',
 'Pos',
 'Age',
 'Tm',
 'G',
 'GS',
 'MP',
 'FG',
 'FGA',
 'FG%',
 '3P',
 '3PA',
 '3P%',
 '2P',
 '2PA',
 '2P%',
 'eFG%',
 'FT',
 'FTA',
 'FT%',
 'ORB',
 'DRB',
 'TRB',
 'AST',
 'STL',
 'BLK',
 'TOV',
 'PF',
 'PTS']

Затем вы можете перебирать весь элемент table, и для каждой строки данных (относящейся к одному игроку и идентифицированной тегом HTML td) вы можете извлечь всю статистику игрока. , и сохраните их в списке с именем player. Все, что вам нужно сделать, когда это будет сделано, - это сохранить информацию обо всех игроках в фрейме данных pandas, который принимает ранее определенные имена столбцов и для которого вы можете установить полное имя игрока в качестве индекса.

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

"""Extracting full list of player_data"""
players=[]
    
    for i in range(len(table)):
        
        player_=[]
        
        for td in table[i].find_all("td"):
            player_.append(td.text)
    
        players.append(player_)
df=pd.DataFrame(players, columns=column_names_polished).set_index("Player")
#cleaning the player's name from occasional special characters
df.index=df.index.str.replace('*', '')

4. Закройте функцию, вернув запрошенную статистику игрока.

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

print(df.loc[player])
if __name__ == "__main__":
    get_NBA_stats()

Шаг 3: Запустите и выполните функцию из командной строки

Теперь ваша функция настроена! Все, что вам нужно сделать сейчас, это сохранить файл python (я назвал свой NBA_per_game.py) и запускать файл, когда захотите, для любой комбинации игрока и года, которую вы хотите, прямо из командной строки вашего ПК.

Не забудьте сохранить файл в каталоге, к которому вы можете легко получить доступ из командной строки, чтобы запустить программу в мгновение ока.

Я сохранил свой на своем рабочем столе, чтобы он был легко доступен, а затем записал пару казней в приведенном ниже видео.

Следующие шаги

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

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

Надеюсь, вы найдете это полезным в следующий раз, когда вам захочется вкратце взглянуть на некоторую статистику НБА (возможно, при подготовке вашего состава Fantasy Basketball!).

Получить доступ к моему бесплатному контрольному списку ресурсов по науке о данных здесь

Станьте участником и читайте все новости на Medium. Ваш членский взнос напрямую поддерживает меня и других писателей, которых вы читаете. Вы также получите полный доступ ко всем историям на Medium.