tl;dr — Мы используем R и Python, чтобы сделать следующую гистограмму.

Фича, а не баг

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

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

Экзистенциальное понимание дополнительных оснований.

Один из самых больших выводов из бейсбола — это соотношение успеха и неудачи. Когда моя жизнь становится тяжелой, я думаю о том, со сколькими трудностями мне придется столкнуться, чтобы добиться одного успеха. Я постоянно напоминаю себе, что в бейсболе 30% успеха — это карьера в зале славы. Путь к бейсбольному величию усеян бесчисленными неудачами и несбывшимися надеждами.

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

Python и R вместе

Одна из причин, по которой я решил изучить R после изучения Python, — это количество доступных пакетов для бейсбола. Как только я познакомился с синтаксисом R, я был очарован пакетом ggplot. Язык для построения графиков в R — одна из областей, в которой я вижу более интуитивный подход, чем Python.

Р магия

При работе с R и Python я предпочитаю работать в блокноте Jupyter. Магия Jupyter позволяет довольно легко переключаться между языками. Чтобы приспособиться к этому, я создал виртуальную среду на python и установил свои пакеты, включая rpy2. Я также установил библиотеки, которые буду использовать в R. Подробности этих шагов выходят за рамки этой статьи, но я предоставил ссылки, чтобы вы могли начать.

Виртуальные среды на python
Установка библиотек на R
Магии Jupyter (Ipython)

Начнем с загрузки расширения rpy2 с помощью строки magic

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

Мы хотим получить статистику игроков за последние пять лет. Я также хочу исключить укороченный сезон 2020 года. По состоянию на 15.02.2023 сезон 2022 недоступен для нас с использованием пакета Lahman. Нам придется использовать пакет baseballr, написанный Биллом Петти, чтобы получить эту информацию.

Пять лучших HR-хиттеров 2022 года

Здесь мы загрузим информацию для сезона 2022 года и получим пятерку лучших, используя baseballr.

Вывод наших данных так же прост, как добавление флага -o и данных после магии строки R.

Я могу вызывать функции Python прямо на выходное имя.

Batting dimensions: (699, 30) 

Batting columns: ['bbref_id', 'season', 'Name', 'Age', 'Level', 'Team', 'G', 'PA', 'AB', 'R', 'H', 'X1B', 'X2B', 'X3B', 'HR', 'RBI', 'BB', 'IBB', 'uBB', 'SO', 'HBP', 'SH', 'SF', 'GDP', 'SB', 'CS', 'BA', 'OBP', 'SLG', 'OPS'] 

  bbref_id  season            Name   Age   Level          Team      G     PA  \
1   682928    2022    Rhys Hoskins  29.0  Maj-NL  Philadelphia  173.0  745.0   
2   547989    2022  Kyle Schwarber  29.0  Maj-NL  Philadelphia  172.0  743.0   
3   660670    2022     Aaron Judge  30.0  Maj-AL      New York  166.0  734.0   

      AB      R  ...  HBP   SH   SF   GDP    SB   CS     BA    OBP    SLG  \
1  658.0   90.0  ...  6.0  0.0  4.0  14.0   2.0  1.0  0.237  0.320  0.459   
2  632.0  113.0  ...  6.0  0.0  4.0  10.0  13.0  1.0  0.218  0.330  0.508   
3  606.0  138.0  ...  6.0  0.0  5.0  14.0  17.0  3.0  0.300  0.412  0.663   

     OPS  
1  0.779  
2  0.838  
3  1.076  

[3 rows x 30 columns]

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

               Name  Year     AB      H     SO    HR
3       Aaron Judge  2022  606.0  182.0  190.0  64.0
2    Kyle Schwarber  2022  632.0  138.0  218.0  52.0
19      Pete Alonso  2022  607.0  165.0  132.0  41.0
136      Mike Trout  2022  438.0  124.0  139.0  40.0
56   Yordan Alvarez  2022  522.0  154.0  122.0  40.0

