目录
爬取NBA球员数据并进行清洗
这里我是从https://nba.hupu.com/players这个网址爬取了库里和詹姆斯的生涯常规赛数据
库里数据的网址:斯蒂芬-库里|Stephen Curry|斯蒂芬-库里视频|图片|数据资料-虎扑NBA (hupu.com)
詹姆斯的网址:勒布朗-詹姆斯|LeBron James|勒布朗-詹姆斯视频|图片|数据资料-虎扑NBA (hupu.com)
解析库里数据的网页复制生涯常规赛数据的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的时候,真的觉得很满足,虽然在其中有不想做下去的感觉,但自我调节后又能活力满满。当一个项目完成的时候,虽然简单但是真的觉得自己很厉害。