Python实现对网易云音乐的数据进行一个数据清洗和可视化分析

Python实现对网易云音乐的数据进行一个数据清洗和可视化分析

对音乐数据进行数据清洗与可视化分析

关于数据的清洗,实际上在上一一篇文章关于抓取数据的过程中已经做了一部分,后面我又做了一下用户数据的抓取

歌曲评论:

imgimg

包括后台返回的空用户信息、重复数据的去重等。除此之外,还要进行一些清洗:用户年龄错误、用户城市编码转换等。

关于数据的去重,评论部分可以以sommentId为数据库索引,利用数据库来自动去重;用户信息部分以用户ID为数据库索引实现自动去重。

API返回的用户年龄一般是时间戳的形式(以毫秒计)、有时候也会返回一个负值或者一个大于当前时间的值,暂时没有找到这两种值代表的含义,故而一律按0来处理。

API返回的用户信息中,城市分为province和city两个字段,本此分析中只保存了city字段。实际上字段值是一个城市code码,具体对照在这里下载。
利用Python的数据处理库pandas进行数据处理,利用可视化库pyecharts进行数据可视化。

分别查看下面分析结果。

  • 评论用户年龄分布
  • 评论关键词分布
  • 评论时间数量分布(年-月)
  • 评论时间数量分布(年-月-日)
对音乐数据进行数据清洗与可视化分析
import pandas as pd
import pymysql
from pyecharts import Bar,Pie,Line,Scatter,Map

TABLE_COMMENTS = '****'
TABLE_USERS = '****'
DATABASE = '****'

conn = pymysql.connect(host='localhost', user='****', passwd='****', db=DATABASE, charset='utf8mb4')
sql_users = 'SELECT id,gender,age,city FROM '+TABLE_USERS
sql_comments = 'SELECT id,time FROM '+TABLE_COMMENTS
comments = pd.read_sql(sql_comments, con=conn)
users = pd.read_sql(sql_users, con=conn)

# 评论时间(按天)分布分析
comments_day = comments['time'].dt.date
data = comments_day.id.groupby(comments_day['time']).count()
line = Line('评论时间(按天)分布')
line.use_theme('dark')
line.add(
	'',
	data.index.values,
	data.values,
	is_fill=True,
)
line.render(r'./评论时间(按天)分布.html')
# 评论时间(按小时)分布分析
comments_hour = comments['time'].dt.hour
data = comments_hour.id.groupby(comments_hour['time']).count()
line = Line('评论时间(按小时)分布')
line.use_theme('dark')
line.add(
	'',
	data.index.values,
	data.values,
	is_fill=True,
)
line.render(r'./评论时间(按小时)分布.html')
# 评论时间(按周)分布分析
comments_week = comments['time'].dt.dayofweek
data = comments_week.id.groupby(comments_week['time']).count()
line = Line('评论时间(按周)分布')
line.use_theme('dark')
line.add(
	'',
	data.index.values,
	data.values,
	is_fill=True,
)
line.render(r'./评论时间(按周)分布.html')

# 用户年龄分布分析
age = users[users['age']>0]	# 清洗掉年龄小于1的数据
age = age.id.groupby(age['age']).count()	# 以年龄值对数据分组
Bar = Bar('用户年龄分布')
Bar.use_theme('dark')
Bar.add(
	'',
	age.index.values,
	age.values,
	is_fill=True,
)
Bar.render(r'./用户年龄分布图.html')	# 生成渲染的html文件

# 用户地区分布分析
# 城市code编码转换
def city_group(cityCode):
    city_map = {
        '11': '北京',
        '12': '天津',
        '31': '上海',
        '50': '重庆',
        '5e': '重庆',
        '81': '香港',
        '82': '澳门',
        '13': '河北',
        '14': '山西',
        '15': '内蒙古',
        '21': '辽宁',
        '22': '吉林',
        '23': '黑龙江',
        '32': '江苏',
        '33': '浙江',
        '34': '安徽',
        '35': '福建',
        '36': '江西',
        '37': '山东',
        '41': '河南',
        '42': '湖北',
        '43': '湖南',
        '44': '广东',
        '45': '广西',
        '46': '海南',
        '51': '四川',
        '52': '贵州',
        '53': '云南',
        '54': '西藏',
        '61': '陕西',
        '62': '甘肃',
        '63': '青海',
        '64': '宁夏',
        '65': '新疆',
        '71': '台湾',
        '10': '其他',
    }
    return city_map[cityCode[:2]]
    
