用python检索棒球数据

pybaseball的Python项目详细描述


棒球

1.0.2发布日期:2017年10月28日 pybarball是一个用于棒球数据分析的python包。这个包会刮去basketball-reference.com和baseballsavant.com,所以您不必。到目前为止,该软件包主要执行四项任务:检索STATCAST数据、投球数据、击球数据和部门排名/球队记录。数据可以在单个音高级别获得,也可以在季节级别和自定义时间段进行聚合。

STATCAST:从美国职业棒球大联盟的STATCAST系统中提取高级指标

STATCAST数据包括俯仰水平特征,如感知速度(pv)、自旋速率(sr)、出口速度(ev)、俯仰x、y和z坐标等。函数statcast(start-dt,end-dt)从baseballsavant.com提取此数据。

>>> from pybaseball import statcast
>>> data = statcast(start_dt='2017-06-24', end_dt='2017-06-27')
>>> data.head(2)

   index pitch_type  game_date  release_speed  release_pos_x  release_pos_z  
0    314         CU 2017-06-27           79.7        -1.3441         5.4075
1    332         FF 2017-06-27           98.1        -1.3547         5.4196

  player_name    batter   pitcher     events     ...      release_pos_y  
0   Matt Bush  608070.0  456713.0  field_out     ...            54.8585
1   Matt Bush  429665.0  456713.0  field_out     ...            54.3470

   estimated_ba_using_speedangle  estimated_woba_using_speedangle  woba_value  
0                          0.100                            0.137         0.0
1                          0.269                            0.258         0.0

   woba_denom babip_value iso_value launch_speed_angle at_bat_number pitch_number  
0         1.0         0.0       0.0                3.0          64.0          1.0
1         1.0         0.0       0.0                3.0          63.0          3.0  
[2 rows x 79 columns]

如果提供了start_dtend_dt,它将返回这两个日期之间的所有statcast数据。如果没有,它将返回昨天的数据。参数team还可以提供球队的城市缩写(即bos),以便仅获取包含该球队的比赛的观察结果。可选参数verbose将控制库在提取数据时是否更新您的进度。

对于特定于玩家的STATCAST查询,使用STATCAST廑pull pitcherSTATCAST廑batter函数拉入投球或击球数据。它们采用与statcast函数相同的start_dtend_dt参数,以及player_id参数。这个id来自mlb advanced media,可以使用函数playerid\u lookup获得。完整的示例:

>>> # Find Clayton Kershaw's player id
>>> from pybaseball import playerid_lookup
>>> from pybaseball import statcast_pitcher
>>> playerid_lookup('kershaw', 'clayton')
Gathering player lookup table. This may take a moment.

  name_last name_first  key_mlbam key_retro  key_bbref  key_fangraphs  
0   kershaw    clayton     477132  kersc001  kershcl01           2036

   mlb_played_first  mlb_played_last
0            2008.0           2017.0

>>> # His MLBAM ID is 477132, so we feed that as the player_id argument to the following function 
>>> kershaw_stats = statcast_pitcher('2017-06-01', '2017-07-01', 477132)
>>> kershaw_stats.head(2)
  pitch_type   game_date release_speed release_pos_x release_pos_z  
0         SL  2017-06-29          87.2        1.0865        6.4034
1         SL  2017-06-29          86.9        1.0195        6.4324

       player_name  batter  pitcher     events              description  
0  Clayton Kershaw  458913   477132  strikeout  swinging_strike_blocked
1  Clayton Kershaw  458913   477132       null                     ball

      ...       release_pos_y  estimated_ba_using_speedangle  
0     ...             54.5463                            0.0
1     ...             54.7625                            0.0

   estimated_woba_using_speedangle  woba_value woba_denom babip_value  
0                              0.0        0.00          1           0
1                              0.0        null       null        null

  iso_value launch_speed_angle at_bat_number pitch_number
0         0               null            57            6
1      null               null            57            5

[2 rows x 78 columns]

投球统计:多赛季、单赛季或指定时间段内球员的投球统计

这个库包含两个获取俯仰数据的主要功能。对于全联盟赛季级的投球数据,请使用功能投球统计(赛季开始,赛季结束)。这将在每个赛季为每位球员返回一行,并提供所有由Fangraphs提供的指标。