Теперь обратимся к базе данных Lahman, чтобы получить годы до сезона 2022 года. Нам понадобятся таблицы Batting и People из базы данных Lahman, чтобы создать фрейм данных, соответствующий тому, который мы использовали для baseballr.

Снова простой синтаксис вывода.

Вызов функций pandas прямо в выходной переменной.

Batting dimensions: (6304, 6) 

Batting columns: ['playerID', 'yearID', 'AB', 'H', 'SO', 'HR'] 

         playerID  yearID   AB    H   SO  HR
102832   abadfe01    2017    0    0    0   0
102833  abreujo02    2017  621  189  119  33
102834  adamecr01    2017   13    0    6   0

Здесь я выбираю годы с 2017 по 2021 год и опускаю укороченный сезон 2020 года.

         playerID  yearID   AB    H   SO  HR
102832   abadfe01    2017    0    0    0   0
102833  abreujo02    2017  621  189  119  33
102834  adamecr01    2017   13    0    6   0

Я использовал понимание списка, чтобы получить 5 лучших итоговых показателей HR (nlargest) за год. Затем я объединил список кадров данных. Я уверен, что есть лучший способ сделать это.

         playerID  yearID   AB    H   SO  HR
109897  ohtansh01    2021  537  138  189  46
110174  semiema01    2021  652  173  146  45
110289  tatisfe02    2021  478  135  153  42

Мне понадобится кадр данных People, который я загрузил ранее для пакетов R Lahman, чтобы получить имена игроков.

People columns :  ['playerID', 'birthYear', 'birthMonth', 'birthDay', 'birthCountry', 'birthState', 'birthCity', 'deathYear', 'deathMonth', 'deathDay', 'deathCountry', 'deathState', 'deathCity', 'nameFirst', 'nameLast', 'nameGiven', 'weight', 'height', 'bats', 'throws', 'debut', 'finalGame', 'retroID', 'bbrefID', 'deathDate', 'birthDate']

Обрезка кадра данных для того, что мне нужно

    playerID nameFirst nameLast
1  aardsda01     David  Aardsma
2  aaronha01      Hank    Aaron
3  aaronto01    Tommie    Aaron

Слияние обратно в мой кадр данных HR с некоторыми домашними делами.

    playerID  Year   AB    H   SO  HR  nameFirst nameLast    Name
0  stantmi03  2017  597  168  163  59  Giancarlo  Stanton  Giancarlo Stanton
1  judgeaa01  2017  542  154  208  52      Aaron    Judge  Aaron Judge
2  daviskh01  2017  566  140  195  43      Khris    Davis  Khris Davis

Я объединим первый фрейм данных, который я сделал, обратно в свой HR_top_five.
Я должен добавить год, чтобы имена лидеров частых хоум-ранов не перекрывались в качестве переменных. Затем я упрощаю фрейм данных, чтобы передать его обратно в R.

                Name  Year     AB      H     SO    HR  \
NameIndex             
0  Giancarlo Stanton  2017  597.0  168.0  163.0  59.0  \
2017 Giancarlo Stanton
1        Aaron Judge  2017  542.0  154.0  208.0  52.0  \
2017 Aaron Judge
2        Khris Davis  2017  566.0  140.0  195.0  43.0  \  
2017 Khris Davis

Наконец, мы импортируем наши данные обратно в R, используя флаг -i после магии R с именем переменной. Мы создадим гистограмму с итоговыми значениями HR и SO рядом друг с другом.

Теперь мы можем сделать то же самое с AB и H.

Трудно вспомнить, трудно представить

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

Это не работает, когда конкуренция увеличивается.

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

Лучший способ поддержать меня — это -› ☕ Купи мне кофе. ☕

Вы также можете поддержать меня, подписавшись на Medium.

Не стесняйтесь обращаться к LinkedIn, Twitter или Facebook.