爬取NBA球员数据画出球员的雷达图

本文介绍了如何爬取NBA球员斯蒂芬-库里和勒布朗-詹姆斯的生涯常规赛数据,并进行清洗。接着利用Python的pyecharts库绘制了两人的雷达图,展示了他们在不同赛季的投篮命中率、场均篮板、助攻、抢断和盖帽。最后通过Timeline组件创建了一个时间轴,以自动播放形式展示2009年至2019年的球员数据变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

爬取NBA球员数据并进行清洗

画出两个球员的雷达图

创建时间轴组件自动以时间轴播放

代码整理:

总结


 

爬取NBA球员数据并进行清洗

这里我是从https://nba.hupu.com/players这个网址爬取了库里和詹姆斯的生涯常规赛数据

库里数据的网址:斯蒂芬-库里|Stephen Curry|斯蒂芬-库里视频|图片|数据资料-虎扑NBA (hupu.com)

詹姆斯的网址:勒布朗-詹姆斯|LeBron James|勒布朗-詹姆斯视频|图片|数据资料-虎扑NBA (hupu.com)

85f5728f95774645218350032169716a.png

解析库里数据的网页复制生涯常规赛数据的Xpath获取该表的每一个单元格数据的值,把爬取到的数据以表格对象的形式保存。

这里我把爬取并保存为表格数据封装为一个函数方便使用。

def getdata(url): data=requests.get(url).text s=etree.HTML(data) d=[[]for j in range(20)] for j in range(20): for i in range (19): a=s.xpath('//*[@id="in_box"]/div/div[1]/table[2]/tbody/tr['+str(j)+']/td['+str(i)+']/text()') b=str(a) c=b[2:-2] d[j].append(c) data1 = pd.DataFrame(d) data1=data1.drop(columns=0) data1.columns=['赛季', '球队', '场次', '首发', '时间', '投篮', '投篮命中率', '三分', '三分命中率', '罚球', '罚球命中率', '场均篮板', '场均助攻', '场均抢断', '场均盖帽', '场均失误', '场均犯规', '场均得分'] data1=data1.drop(index=[0,1]) return data1

 运行函数并且把数据保存为excel文件

url='https://nba.hupu.com/players/stephencurry-3311.html' url1='https://nba.hupu.com/players/lebronjames-650.html' getdata(url).to_excel('Stephen Curry.xlsx',index=False) getdata(url1).to_excel('LeBron James.xlsx',index=False)

 

导入球员数据,这里把球员的投篮命中率转换为小数。

data = pd.read_excel(r"LeBron James.xlsx")
data1 = pd.read_excel(r"Stephen Curry.xlsx")
for i in range(len(data['投篮命中率'])):
        data["投篮命中率"].iloc[i] = float(data["投篮命中率"].iloc[i].strip('%'))/100
for i in range(len(data1['投篮命中率'])):
        data1["投篮命中率"].iloc[i] = float(data1["投篮命中率"].iloc[i].strip('%'))/100

画出两个球员的雷达图

data=data.query(f'赛季=={year}')[['投篮命中率','场均篮板','场均助攻','场均抢断','场均盖帽']].values.tolist(),在data表中查询出每个赛季的 ‘投篮命中率' , '场均篮板',  '场均助攻' , '场均抢断' , '场均盖帽’ ,并且转换为list类型

画雷达图的代码封装成一个函数rader,参数是年份(赛季),返回值是雷达图对象。

 

def rader(year):
    import pyecharts.options as opts
    from pyecharts.charts import Radar
    c=(Radar(init_opts=opts.InitOpts(width="1200px", height="800px",bg_color='#FFFAFA'))
        .add_schema(
            schema=[
                opts.RadarIndicatorItem(name="投篮命中率", max_=0.70),
                opts.RadarIndicatorItem(name="场均篮板", max_=10),
                opts.RadarIndicatorItem(name="场均助攻", max_=10),
                opts.RadarIndicatorItem(name="场均抢断", max_=3),
                opts.RadarIndicatorItem(name="场均盖帽", max_=1.5),
            ],
            splitarea_opt=opts.SplitAreaOpts(
                is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)
            ),
        )
        .add(
            series_name="LeBron James",
            data=data.query(f'赛季=={year}')[['投篮命中率','场均篮板','场均助攻','场均抢断','场均盖帽']].values.tolist(),
            linestyle_opts=opts.LineStyleOpts(color="#2F4F4F"),
            color="#2F4F4F",
            areastyle_opts = opts.AreaStyleOpts(opacity=0.2)
        )
        .add(
            series_name="Stephen Curry",
            data=data1.query(f'赛季=={year}')[['投篮命中率','场均篮板','场均助攻','场均抢断','场均盖帽']].values.tolist(),
            linestyle_opts=opts.LineStyleOpts(color="#800080"),
            color="#800080",
            areastyle_opts = opts.AreaStyleOpts(opacity=0.2)
        )
        .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
        .set_global_opts(
            title_opts=opts.TitleOpts(title="基础雷达图"), legend_opts=opts.LegendOpts()
        )
    )
    return c

