客户需求:
①统计数据中排名前十的 所有榜单歌手出现次数 绘制直方图
②对排名前三的歌手绘制饼图 查看他们的歌曲主要出现在哪些榜单
③对出现次数多的歌名做词云图(前20)
一. 快速搭建环境
1.1 由于是新电脑所以我花了一点时间在环境搭建上。首先安装anaconda,(自带jupyter,pandas,matlibplot)由于官网下载的太慢了,我选择了清华下载(安装基本上就是一直下一步,我只改了安装目录,最后一步添加环境变量的时候,看个人情况,如果安装了其他python版本的时候,记得考虑)
https://mirrors4.tuna.tsinghua.edu.cn/anaconda/archive/
1.2快速安装mysql和可视化工具,小姐姐给的数据是存在数据库里的,所以需要搭建mysql数据。
mysql安装可以之间参考这篇博客,简洁快速!!比免安装版方便一些
mysql下载链接:https://pan.baidu.com/s/1DSwLlkQrxSduBmMwzeWOpA
提取码:qza3
数据库可视化工具我使用的是Navicat,中文版以及注册文件:
链接:https://pan.baidu.com/s/1T4C3ZR95KrbCORII2gn7vQ
提取码:616o
Navicat使用方法不多赘述
二. 数据分析过程
使用Navicat导出csv数据后是这样的,打开csv文件是乱码的,没有关系,因为是utf-8编码,可以不需要修改csv文件的编码
接下来就是打开jupyter开始写代码!
2.1 导入哪些包~
# 魔法方法显示图形
%matplotlib inline
# 数据处理
import pandas as pd
import numpy as np
import os
# 绘图
import matplotlib.pyplot as plt
# 云图
from wordcloud import WordCloud
2.2 一些无聊的设置~方便自己
# 对齐
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
# 显示所有行
pd.set_option('display.max_rows', None)
#设置value的显示长度为100,默认为50
pd.set_option('max_colwidth',10)
# 设置中文字体
plt.rcParams['font.family']=['sans-serif']
plt.rcParams['font.sans-serif']=['SimHei']
2.3 第一步,先合并所有数据,这里我是用的方法是获取文件名,然后遍历文件名,依次读取,添加列,给每个数据打上榜单标签,然后合并给空的dateframe,和列表的append方法很像!!
# 获取文件名 遍历读取csv文件并且增加榜单列 最后合并所有数据
# os.chdir('data')
filenames = os.listdir()
all_df = pd.DataFrame(columns = ['song_name','rising_range','single','music_list'])
for file in filenames:
df = pd.read_csv(file,names=['song_name','rising_range','single'],header=None)
df['music_list']=file[:-4]
all_df=all_df.append(df,ignore_index=True)
print(all_df)
合并后的效果~数据共有500条,排名上升幅度这列其实没啥用
(原谅我这拙劣的英语命名…)
2.4 客户需求一
# 所有榜单中歌手出现次数(排名前10)
# 这里也可以使用groupby方法
single_count = all_df.loc[:,'single'].value_counts()[:10]
# 绘图
x = single_count.index.tolist()
y = single_count.to_list()
plt.figure(dpi=100)
plt.bar(x,y)
# 绘制标识
for a,b in zip(x,y):
plt.text(a,b,'%d' %b,ha='center',va='bottom')
plt.title('各榜单歌手出现次数统计')
plt.savefig('各榜单歌手出现次数统计.jpg')
2.5 客户需求二
# 筛选与统计
single1 = all_df[all_df.single=='是七叔呢']
a = single1.loc[:,'music_list'].value_counts()
single2 = all_df[all_df.single=='周深']
b = single2.loc[:,'music_list'].value_counts()
single3 = all_df[all_df.single=='薛之谦']
c = single3.loc[:,'music_list'].value_counts()
# 绘图函数
def draw_pie(data,single):
# 总值
total = data.sum()
# 百分比
values = data.to_list()
sizes = []
for value in values:
percent = value/total
sizes.append(percent)
# 标签
labels = data.index.tolist()
# 绘图
plt.figure(dpi=150)
plt.title((single+'歌曲所在主要榜单'))
plt.pie(sizes,labels=labels,startangle=90,autopct='%1.1f%%')
plt.savefig((single+'.jpg'))
draw_pie(a,'是七叔呀')
draw_pie(b,'周深')
draw_pie(c,'薛之谦')
2.6 客户需求三
# 云图
# 统计
song = all_df.loc[:,'song_name'].value_counts()[:20]
# 转变为字典类型
df_dict = dict(song)
# print(song)
# 设置生成云图大小
plt.figure(figsize=(10,8),dpi=200)
# 设置
wc = WordCloud(
scale=4, # 比例尺 让字体变清晰
background_color='white',# 设置背景颜色
font_path="simhei.ttf",# 字体
max_words=200, # 设置最大现实的字数
max_font_size=80,# 设置字体大小最大值
random_state=30# 设置有多少种随机生成状态,即有多少种配色方案
)
# 填词
wc = wc.fit_words(df_dict)
# 显示图片
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
# 保存图片
plt.savefig('云图.jpg')