第二个是俯仰统计范围(起始点,结束点)。这允许您在特定的时间间隔内获取投球数据,允许您获得比fangraphs函数更细粒度的数据(例如,查看哪个投手的5月投球最强)。此查询从棒球引用中提取数据。请注意,所有日期都应采用yyyy-mm-dd格式。

如果你更喜欢棒球参考资料而不是方格图,那么实际上还有第三个选项叫做投球统计(赛季)。这与Pitching_Stats的工作原理相同,但从Baseball引用检索其数据。但是,通常不建议这样做,因为棒球参考查询当前每次请求只能检索一个赛季的数据。

>>> from pybaseball import pitching_stats
>>> data = pitching_stats(2012, 2016)
>>> data.head()
     Season             Name     Team   Age     W    L   ERA  WAR     G    GS  
336  2015.0  Clayton Kershaw  Dodgers  27.0  16.0  7.0  2.13  8.6  33.0  33.0
236  2014.0  Clayton Kershaw  Dodgers  26.0  21.0  3.0  1.77  7.6  27.0  27.0
472  2014.0     Corey Kluber  Indians  28.0  18.0  9.0  2.44  7.4  34.0  34.0
235  2015.0     Jake Arrieta     Cubs  29.0  22.0  6.0  1.77  7.3  33.0  33.0
256  2013.0  Clayton Kershaw  Dodgers  25.0  16.0  9.0  1.83  7.1  33.0  33.0

       ...      wSL/C (pi)  wXX/C (pi)  O-Swing% (pi)  Z-Swing% (pi)  
336    ...            1.76       22.85          0.364          0.665
236    ...            2.62         NaN          0.371          0.670
472    ...            3.92         NaN          0.336          0.598
235    ...            2.42         NaN          0.329          0.618
256    ...            0.74         NaN          0.339          0.635

     Swing% (pi)  O-Contact% (pi)  Z-Contact% (pi)  Contact% (pi)  Zone% (pi)  
336        0.511            0.478            0.811          0.689       0.487
236        0.525            0.536            0.831          0.730       0.515
472        0.468            0.485            0.886          0.744       0.505
235        0.468            0.595            0.856          0.762       0.483
256        0.484            0.563            0.873          0.763       0.492

     Pace (pi)
336       23.4
236       23.7
472       24.6
235       23.3
256       23.4

[5 rows x 299 columns]

击球统计:在赛季内或指定时间段内为球员击球统计

击球数据与投球数据类似。获取赛季级统计数据的函数调用是击球统计数据(开始赛季,结束赛季),对于特定的时间范围,它是击球统计数据范围(开始日期,结束日期)。相当于赛季级数据的棒球参考是击球统计数据

>>> from pybaseball import batting_stats_range
>>> data = batting_stats_range('2017-05-01', '2017-05-08')
>>> data.head()
          Name  Age  #days     Lev          Tm  G  PA  AB  R  H  ...    HBP  
1   Jose Abreu   30     69  MLB-AL     Chicago  7  31  30  5  9  ...      0
2   Lane Adams   27     69  MLB-NL     Atlanta  6   6   6  0  2  ...      0
3   Matt Adams   28     68  MLB-NL   St. Louis  6   9   9  2  4  ...      0
4   Jim Adduci   32     69  MLB-AL     Detroit  6  24  21  3  5  ...      0
5  Tim Adleman   29     72  MLB-NL  Cincinnati  1   2   2  0  0  ...      0

   SH  SF  GDP  SB  CS     BA    OBP    SLG    OPS
1   0   0    1   0   0  0.300  0.323  0.667  0.989
2   0   0    1   1   0  0.333  0.333  0.333  0.667
3   0   0    0   0   0  0.444  0.444  0.778  1.222
4   0   0    0   0   0  0.238  0.333  0.381  0.714
5   0   0    0   0   0  0.000  0.000  0.000  0.000

[5 rows x 27 columns]

每场比赛的结果和时间表

schedule_and_record函数返回给定赛季球队的每场比赛结果,包括比赛日期、主客场球队、最终结果(w/l/tie)、得分、输赢/救球投手、出勤率和该日期所在的分区。函数的唯一两个参数是seasonteam,其中team是团队的缩写(即nyy代表纽约扬基队,sea代表西雅图水手队)。如果赛季参数设置为当前赛季,则查询返回过去比赛的结果以及那些尚未发生的事件的日程安排。

