Используя Python, узнайте, как использовать Sportsreference API для получения данных для анализа NCAAB.

вступление

Немного смазки для локтей имеет большое значение. Этот блог будет использовать Sportsreference API для создания набора данных для вашего собственного анализа, особенно NCAA Men’s Basketball. Когда я смотрю на ландшафт спортивной аналитики, я в основном вижу стандартные отчеты (компании PaaS), скрывающие свои данные и не позволяющие экспортировать необработанные данные. Необработанные данные важны для проверки правильности формул и позволяют гибко создавать свои собственные функции. Это понятно, потому что, как правило, эти компании или веб-сайты, скорее всего, платят за эти данные. Однако после обширных исследований выяснилось, что существует очень мало уникальных точек данных между поставщиками данных в ландшафте NCAAB. Набор данных, который мы создаем в этом блоге, даст вам отличное начало для анализа нюансов мира студенческого баскетбола.

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

Я предполагаю, что с этого момента у вас есть базовые знания Python 3.X. Я буду показывать фрагменты кода из Jupyter Notebook. Документацию по этому API можно найти здесь. Если вы хотите увидеть полную записную книжку, свяжитесь со мной, и я помогу.

Давайте код

Чтобы протестировать API, давайте начнем с простого: проверим, сколько команд отслеживает Sportsreference API.

Как видите, есть данные о 356 командах. Важно понимать, что это снимок данных за сезон 2019–2020 гг. Команды колледжей иногда создаются, распускаются, перепрыгивают с конференций или могут сменить подразделения в межсезонье. Если вы хотите изменить год, измените параметр года в классе Teams ().

GET: данные Box Score за 2019–2020 гг. Для всех 356 команд (сезон 2019–2020 гг.)

Теперь, когда мы знаем, что можем делать базовые запросы из этого API, давайте возьмем статистические данные за весь сезон. Приведенный ниже блок кода создаст CSV-файл для каждой команды со статистикой очков соответствующей команды из каждой игры. Предупреждение. Этот API работает очень медленно, и это может занять несколько часов.

Я добавил пару столбцов, таких как «team_name» и «conf», чтобы добавить несколько столбцов к набору данных, которые, как мне казалось, были необходимы. Вы увидите результат до всех 356 команд, чтобы оценить, сколько уже было выполнено.

# Set counter to watch progress
cnt = 0
# Loop through all teams in database (353 teams)
for team in Teams("2019"):
    cnt += 1
    # 3 Teams caused an error so do try/except so the loop doesnt stop
    try:
        print(cnt)
# Returns a Pandas DataFrame of all metrics for all game Boxscores for a season
        df = team.schedule.dataframe_extended
        
        # add team name to dataframe
        df['team_name'] = team.name
        
        
        # add conference name to dataframe
        df['conf'] = team.conference
                
        # send to csv
        df.to_csv(f'./NCAA_Team_Boxscores/2019-2020/{cnt}_{team.name}_season_boxscores_2019.csv')
    except:
        print(cnt,'did not work')

Обратите особое внимание на часть после «# send to CSV», поскольку она определяет, где каждый файл CSV будет создан на вашем локальном компьютере. Есть много способов ввести данные. Я решил сделать это так, потому что, если бы данные одной команды были ненадежными, это не разрушило бы весь цикл. Теперь мы объединим все файлы в один основной CSV-файл. Убедитесь, что в этом каталоге нет других файлов CSV!

# This loops through all files ending in .csv and concatenates them into a single df
from glob import glob
# grab all filenames ending with .csv
filenames = glob('./NCAA_Team_Boxscores/2019-2020/*.csv')
# loop through all file names adding the contents to one dataframe
ncaa_boxscore_df = pd.concat([pd.read_csv(f) for f in filenames], ignore_index = True)
# CSV now has all data in one spot, send to CSV
ncaa_boxscore_df.to_csv('2019_ncaa_season_boxscores.csv')

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

