# 用Python分析投票数据，选出真正的乐队TOP 5

`import pandas as pdimport numpy as npimport matplotlib.pyplot as plt`

`# 配置乐队的夏天主题色purple = (0.22,0.09,0.59) # 紫色yellow = (0.99,0.89,0.27) # 黄色green = (0.36,0.94,0.55) # 绿色blue = (0.06,0.24,0.78) # 蓝色red = (0.98,0.31,0.36) # 红色`

`# 读取数据data1 = pd.read_excel('/.../乐队的夏天.xlsx','第一场')data2 = pd.read_excel('/.../乐队的夏天.xlsx','第二场两两PK赛')data3 = pd.read_excel('/.../乐队的夏天.xlsx','第三场累计积分赛')data4 = pd.read_excel('/.../乐队的夏天.xlsx','第四场复活赛')data5 = pd.read_excel('/.../乐队的夏天.xlsx','第五场9进7')data6 = pd.read_excel('/.../乐队的夏天.xlsx','第六场总决赛')`

`# 观察数据data1.info()data1.head()`

```# 可以看到有四只乐队是没有得分和排名的，把他们列出来
data1[data1['总得分'].isnull()]```

`data1 = data1.dropna(axis = 0)`

• Z_score 标准分
• 0-1 normalization 归一分

Z_score标准分的计算方法是用“（该乐队当场得分-当场所有乐队得分的平均数）/ 当场所有乐队得分的标准差”计算得到：

`# 标准分函数定义def z_score_normalize(series):  mean = series.mean()  std_dv = series.std()  return series.apply(lambda x:(x - mean) / std_dv)  # 用循环的方式批量对每场比赛的得分做处理competition = [data1,data2,data3,data4,data5,data6]for period in competition:    period['超级乐迷得分_标准分'] =  z_score_normalize(period['超级乐迷得分'])    period['专业乐迷得分_标准分'] =  z_score_normalize(period['专业乐迷得分'])    period['大众乐迷得分_标准分'] =  z_score_normalize(period['大众乐迷得分'])    period['总得分_标准分'] =  z_score_normalize(period['总得分'])`

0-1 normalization 归一分的计算方法是用“乐队得票数/总票数”计算得到，也等于常说的得票率：

`# 定义归一化的函数def normalize(series,x_max):    return series.apply(lambda x: x/x_max)# 对不同总分不同类别的得分应用归一化函数for data in [data1,data2,data5,data6]:    data['超级乐迷_归一分'] = normalize(data['超级乐迷得分'],50)data3['超级乐迷_归一分'] = normalize(data3['超级乐迷得分'],60)data4['超级乐迷_归一分'] = normalize(data4['超级乐迷得分'],40)for data in [data1,data2,data3,data4,data5,data6]:    data['专业乐迷_归一分'] = normalize(data['专业乐迷得分'],40)    for data in [data1,data2]:    data['大众乐迷_归一分'] = normalize(data['大众乐迷得分'],100)for data in [data3,data4,data5,data6]:    data['大众乐迷_归一分'] = normalize(data['大众乐迷得分'],360)`

`total_score`

PART I ：这些宝藏乐队你不应该错过！

`# 按照乐队这个标签分类计算，计算方式是平均值，计算字段是总得分_标准分，然后按照总得分_标准分排列total_score_mean = total_score.groupby(['乐队'])[['总得分_标准分']].mean().sort_values(    by = '总得分_标准分',ascending = False)total_score_mean`

`# 对乐队总得分_标准分做可视化y = np.arange(len(total_score_mean.index))x = np.array(list(total_score_mean['总得分_标准分']))fig,ax = plt.subplots(figsize = (12,12))total_score_mean.plot.barh(ax=ax,alpha=0.7,title='27只乐队场均表现',color = 'g')for a,b in zip(x,y):    plt.text(a, b, '%.2f' % a, ha='center', va= 'center',fontsize=12)ax.grid(False)`

`# 把痛仰的成绩拉出来看一下 total_score[total_score['乐队'] == '痛仰乐队']`

“再见杰克”和“西湖”都在当轮比赛中取得非常突出的表现，但“我愿意”真的可惜了。

`total_score[total_score['乐队'] == '面孔乐队']`

`# 代码逻辑和前面选总得分作为计算字段的逻辑一样，只不过这次选取单个群体得分作为指标super_score_mean = total_score.groupby(['乐队'])[['超级乐迷得分_标准分']].mean().sort_values(    by = '超级乐迷得分_标准分')pro_score_mean = total_score.groupby(['乐队'])[['专业乐迷得分_标准分']].mean().sort_values(    by = '专业乐迷得分_标准分')public_score_mean = total_score.groupby(['乐队'])[['大众乐迷得分_标准分']].mean().sort_values(    by = '大众乐迷得分_标准分')`

`fig,ax = plt.subplots(1,3,figsize = (16,6))super_score_mean.tail(5).plot.barh(ax=ax[0],color = '#dc2624',alpha=0.7,title='超级乐迷心中TOP5',grid=False)pro_score_mean.tail(5).plot.barh(ax=ax[1],color = '#2b4750',alpha=0.7,title='专业乐迷心中TOP5',grid=False)public_score_mean.tail(5).plot.barh(ax=ax[2],color = '#649E7D',alpha=0.7,title='大众乐迷心中TOP5',grid=False)`