# Example: Let's take a look at the individual-game results of the 1927 Yankees
>>> from pybaseball import schedule_and_record
>>> data = schedule_and_record(1927, 'NYY')
>>> data.head()
                Date   Tm Home_Away  Opp W/L     R   RA   Inn  W-L  Rank  \
1    Tuesday, Apr 12  NYY      Home  PHA   W   8.0  3.0   9.0  1-0   1.0
2  Wednesday, Apr 13  NYY      Home  PHA   W  10.0  4.0   9.0  2-0   1.0
3   Thursday, Apr 14  NYY      Home  PHA   T   9.0  9.0  10.0  2-0   1.0
4     Friday, Apr 15  NYY      Home  PHA   W   6.0  3.0   9.0  3-0   1.0
5   Saturday, Apr 16  NYY      Home  BOS   W   5.0  2.0   9.0  4-0   1.0

       GB      Win     Loss  Save  Time D/N  Attendance  Streak
1    Tied     Hoyt    Grove  None  2:05   D     72000.0       1
2  up 0.5  Ruether     Gray  None  2:15   D      8000.0       2
3    Tied     None     None  None  2:50   D      9000.0       2
4    Tied  Pennock    Ehmke  None  2:27   D     16000.0       3
5  up 1.0  Shocker  Ruffing  None  2:05   D     25000.0       4

排名:最新或历史分区排名,w/l记录

Standings(Season)函数给出给定季节的分区排名。如果选择本赛季,它将给出最新的一组排名。否则,它将给出所选季节的每个分区的季末排名。

此函数返回数据帧列表。每个数据帧都是MLB六个分区中的一个分区的列表。

>>> from pybaseball import standings
>>> data = standings(2016)[4]
>>> print(data)
                    Tm    W   L  W-L%    GB
1         Chicago Cubs  103  58  .640    --
2  St. Louis Cardinals   86  76  .531  17.5
3   Pittsburgh Pirates   78  83  .484  25.0
4    Milwaukee Brewers   73  89  .451  30.5
5      Cincinnati Reds   68  94  .420  35.5

完整文档

到目前为止,这提供了这个包可以做什么以及如何使用它的基本概述。有关可用函数及其参数的完整文档,请参阅文档文件夹。

那我该怎么办呢?

需要灵感吗?请参阅使用此软件包复制的经典棒球研究的一些示例,请参见此处的" rel="nofollow"


这个pacakge的灵感来源于bill petti的优秀r包baseballr,到目前为止,它还没有python等价物。我希望用这个图书馆来填补这个空白。

安装

要安装pybarball,只需运行

pip install pybaseball

或者,对于当前回购协议上的版本(有时可能更为最新):

git clone https://github.com/jldbc/pybaseball
cd pybaseball
python setup.py install

正在进行的工作:

向前看,我打算:

  • 实施定制指标,如STATCAST边缘百分比、历史ELO评级、WOBA等。
  • 确定这些查询失败的边缘情况(如果找到问题,请打开问题!)
  • 添加更多示例

对贡献感兴趣?我在contribution.md中留下了一些想法。

依赖关系

此库取决于:熊猫、努比、BS4(靓汤)和请求。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为什么ObjectOutputStream将符号写入文件而不是我的输入?   java Spring boot@ExceptionHandler未捕获子类异常   以编程方式发送mule消息(以前是:从java访问mule http端点)   java如何从应用程序外部更改JavaFX应用程序的内容   java舍入误差近似   网络Java客户端在尝试从Java服务器创建ObjectInputStream时冻结   java在创建区域和持久化区域到磁盘Geme Gemfire Spring Boot时遇到问题   计算字符串中的字符数   java我们如何在eclipseLink中使用自己的集合进行延迟加载?   java中ArrayList的初始化类型之间的差异   java ArrayIndexOutOfBoundsInsert与键盘固定器一起使用时发生异常   安卓 Java函数在函数执行前返回一个值   通过反射构造枚举的java设计模式   java ksh命令替换为数组中的引号   java有没有一种方法可以在Mockito中同时通过引用和相等进行匹配?   java什么是与Stripe Connect相当的PayPal REST API?   数学Java Haversine公式的实现问题   java使用jdbc和Kerberos委派连接到SAP HANA DB   java如何删除GeoDistanceSortBuilder的ignoreUnmapped?