创建时间轴组件自动以时间轴播放

循环生成2009年到2019年的球员雷达图并且构建为自动播放两名球员的2009年到2019年的常规赛数据雷达图

from pyecharts import options as opts
from pyecharts.charts import Pie, Timeline
tl = Timeline()
tl.add_schema(
        is_auto_play=True, 
        play_interval=1000,#播放时间间隔,毫秒
    )
for year in range(2009,2019+1):
    c = rader(year) # 雷达图
    tl.add(c,f'{year}年')
tl.render_notebook()  

代码整理:

import requests
from lxml import etree
import pandas as pd
import numpy as np
import pyecharts.options as opts
from pyecharts.charts import Radar
from pyecharts import options as opts
from pyecharts.charts import Pie, Timeline

def getdata(url):
    data=requests.get(url).text
    s=etree.HTML(data)
    d=[[]for j in range(20)]
    for j in range(20):
        for i in range (19):
            a=s.xpath('//*[@id="in_box"]/div/div[1]/table[2]/tbody/tr['+str(j)+']/td['+str(i)+']/text()')
            b=str(a)
            c=b[2:-2]
            d[j].append(c)

    data1 = pd.DataFrame(d)
    data1=data1.drop(columns=0)
    data1.columns=['赛季', '球队', '场次', '首发', '时间', '投篮', '投篮命中率', '三分', '三分命中率', '罚球', '罚球命中率',
       '场均篮板', '场均助攻', '场均抢断', '场均盖帽', '场均失误', '场均犯规', '场均得分']
    data1=data1.drop(index=[0,1])
    return data1

getdata(url).to_excel('Stephen Curry.xlsx',index=False)
getdata(url1).to_excel('LeBron James.xlsx',index=False)

data = pd.read_excel(r"LeBron James.xlsx")
data1 = pd.read_excel(r"Stephen Curry.xlsx")

for i in range(len(data['投篮命中率'])):
        data["投篮命中率"].iloc[i] = float(data["投篮命中率"].iloc[i].strip('%'))/100

for i in range(len(data1['投篮命中率'])):
        data1["投篮命中率"].iloc[i] = float(data1["投篮命中率"].iloc[i].strip('%'))/100

def rader(year):
    import pyecharts.options as opts
    from pyecharts.charts import Radar
    c=(Radar(init_opts=opts.InitOpts(width="1200px", height="800px",bg_color='#FFFAFA'))
        .add_schema(
            schema=[
                opts.RadarIndicatorItem(name="投篮命中率", max_=0.70),
                opts.RadarIndicatorItem(name="场均篮板", max_=10),
                opts.RadarIndicatorItem(name="场均助攻", max_=10),
                opts.RadarIndicatorItem(name="场均抢断", max_=3),
                opts.RadarIndicatorItem(name="场均盖帽", max_=1.5),
            ],
            splitarea_opt=opts.SplitAreaOpts(
                is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)
            ),
        )
        .add(
            series_name="LeBron James",
            data=data.query(f'赛季=={year}')[['投篮命中率','场均篮板','场均助攻','场均抢断','场均盖帽']].values.tolist(),
            linestyle_opts=opts.LineStyleOpts(color="#2F4F4F"),
            color="#2F4F4F",
            areastyle_opts = opts.AreaStyleOpts(opacity=0.2)
        )
        .add(
            series_name="Stephen Curry",
            data=data1.query(f'赛季=={year}')[['投篮命中率','场均篮板','场均助攻','场均抢断','场均盖帽']].values.tolist(),
            linestyle_opts=opts.LineStyleOpts(color="#800080"),
            color="#800080",
            areastyle_opts = opts.AreaStyleOpts(opacity=0.2)
        )
        .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
        .set_global_opts(
            title_opts=opts.TitleOpts(title="基础雷达图"), legend_opts=opts.LegendOpts()
        )
    )
    return c

tl = Timeline()
tl.add_schema(
        is_auto_play=True, 
        play_interval=1000,#播放时间间隔,毫秒
    )
for year in range(2009,2019+1):
    c = rader(year) # 雷达图
    tl.add(c,f'{year}年')
tl.render_notebook()   

总结

在做项目中,我感受到了很多,不止专业知识的提升、扎实,动手的能力也增强,还有自身也收获到了许多,感觉项目其实没有想象中的那么不可能,我还能回想起开始做项目的时候,感觉自己就是什么也不会,有一种无从下手的错觉。当我真正的开始去写,发现没有做不到,只有不想做。项目虽然看着简单,去做的时候就会发现其实不简单,处理其中的逻辑更是要仔细。
做项目有时候还要熬夜,但我感觉挺开心的,每次解决完成或者解决一个bug的时候,真的觉得很满足,虽然在其中有不想做下去的感觉,但自我调节后又能活力满满。当一个项目完成的时候,虽然简单但是真的觉得自己很厉害。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值