GET: данные Box Score для каждой игры в Sportsreference (2010-настоящее время)

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

# Set counter to watch progress
cnt = 0
# Create list of all years and change type to string
years = [str(i) for i in list(range(2010,2020))]
# Loop through all teams in database (353 teams) over the years
for year in years:
    print(year)
    cnt = 0
    for team in Teams(year):
        cnt += 1
        # 3 Teams caused an error so do try/except so the loop doesnt stop
        try:
            print(cnt)
# Returns a Pandas DataFrame of all metrics for all game Boxscores for a season
            df = team.schedule.dataframe_extended
# add team name to dataframe
            df['team_name'] = team.name
# add conference name to dataframe
            df['conf'] = team.conference
# send to csv
            df.to_csv(f'./NCAA_Team_Boxscores/2010_2019/{year}_{team.name}_season_boxscores.csv')
        except:
            print(cnt,'did not work')

Теперь у вас есть CSV-файл с расписанием каждой команды и данными о счете в соответствующей игре. Чтобы снова объединить все файлы в один CSV, повторите очень похожий код, приведенный выше.

# This loops through all files ending in .csv in this directory and concatenates them into a single df
from glob import glob
filenames = glob('./NCAA_Team_Boxscores/2010_2019/*.csv')
ncaa_boxscore_df = pd.concat([pd.read_csv(f) for f in filenames], ignore_index = True)
# CSV now has all data in one spot, send to CSV
ncaa_boxscore_df.to_csv('2010_2019_ncaa_season_boxscores.csv')

GET: итоги сезона и карьеры всех игроков в спорте (с 2010 г. по настоящее время)

Давайте создадим еще одну базу данных CSV с каждым игроком в базе данных Sports Reference с 2010 года по сегодняшний день. С этим может быть интересно поиграть, попытаться спрогнозировать рост игроков, привлечь новых игроков и многое другое.

# Loop through every team (353 teams) print index + 1 of team to keep count
years = [str(i) for i in list(range(2010,2020))]
for year in years:
    print(year)
    for team in Teams(year):
        roster = team.roster
        # reset counter to 0 to measure progress in each year
        cnt = 0
# loop through roster of every team to get player data and write to csv
        for player in roster.players:
            cnt += 1
            print(cnt)
            try:
                df = Player(player.player_id).dataframe
                df['team'] = team.abbreviation
                df['conference'] = team.conference
                df['player_name'] = player.name
                df.to_csv(f'./NCAA_Rosters/{team.abbreviation}_{player.player_id}.csv')  
            except:
                print(cnt, "did not work")

А теперь еще раз, давайте объединим все эти файлы в один CSV.

# Select filenames using wildcard '*'
filenames = glob('./NCAA_Rosters/*.csv')
# I used this to loop through csvs files in a folder concatenating them into a single df
ncaa_players_df = pd.concat([pd.read_csv(f) for f in filenames], ignore_index = True)
# Rename column to proper name
ncaa_players_df.rename(columns={'Unnamed: 0': 'season_year'},inplace=True)
# Export the final complete df
ncaa_players_df.to_csv('2010-2020_NCAA_players.csv')

Бум, динамит! У нас есть база данных CSV с итогами сезона и карьерной статистикой игрока, начиная с 2010 года!

Заключение

Вы не поверите, но это была легкая и не отнимающая много времени часть. Теперь мы должны очистить данные - особенно стандартизировать строки. Например, мою альма-матер обычно называют LSU, но, как вы можете видеть во фрейме данных выше, в базе данных есть сокращенное название команды «louisiana-state».

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

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

Свяжитесь со мной

Не стесняйтесь обращаться ко мне и общаться со мной в социальных сетях! Я хотел бы услышать ваши мысли о моих блогах, спорте, аналитике данных или обо всем в целом.

LinkedIn:

www.linkedin.com/in/blakesamaha

Twitter:

@Mean_Agression