Введение:
Добро пожаловать, любители баскетбола и мастера данных! Готовы отправиться в захватывающее путешествие в мир аналитики данных НБА? В этой статье мы раскроем секреты получения данных НБА от balldontlie.io, золотой жилы как для фанатиков спорта, так и для специалистов по данным. Приготовьтесь поднять свою спортивную аналитику и игру по построению моделей машинного обучения на совершенно новый уровень!
Прошли те времена, когда единственными вариантами были традиционные платформы, такие как Kaggle.com и OpenML. Сегодня мы покажем вам, почему важно исследовать новые источники данных, чтобы раскрыть скрытые закономерности и знания в огромном мире статистики НБА. Диверсификация источников данных не только обогащает ваш анализ, но и открывает возможности для получения ценных сведений, которые другие могут не заметить.
Хотя нашей путеводной звездой в этом квесте будет «Майами Хит», не бойтесь, потому что методы, которые мы собираемся разгадать, применимы ко всем командам НБА! Так что пристегнитесь и окунитесь в волнующий мир аналитики баскетбольных данных! Вместе мы покорим неизвестное, по одному набору данных за раз!
Начало работы с API balldontlie.io
Прежде чем мы углубимся в мир аналитики данных NBA, давайте познакомимся с нашим мощным союзником: API balldontlie.io. Этот удобный API имеет множество привлекательных функций, которые делают его ценным активом для любителей баскетбола, ориентированных на данные:
- Электронная почта или ключ API не требуются: сразу приступайте к делу без утомительных процессов регистрации.
- Сокровищница исторических данных: доступ к записям, начиная с сезона 1979 года и заканчивая сегодняшним днем.
- Игровая статистика в реальном времени: будьте в курсе игровых данных в режиме, близком к реальному времени, которые обновляются примерно каждые 10 минут.
- Щедрые ограничения скорости: наслаждайтесь свободой делать до 60 запросов в минуту без ограничений.
Этот универсальный API предлагает конечные точки для всех ваших потребностей в данных NBA: игроки, команды, игры и статистика. Имея в своем распоряжении такой надежный инструментарий, мы готовы покорить захватывающую область анализа данных NBA!
Получение данных «Майами Хит» из API balldontlie.io
В этом разделе мы покажем, как получить данные Miami Heat из API balldontlie.io с помощью Python. Мы разобьем процесс на простые для понимания подразделы, начиная с получения информации обо всех командах НБА и заканчивая поиском «Майами Хит» в списке.
Получение информации о командах NBA и Miami Heat
Чтобы получить информацию о командах НБА, а затем найти команду «Майами Хит», мы отправим запрос на конечную точку /teams
, а затем найдем команду в ответе. Вот фрагмент кода Python, который поможет вам в этом, а также преобразование результатов в pandas DataFrame:
import requests import pandas as pd API_BASE_URL = 'https://www.balldontlie.io/api/v1' def get_nba_teams(): teams_url = f'{API_BASE_URL}/teams' response = requests.get(teams_url) teams = response.json()['data'] return pd.DataFrame(teams) def get_miami_heat_info(teams_df): miami_heat = teams_df.loc[teams_df['full_name'] == 'Miami Heat'] return miami_heat if not miami_heat.empty else None nba_teams_df = get_nba_teams() miami_heat_df = get_miami_heat_info(nba_teams_df) if miami_heat_df is not None: print("Miami Heat team information:") print(miami_heat_df) else: print("Error: Miami Heat team not found.")
Этот фрагмент кода определяет функцию get_nba_teams
, которая отправляет HTTP-запрос на конечную точку /teams
и преобразует полученные данные команды в кадр данных pandas. Функция get_miami_heat_info
находит команду «Майами Хит» в кадре данных и возвращает ее строку, если она найдена, или None
, если нет. Затем код вызывает эти функции и выводит информацию о команде Miami Heat в формате DataFrame.
Получение информации об игроке «Майами Хит»
Чтобы получить информацию об игроках «Майами Хит», мы сначала получим данные обо всех игроках НБА, а затем отфильтруем список, чтобы найти только игроков «Майами Хит». Кроме того, мы создадим метод для получения информации о конкретном игроке. Вот фрагмент кода Python, который поможет вам в этом, а также преобразование результатов в кадры данных pandas:
import requests import pandas as pd API_BASE_URL = 'https://www.balldontlie.io/api/v1' def process_player_data(data): players_list = [] for player in data: player_info = player.copy() for key, value in player['team'].items(): player_info[f'team_{key}'] = value del player_info['team'] players_list.append(player_info) return players_list def get_all_players(): all_players = [] page = 1 while True: response = requests.get(f"{API_BASE_URL}/players", params={"page": page, "per_page": 100}) data = response.json() if not data["data"]: break all_players.extend(process_player_data(data["data"])) page += 1 return pd.DataFrame(all_players) def get_miami_heat_players(players_df, miami_heat_id): return players_df.loc[players_df['team_id'] == miami_heat_id] def get_specific_player(player_id): response = requests.get(f"{API_BASE_URL}/players/{player_id}") data = response.json() return pd.DataFrame([data]) if data else None all_players_df = get_all_players() print("All players:") print(all_players_df.head()) miami_heat_id = get_miami_heat_id() miami_heat_players_df = get_miami_heat_players(all_players_df, miami_heat_id) print("\nMiami Heat players:") print(miami_heat_players_df.head()) player_id = 14 specific_player_df = get_specific_player(player_id) if specific_player_df is not None: print(f"\nSpecific player (ID: {player_id}) information:") print(specific_player_df.head())
Фрагмент кода определяет функцию get_all_players
, которая извлекает всех игроков НБА, отправляя HTTP-запросы на конечную точку /players
и обрабатывая нумерацию страниц. Затем он преобразует полученные данные игрока в pandas DataFrame. Функция get_miami_heat_players
фильтрует DataFrame, чтобы найти только игроков «Майами Хит» на основе идентификатора команды «Майами Хит». Функция get_specific_player
извлекает информацию для конкретного игрока, используя его идентификатор игрока.
Код сначала вызывает функцию get_all_players
для получения данных обо всех игроках НБА. Затем он вызывает функцию get_miami_heat_players
для фильтрации и отображения только игроков «Майами Хит». Наконец, он использует функцию get_specific_player
для получения и отображения информации о конкретном игроке по его идентификатору.
Получение информации об игре «Майами Хит» для определенного сезона
В этом разделе мы покажем, как получить игровую информацию о «Майами Хит» в сезоне 2022–2023 годов. Сначала мы создадим новый DataFrame, содержащий все игры, а затем отфильтруем игры Miami Heat. Атрибуты period
, status
и time
заслуживают внимания:
period
: целое число, представляющее текущий квартал (0, 1, 2, 3 или 4). 0 указывает на игру, которая еще не началась, а 4 указывает либо на завершенную игру, либо на игру в четвертой четверти.status
: строка, описывающая текущий статус игры, например "{start_time}", "1-й квартал", "2-й квартал", "Перерыв", "3-й квартал", "4-й квартал" или "Финал". {start_time} выглядит примерно как «19:00 по восточному времени» и указывает на игру, которая еще не началась.time
: строка, отображающая оставшееся время в текущем периоде, например, «3:44», или пустая строка (' '), если игра еще не началась или завершена.
Вот полный код для этого раздела:
import requests import pandas as pd API_BASE_URL = 'https://www.balldontlie.io/api/v1' def process_game_data(data): games_list = [] for game in data: game_data = { 'id': game['id'], 'date': game['date'], 'home_team_id': game['home_team']['id'], 'home_team_name': game['home_team']['full_name'], 'visitor_team_id': game['visitor_team']['id'], 'visitor_team_name': game['visitor_team']['full_name'], 'period': game['period'], 'status': game['status'], 'time': game['time'] } games_list.append(game_data) return games_list def get_all_games(season): all_games = [] page = 1 while True: response = requests.get(f"{API_BASE_URL}/games", params={"page": page, "per_page": 100, "seasons[]": season}) data = response.json() if not data["data"]: break all_games.extend(process_game_data(data["data"])) page += 1 return pd.DataFrame(all_games) def get_miami_heat_games(games_df, miami_heat_id): return games_df[(games_df['home_team_id'] == miami_heat_id) | (games_df['visitor_team_id'] == miami_heat_id)] # Get all games for the 2022-2023 season all_games_df = get_all_games(2022) print(all_games_df.head()) # Filter out Miami Heat games miami_heat_id = 16 miami_heat_games_df = get_miami_heat_games(all_games_df, miami_heat_id) print(miami_heat_games_df.head())
Получение статистики игр в Майами Хит для определенного сезона
В этом разделе мы углубимся в множество данных, предоставляемых NBA API. Мы будем получать игровую статистику для всей лиги, а затем фильтровать ее, чтобы получить статистику специально для Майами Хит. Примечание. Это может занять до 25 минут.
import requests import pandas as pd from time import sleep def get_all_game_stats(season): game_stats = [] page = 1 while True: print(f"Fetching data for season {season} - page {page}...") response = requests.get(f"https://www.balldontlie.io/api/v1/stats?seasons[]={season}&page={page}&per_page=100") if response.status_code == 200: data = response.json() game_stats.extend(data['data']) if page >= data['meta']['total_pages']: print("Data fetched successfully!") break else: page += 1 else: sleep(1) return pd.DataFrame(game_stats) def get_miami_heat_game_stats(game_stats_df): return game_stats_df[game_stats_df['player.team.id'] == miami_heat_id] miami_heat_id = 14 season = 2021 game_stats_df = get_all_game_stats(season) miami_heat_game_stats = get_miami_heat_game_stats(game_stats_df) print(game_stats_df.head()) print(miami_heat_game_stats.head()) game_stats_df.to_csv("game_stats_2021-2022.csv", index=False) miami_heat_game_stats.to_csv("miami_heat_game_stats_2021-2022.csv", index=False)
В этом разделе мы начнем с импорта необходимых библиотек, таких как запросы и панды. Затем мы определяем функцию с именем get_all_game_stats
, которая извлекает всю игровую статистику за данный сезон, отправляя запросы API с разбиением на страницы. Эта функция возвращает DataFrame, содержащий игровую статистику.
Затем мы устанавливаем переменную сезона на 2021 и вызываем функцию get_all_game_stats
, чтобы получить игровую статистику для всей лиги. Когда у нас есть вся игровая статистика в DataFrame с именем game_stats_df
, мы отфильтровываем игровую статистику Miami Heat, создавая новый DataFrame с именем miami_heat_stats_df
. Этот новый DataFrame содержит только строки, в которых «team_id» равен team_id «Майами Хит», что равно 14.
После выполнения этого кода у нас есть DataFrame с именем miami_heat_stats_df
, содержащий игровую статистику конкретно для «Майами Хит» в сезоне 2021-2022. Этот DataFrame содержит множество информации, которую вы можете дополнительно анализировать и визуализировать в соответствии с вашими потребностями. В конце мы отображаем первые пять строк обоих DataFrames, давая представление о данных, которые мы извлекли и отфильтровали.
Заключение
В этом руководстве мы рассмотрели, как использовать balldontlie.io
API для извлечения данных НБА и фильтрации их для анализа конкретной команды, Майами Хит. Мы начали с получения информации о командах и игроках в лиге, а затем перешли к получению подробных игровых данных за конкретный сезон. В частности, мы рассмотрели сезон НБА 2021–2022 годов.
Мы рассмотрели несколько важных концепций и методов, в том числе разбиение на страницы для извлечения больших наборов данных, фильтрацию фреймов данных с помощью Pandas и обработку данных JSON. В итоге мы создали два CSV-файла: один, содержащий игровую статистику всей лиги в сезоне 2021–2022, и другой, посвященный исключительно игровой статистике «Майами Хит».
Имея под рукой эти данные, вы можете выполнять дальнейший анализ, создавать визуализации и получать представление об эффективности «Майами Хит» и лиги в целом. Эти знания могут быть применены к другим командам и сезонам и могут послужить основой для более сложных проектов анализа данных в будущем.