在这篇文章中,我研究了如何提取一个篮球运动员的得分图数据,然后使用 matplotlib 和 seaborn 绘制得分图。
| 123456 | %matplotlib inline import requestsimport matplotlib.pyplot as pltimport pandas as pdimport seaborn as sns |
从 stats.nba.com 获取数据是非常简单的。虽然 NBA 没有提供一个公共的 API,但是实际上我们可以通过使用 requests 库来访问 NBA 用在 stats.nba.com 上的 API。Greg Reda 发布的这篇博客很好地解释了如何访问这个 API(或者为任意 web 应用找到一个 API 来完成上述问题)。
我们将会使用这个 URL 来获取 James Harden 的得分图数据。
| 123456789 | shot_chart_url = \’http://stats.nba.com/stats/shotchartdetail?CFID=33&CFPAR\’\\ \’AMS=2014-15&ContextFilter=&ContextMeasure=FGA&DateFrom=&D\’\\ \’ateTo=&GameID=&GameSegment=&LastNGames=0&LeagueID=00&Loca\’\\ \’tion=&MeasureType=Base&Month=0&OpponentTeamID=0&Outcome=&\’\\ \’PaceAdjust=N&PerMode=PerGame&Period=0&PlayerID=201935&Plu\’\\ \’sMinus=N&Position=&Rank=N&RookieYear=&Season=2014-15&Seas\’\\ \’onSegment=&SeasonType=Regular+Season&TeamID=0&VsConferenc\’\\ \’e=&VsDivision=&mode=Advanced&showDetails=0&showShots=1&sh\’\\ \’owZones=0\’ |
上述 URL 发送给我们一个 JSON 文件,该文件包含我们想要的数据。也要注意到 URL 包含了用于访问数据的各种 API 参数。URL 中被设置为 201935 的 PlayerID 参数就是 James Harden 的 PlayerID。
现在让我们使用 requests 库来获取我们想要的数据。
| 123456 | # Get the webpage containing the dataresponse = requests.get(shot_chart_url)# Grab the headers to be used as column headers for our DataFrameheaders = response.json()[\’resultSets\’][0][\’headers\’]# Grab the shot chart datashots = response.json()[\’resultSets\’][0][\’rowSet\’] |
利用获取到的得分图数据创建一个 pandas DataFrame。
| 12345 | shot_df = pd.DataFrame(shots, columns=headers)# View the head of the DataFrame and all its columnsfrom IPython.display import displaywith pd.option_context(\’display.max_columns\’, None): display(shot_df.head()) |

上述的得分图数据包含了 2014-15 常规赛期间 James Harden 所有的投篮出手次数。我们想要的数据在 LOC_X 和 LOC_Y 中。这是每次投篮出手位置的坐标值,然后就可以在代表篮球场的一组坐标轴上绘制这些坐标值了。
让我们快速地绘制数据,看看数据是如何分布的。
| 12345 | sns.set_style(\”white\”)sns.set_color_codes()plt.figure(figsize=(12,11))plt.scatter(shot_df.LOC_X, shot_df.LOC_Y)plt.show() |

注意到上述的图表没能很好的表示数据。横坐标轴上的值与实际的相反了。下面只把右边的投篮绘制出来,看看问题出在哪里。
| 123456 | right = shot_df[shot_df.SHOT_ZONE_AREA == \”Right Side(R)\”]plt.figure(figsize=(12,11))plt.scatter(right.LOC_X, right.LOC_Y)plt.xlim(–300,300)plt.ylim(–100,500)pan class=\”crayon-sy\”>)plt.ylim(–100,500)文章中,我研究了如何提取一个篮球运动员的得分图数据,然后使用 matplotlib 和 seaborn 绘制得分图。
获取数据从 stats.nba.com 获取数据是非常简单的。虽然 NBA 没有提供一个公共的 API,但是实际上我们可以通过使用 我们将会使用这个 URL 来获取 James Harden 的得分图数据。
上述 URL 发送给我们一个 JSON 文件,该文件包含我们想要的数据。也要注意到 URL 包含了用于访问数据的各种 API 参数。URL 中被设置为 201935 的 PlayerID 参数就是 James Harden 的 PlayerID。 现在让我们使用
利用获取到的得分图数据创建一个
上述的得分图数据包含了 2014-15 常规赛期间 James Harden 所有的投篮出手次数。我们想要的数据在 LOC_X 和 LOC_Y 中。这是每次投篮出手位置的坐标值,然后就可以在代表篮球场的一组坐标轴上绘制这些坐标值了。 绘制得分图数据让我们快速地绘制数据,看看数据是如何分布的。
注意到上述的图表没能很好的表示数据。横坐标轴上的值与实际的相反了。下面只把右边的投篮绘制出来,看看问题出在哪里。
|