city = users['city'].apply(city_group)
city = city.id.groupby(city['city']).count()
map_ = Map('用户地区分布图')
map_.add(
	'',
	city.index.values,
	city.values,
	maptype='china',
	is_visualmap=True,
	visual_text_color='#000',
	is_label_show=True,
)
map_.render(r'./用户地区分布图.html')

可视化结果
img
img
评论时间按周分布图可以看出,评论数在一周当中前面较少,后面逐渐增多,这可以解释为往后接近周末,大家有更多时间来听听歌、刷刷歌评,而一旦周末过完,评论量马上下降(周日到周一的下降过渡),大家又回归到工作当中。
img
评论时间按小时分布图可以看出,评论数在一天当中有两个小高峰:11点-13点和22点-0点。这可以解释为用户在中午午饭时间和晚上下班(课)在家时间有更多的时间来听歌刷评论,符合用户的日常。至于为什么早上没有出现一个小高峰,大概是早上大家都在抢时间上班(学),没有多少时间去刷评论。
img

https://blog.csdn.net/u011371360

用户年龄分布图可以看出,用户大多集中在14-30岁之间,以20岁左右居多,除去虚假年龄之外,这个年龄分布也符合网易云用户的年龄段。图中可以看出28岁有个高峰,猜测可能是包含了一些异常数据,有兴趣的化可以做进一步分析。
img
用户地区分布图可以看出,用户涵盖了全国各大省份,因为中间数据(坑)的缺失,并没有展现出哪个省份特别突出的情况。对别的歌评(完全数据)的可视化分析,可以看出明显的地区分布差异。

此次分析只是对某一首歌曲评论时间、用户年龄/地区分布进行的,实际上抓取到的信息不仅仅在于此,可以做进一步分析(比如利用评论内容进行文本内容分析等),这部分,未来会进一步分析。当然也可以根据自己情况对不同歌曲进行分析。

歌词文本分析

情感分析采用Python的文本分析库snownlp,代码如下:

import numpy as np
import pymysql
from snownlp import SnowNLP
from pyecharts import Bar

TABLE_COMMENTS = '****'
DATABASE = '****'
SONGNAME = '****'

def getText():
	conn = pymysql.connect(host='localhost', user='root', passwd='root', db=DATABASE, charset='utf8')
	sql = 'SELECT id,content FROM '+TABLE_COMMENTS
	text = pd.read_sql(sql%(SONGNAME), con=conn)
	return text

def getSemi(text):
	text['content'] = text['content'].apply(lambda x:round(SnowNLP(x).sentiments, 2))
	semiscore = text.id.groupby(text['content']).count()
	bar = Bar('评论情感得分')
	bar.use_theme('dark')
	bar.add(
		'',
		y_axis = semiscore.values,
		x_axis = semiscore.index.values,
		is_fill=True,
	)
	bar.render(r'情感得分分析.html')

	text['content'] = text['content'].apply(lambda x:1 if x>0.5 else -1)
	semilabel = text.id.groupby(text['content']).count()
	bar = Bar('评论情感标签')
	bar.use_theme('dark')
	bar.add(
		'',
		y_axis = semilabel.values,
		x_axis = semilabel.index.values,
		is_fill=True,
	)
	bar.render(r'情感标签分析.html')

结果:
img
img

词云生成采用jieba分词库分词,wordcloud生成词云,代码如下:

from wordcloud import WordCloud
import matplotlib.pyplot as plt
plt.style.use('ggplot')
plt.rcParams['axes.unicode_minus'] = False