PART II ：乐队的排名就像人生，它会起起落落落落落

PART III ：如果你只有十首歌的时间，我建议你听这些歌

`# 看看数据整体的描述total_nor_score.describe()# 运用箱型图可以看到各组给分的分布，其中蓝线是平均分，圆圈是最小值fig,ax = plt.subplots(1,1,figsize = (8,4))total_nor_score.boxplot(ax = ax,grid=False)`

`top10_songs = total_nor_score.sort_values(by = '总得分_归一分').tail(10)top10_songs.plot.barh(x='歌曲',y='总得分_归一分',color=purple)print('截止第六期，最受欢迎的10首歌分别是:\n',list(top10_songs['歌曲']))`

• 夏日终曲
• 凡人歌
• How come u leave me like this
• 生命因你而火热
• 椑面派对
• 西湖
• 花火
• Bye Bye
• 公路之歌
• 没有理想的人不伤心

`total_nor_score.sort_values(by = '超级乐迷_归一分').tail(10).plot.barh(x='歌曲',y='超级乐迷_归一分',color=red)total_nor_score.sort_values(by = '专业乐迷_归一分').tail(10).plot.barh(x='歌曲',y='专业乐迷_归一分',color=yellow)total_nor_score.sort_values(by = '大众乐迷_归一分').tail(10).plot.barh(x='歌曲',y='大众乐迷_归一分',color=green)`

PART IIII：灵魂拷问：“我愿意”为什么跳水？谁在不喜欢海龟先生？

`total_nor_score[total_nor_score['歌曲'] == '我愿意']`

`total_nor_score_t = pd.merge(total_nor_score, total_score[['乐队','歌曲']], on='歌曲')total_nor_score_t[total_nor_score_t['乐队'] == '海龟先生']`

“咿呀呀”这首歌拖累了海龟的整体平均分，而在这首歌中，专业乐迷给票的比例是最低的。

`total_nor_score_t[total_nor_score_t['乐队'] == '海龟先生'].mean()超级乐迷_归一分    0.836000`
• 专业乐迷_归一分 0.690000
• 大众乐迷_归一分 0.779444
• 总得分_归一分 0.778734

PART IV：不要情感，拒绝同情票，我只想告诉你真相

`data6.iloc[:,:-9]`

`# 选中7只队伍final_7 = ['新裤子','痛仰乐队','九连真人','Click#15','刺猬','盘尼西林','旅行团乐队']# 分别计算标准分final_7_total_score = total_score_mean.loc[final_7,].sort_values(by='总得分_标准分')# 可视化fig,ax = plt.subplots(1,1,figsize = (10,20))final_7_total_score.plot.barh(ax=ax,color = yellow,alpha=0.7,title='我心中Hot5',grid=False)`

‍ 从这个结果来看，其实盘尼西林是排在最后一位的，但因为增加了投票而被捞了回来。赛制的改变，使得结果有人欢喜有人愁。

0 条评论

• ### 传统企业大数据应用难落地？说穿了还是因为这3点

在中国，从2013年大数据元年始，上至国家总理，下至普通平民，大数据的词汇已经深入人心，大家都觉得大数据是个好事，但基本上都是叫好不叫坐，尤其是在传统企业中。现...

• ### 用户首次付费分析

作者 邓培 本文为CDA数据分析师志愿者原创作品，转载需授权 ---- 导读 作者目前在一家互联网证券社交平台从事产品数据分析工作，本项目解决用户自激活 AP...

• ### 一张图读懂什么是“开放数据”

2009年，开放数据运动席卷全球。随后几年，中国跟进。 ? 现在，已有不少国家和地区正努力开放政府乃至企业的数据，以实现其经济和社会价值。 但直到现在，这还是一...

• ### 乐队的夏天大结局！用Python分析投票数据，选出真正的乐队TOP 5

在昨天的盛大party后，《乐队的夏天》终于顺利收官。这个燃爆了整个夏天的综艺是否是今年最火的综艺节目虽然不得而知，但是不可否认，将乐队和摇滚又重新带到了公众面...

• ### 用Python告诉你，谁是这个夏天的最强乐队？

虽然现在大众的兴趣非常的分散，乐队的夏天是否是今天最火的综艺节目，每个人心中的答案都是不一样的。但在我看来，我很感谢有这么一个节目，可以让我接触到不同类型的音乐...

• ### SQL学习笔记之SQL查询练习1

–1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Co...

• ### Hive SQL50道练习题

– 4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩: – (包括有成绩的和无成绩的)

• ### docker数据卷备份恢复以及配置桥接网络

如果数据卷容器的共享目录已经挂载到了本地宿主机的磁盘上，那么就无需进行数据卷备份。没有进行挂载到本地，而是作为共享目录的数据卷容器，就得定期将数据卷进行一个备份...

• ### Hive快速入门系列(10) | Hive的查询语法

注： 1、order by 会对输入做全局排序，因此只有一个reducer，会导致当输入规模较大时，需要较长的计算时间。 2、sort by不是全局排序，其...

• ### 服务器-Nginx-一个简单的例子

直接贴一个几经磨难的简单的例子吧，虽然简单，但是有些不理解的地方，就出了很多错，但是因为这些错误，在对nginx理解稍微深刻了那么一点点的同时，对Linux的操...

CDA数据分析师新媒体运营