客户需求:
①统计数据中排名前十的 所有榜单歌手出现次数 绘制直方图
②对排名前三的歌手绘制饼图 查看他们的歌曲主要出现在哪些榜单
③对出现次数多的歌名做词云图(前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条,排名上升幅度这列其实没啥用

(原谅我这拙劣的英语命名…)

数据分析大赛数据 数据分析大赛课题设计_数据分析大赛数据_02


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')

数据分析大赛数据 数据分析大赛课题设计_数据分析_03


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,'薛之谦')

数据分析大赛数据 数据分析大赛课题设计_数据_04

数据分析大赛数据 数据分析大赛课题设计_数据分析大赛数据_05

数据分析大赛数据 数据分析大赛课题设计_数据分析大赛数据_06


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')