def getWordcloud(text):
	text = ''.join(str(s) for s in text['content'] if s)
	word_list = jieba.cut(text, cut_all=False)
	stopwords = [line.strip() for line in open(r'./StopWords.txt', 'r').readlines()]	# 导入停用词
	clean_list = [seg for seg in word_list if seg not in stopwords] #去除停用词
	clean_text = ''.join(clean_list)
	# 生成词云
	cloud = WordCloud(
	    font_path = r'C:/Windows/Fonts/msyh.ttc',
	    background_color = 'white',
	    max_words = 800,
	    max_font_size = 64
	)
	word_cloud = cloud.generate(clean_text)
	# 绘制词云
	plt.figure(figsize=(12, 12))
	plt.imshow(word_cloud)
	plt.axis('off')
	plt.show()
	
if __name__ == '__main__':
	text = getText()
	getSemi(text)
	getWordcloud(text)

img

  • 10
    点赞
  • 144
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
## 目录 **用户** 登录 发送验证码 验证验证码 注册(更改密码) 检测手机号码是否已注册 初始化昵称 手机号换绑 退出登录 登录状态 获取详情 用户歌单 已购专辑 刷新 签到 私人FM FM垃圾桶 获取用户喜欢的音乐列表 获取用户信息, 歌单, 收藏, mv, dj 数量 获取用户播放记录 获取用户创建的电台 获取用户创建的电台的详细信息 获取用户关注列表 获取用户粉丝 动态 获取所有动态 获取用户动态 转发用户动态 删除用户动态 分享歌曲、歌单、mv、电台、电台节目到动态 关注 / 取消关注用户 云盘 云盘歌曲详情 删除云盘歌曲 设置 更新用户信息 资源点赞( MV,电台,视频) **音乐** 歌曲链接 是否可用(未完成) 歌词 歌曲详情 每日推荐 推荐新音乐 相似歌曲 新歌速递 获取最近 5 个听了这首歌的用户 新碟上架 喜欢音乐 智能播放/心动模式 **歌单** 歌单详情 每日推荐 推荐歌单 包含这首歌的歌单 相关推荐 收藏/取消收藏歌单 歌单收藏者 对歌单添加或删除歌曲 创建歌单 删除歌单 歌单分类 热门歌单分类 歌单 ( 网友精选碟 ) 获取精品歌单 更新 更新歌单 更新歌单简介 更新歌单名 更新歌单标签 **歌手** 歌手单曲 歌手专辑 最新专辑 获取专辑内容 专辑动态信息 收藏/取消收藏专辑 获取已收藏专辑列表 歌手详情 歌手MV 热门歌手 获取相似歌手 歌手分类列表 收藏/取消收藏歌手 收藏的歌手列表 歌手热门50首歌曲 歌手榜 **搜索** 默认搜索关键词 搜索建议 搜索多重匹配 热搜列表(简略) 热搜列表(详细) **电台** Banner 热门电台 类别热门电台 电台详情 付费精品 节目 节目详情 节目榜 节目24小时榜 24小时主播榜 主播新人榜 最热主播榜 新晋电台榜/热门电台榜 电台分类 精选电台 分类推荐 推荐类型 非热门类型 订阅 订阅列表 付费精选 今日优选 推荐电台 推荐节目 **MV** 全部MV 最新MV 网易出品MV 推荐MV 相似MV MV排行 MV详情 MV链接 收藏/取消收藏 MV 收藏的 MV 列表 **视频** 获取视频url 获取视频详情 获取视频标签列表 获取视频标签下的视频 相关视频 收藏与取消收藏视频 **评论** 发送/删除/回复评论 歌曲评论 专辑评论 歌单评论 电台评论 视频评论 热门评论 动态评论 点赞/取消点赞评论 **消息** 私信 私信内容 发送私信(纯文本 / 带歌单) 评论通知 @我通知 通知 **其他** 获取热门话题 云村热评 Banner 独家放送 排行榜 所有榜单 所有榜单内容摘要 -------- 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Deng872347348

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值