上次学习了使用jupyter notebook简单展示了单变量和双变量的数据可视化。在这篇文章中,我将在上一篇文章的基础上,实践一些python数据处理和派生变量的可视化实践。
如果要在现有数据集中生成新的变量,例如:按照年龄将玩家分成三代,可以定义一个函数,然后使用apply的方法生成新的变量。
#根据已有变量生成新的变量
data['avg_point']=data['POINTS']/data['MP'] #每分钟得分
def age_cut(df):
if df.AGE<=24:
return 'young'
elif df.AGE>=30:
return 'old'
else:
return 'best'
data['age_cut']=data.apply(lambda x: age_cut(x),axis=1) #球员是否处于黄金年龄
data['cnt']=1 #计数用
同样的目的,也可以使用numpy模块中的函数np.where,和excel中的if函数和R语言中的ifelse函数差不多,非常方便。
既然拿到了老中青三代的标签,我们再来看看不同年龄球员的RPM(正负)与之前的工资之间的关系:
### 球员薪水与效率值 按年龄段来看
sns.set_style('darkgrid') #设置seaborn的面板风格
plt.figure(figsize=(8,8))
plt.title(u'$RPM\ and\ SALARY$',size=15)
X1=data.loc[data.age_cut=='old'].SALARY_MILLIONS
Y1=data.loc[data.age_cut=='old'].RPM
X2=data.loc[data.age_cut=='best'].SALARY_MILLIONS
Y2=data.loc[data.age_cut=='best'].RPM
X3=data.loc[data.age_cut=='young'].SALARY_MILLIONS
Y3=data.loc[data.age_cut=='young'].RPM
plt.plot(X1,Y1,'.')
plt.plot(X2,Y2,'.')
plt.plot(X3,Y3,'.')
plt.xlim(0,30)
plt.ylim(-8,8)

plt.xlabel('Salary',size=10)
plt.ylabel('RPM',size=10)
plt.xticks(np.arange(0,30,3))
plt.legend(['old','best','young'])
点阵图的横轴是球员的薪水,纵轴是效率值。可以观察到:
使用上一篇文章的方法,看一下老中青三代的技术统计分布:
dat2=data.loc[:,['RPM','POINTS','TRB','AST','STL','BLK','age_cut']]
sns.pairplot(dat2,hue='age_cut')
团队数据分析
团队薪资排名
将数据按球队分组,平均工资从高到低,看看联盟中最富有的 10 支球队:
### 分组操作 按球队
dat_grp=data.groupby(by=['TEAM'],as_index=False).agg({'SALARY_MILLIONS':np.mean,'RPM':np.mean,'PLAYER':np.size})

dat_grp=dat_grp.loc[dat_grp.PLAYER>5] #不考虑在赛季中转会的球员
dat_grp.sort_values(by='SALARY_MILLIONS',ascending=False).head(10)
团队年龄结构
先肥不肥,后肥压炕。高素质年轻球员的储备是保持球队竞争力的关键。
我根据球队和年龄组对球员进行降序排列。如果列表中的玩家数量相同,则按照效率值的降序排列。
### 分组操作 按场上位置
dat_grp2=data.groupby(by=['TEAM','age_cut'],as_index=False).agg({'SALARY_MILLIONS':np.mean,'RPM':np.mean,'PLAYER':np.size})
dat_grp2=dat_grp2.loc[dat_grp2.PLAYER>3] ##剔除掉少量的position摇摆人
dat_grp2.sort_values(by=['PLAYER','RPM'],ascending=False).head(15)
团队综合实力分析
最后,我们来看看团队的整体实力:
效率值降序排列前10名的球队信息如下:
##数据可视化 按球队

dat_grp3=data.groupby(by=['TEAM'],as_index=False).agg({'SALARY_MILLIONS':np.mean,'RPM':np.mean,'PLAYER':np.size,'POINTS':np.mean,'eFG%':np.mean,'MPG':np.mean,'AGE':np.mean})
dat_grp3=dat_grp3.loc[dat_grp3.PLAYER>5]
dat_grp3.sort_values(by=['RPM'],ascending=False).head(10
用箱线图和小提琴图看10支球队的相关数据
sns.set_style('whitegrid')#设置seaborn的面板风格
plt.figure(figsize=(12,8))
dat_grp4=data[data['TEAM'].isin(['GS','CLE','SA','LAC','OKC','UTAH','CHA','TOR','NO','BOS'])]
plt.subplot(3,1,1)
sns.boxplot(x='TEAM',y='AGE',data=dat_grp4)
plt.subplot(3,1,2)
sns.boxplot(x='TEAM',y='SALARY_MILLIONS',data=dat_grp4)
plt.subplot(3,1,3)
sns.boxplot(x='TEAM',y='MPG',data=dat_grp4)
plt.figure(figsize=(12,8))
plt.subplot(3,1,1)
sns.violinplot(x='TEAM',y='POINTS',data=dat_grp4)
plt.subplot(3,1,2)
sns.violinplot(x='TEAM',y='eFG%',data=dat_grp4)
plt.subplot(3,1,3)
sns.violinplot(x='TEAM',y='RPM',data=dat_grp4)
聪明点,马刺队作为老牌劲旅,其实有一名效率为负离群值的球员。找出他是谁:
data.loc[data.TEAM=='SA'].sort_values(by='RPM',ascending=True).head(3)
23岁的福布斯就出现在这个尴尬的位置上nba球员数据统计数据,加油吧!
结语
一年一度的NBA比赛即将重燃!随着科技的进步,我们可以更好的记录和分析篮球比赛的数据nba球员数据统计数据,
这让我们更好地了解篮球,了解球员,结合自己的专业知识和兴趣,更好地享受篮球比赛的无限魅力。