当前位置: 首页 > 后端技术 > Python

【Python数据分析】NBA球星喜欢投篮的地方

时间:2023-03-26 17:06:38 Python

前言1.我把这个数据分析案例做了一个视频版,解读了代码,讲了跑步的注意事项和一些没有的东西。是的,供求关系。我在视频制作方面不是很有经验,请多多包涵。(视频中有彩蛋)NBA球星投篮点分布https://www.zhihu.com/video/11294016825803489282。这篇文章的案例代码写完后贴在了虎扑上。结果被推荐上了首页,浏览量超过25万,回复近800……谢谢JR们的脸!3.要获取原图、更多玩家生成的结果和完整代码,请在公众号“Crossin的编程课堂”中回复关键词:nba---------------------NBA2018-19赛季已经落下帷幕,猛龙击败勇士,成为新的冠军球队。我觉得还是做一个NBA相关的数据分析案例比较好。事实上,数据分析团队已经是目前NBA球队的标配,无论是球员选择还是战术制定都发挥着重要作用。在整个联盟越来越流行的“魔球”打法,其实是一种基于数据分析的产物。那么,让我们利用官方数据和Python的绘图功能,看看不同球员的射门位置。0.效果展示照例先看效果。每个点都是一次射门,蓝色点是一次射门,红色点是未命中。挑几个有特点的:哈登,魔球很明显,投两分效率低肯定是西蒙斯做不到的,经典中锋德拉赞,中投小王子字母哥,我给你扣篮在篮下糊涂!库里,这得在全场展示一下……科比,生涯累积图,全能无死角,包括篮板背后的负角。下面我们来看看具体步骤。我们就以刚刚拿到本赛季总冠军戒指的林书豪为例。1.获取数据NBA有一个官方统计网站:http://stats.nba.com,上面有各种数据,可以说是个宝库。从网页上,我没有找到我这次需要的数据。但是经过一番搜索,我找到了该网站的开放接口API。可以从本项目查看相关接口和文档:nba_py-http://stats.nba.comAPIforpythonhttps://github.com/seemethere/nba_py/通过如下接口,我们可以获取指定球员的详细信息本赛季投篮数据:https://stats.nba.com/stats/shotchartdetail?CFID=33&CFPARAMS=2018-19&ContextFilter=&ContextMeasure=FGA&DateFrom=&DateTo=&GameID=&GameSegment=&LastNGames=0&LeagueID=00&Location=&MeasureType=Base&Month=0&OpponentTeamID=0&Outcome=&PaceAdjust=N&PerMode=PerGame&Period=0&PlayerID=201935&PlusMinus=N&Position=&Rank=N&RookieYear=&Season=2018-19&SeasonSegment=&SeasonType=Regular+Season&TeamID=0&VsConference=&VsDivision=&mode=Advanced&showDetails=0&showShots=1&showZones=0&PlayerPosition=其中参数PlayerID是查询球员ID,可在网页搜索玩家名称,从对应的URL中获取。比如林书豪是202391https://stats.nba.com/player/202391/链接里的两个2018-19是赛季参数,可以改成其他赛季,不过我尽量不要太早,大约96年前没有数据,早期数据的准确性很差。其他参数可以忽略。使用requests库可以轻松获取结果(需要添加headers):response=requests.get(url,headers=headers,timeout=5)2.解析数据返回的数据为JSON格式,即由pandas转换成DataFrame格式,方便后续处理:data=response.json()#获取列名,即每一个镜头的含义dataheaders=data['resultSets'][0]['headers']#获取相关数据shots=data['resultSets'][0]['rowSet']#转DataFrameshot_df=pd.DataFrame(shots,columns=headers)我们关心的数据是LOC_X这三列,LOC_Y(投篮位置)和SHOT_MADE_FLAG(投篮是否命中)。3.绘制射击点使用matplotlib库的scatter方法绘制射击点。我们在之前的各种案例中多次使用过它:made=shot_df[shot_df['SHOT_MADE_FLAG']==1]miss=shot_df[shot_df['SHOT_MADE_FLAG']==0]plt.scatter(miss.LOC_X,miss.LOC_Y,color='r',marker='.',alpha=0.3)plt.scatter(made.LOC_X,made.LOC_Y,color='b',marker='.',alpha=0.3)我们设置尺寸和通过参数设置点的透明度,使显示更清晰。4.画出球场的投篮点,画出来了,就是不够直观。让我们再添加一张体育场的图片。这是matplotlib中的Circle、Rectangle、Arc等方法拼出来的。没有什么特别的技术,只是代码比较繁琐,这里就不贴了。(只要你愿意,你甚至可以用它来画粉红猪小妹)5.添加头像最后,给数据图添加头像,让它看起来更完整。爆头地址:https://stats.nba.com/media/players/230x185/202391.png或https://ak-static.cms.nba.com/wp-content/uploads/headshots/nba/latest/260x190/202391.png文件名仍然是玩家ID,但这个地址并不是对所有玩家都有效,可以做异常处理。pic=urllib.request.urlretrieve("http://stats.nba.com/media/players/230x185/202391.png")#imread读取的图像可以用matplotlib绘制head_pic=plt.imread(pic[0])#将播放器图片放在右上角,并设置缩放级别以匹配整个图片img=OffsetImage(head_pic,zoom=0.6)#(x,y)控制播放器放置在你想要img的位置。set_offset((540,640))#添加播放器图片fig.gca().add_artist(img)如果你电脑上的位置不对,记得修改offset的值(不同的系统,甚至不同的编译器可能会有差异)。最终效果:要获取原图、更多玩家生成的结果和完整代码,请在公众号“Crossin的编程课堂”回复关键词:nba