大数据无处不在,在运营一个成功的商业的过程中,大数据起到的非常重要的作用。同样通过观众对电影的评分的分析,可以在一定程度上给电影行业启发。
评价电影数据链接:https://grouplens.org/datasets/movielens
- 这个里面提供了大量的数据,在这里我选择的是到1998年的,你们可以选择其它年份的,点击红色框下载文件,由于数据很多,下载可能比较慢。
- 解压三个文件就可以了,分别是观众数据、电影数据、评分数据。这里有很多的数据。
-
观众的ID、年龄、性别、职业、邮编(这里是美国的邮编号码)不同的列通过竖线分割。
-
每部电影都提供了电影的ID,名称,拍摄时间,上映时间,网址等,后面是0和1组成的19个列。
- data评分数据共有十万条,这也是为什么100T的原因。分别为观众的ID、电影的ID、评分值(1~5)、时间类型。
1.从观众中读取文件数据
提供代码如下:
import pandas as pd
'''
@Function:从观众中读取文件数据
@Author :王育红
@Date :2020/8/20
'''
#通过分割符'|',来表示每个列的对应的名称
unames = ['uid', 'age', 'gender', 'occupation', 'zip']
users = pd.read_table('d:\\park01\\ml-100k\\u.user', sep='|', header=None, names=unames)
#数据较多,采用取量读取,取前五条数据
#(第一种方法)
#print(users.head(5))
#(第二种方法)
print(users[:5])
- 查看运行结果:
2.读取评分数据,连接观众数据
提供代码如下:
import pandas as pd
'''
@Function:读取评分数据,连接观众数据
@Author :王育红
@Date :2020/8/20
'''
#通过分割符'|',来表示每个列的对应的名称
unames = ['uid', 'age', 'gender', 'occupation', 'zip']
users = pd.read_table('d:\\park01\\ml-100k\\u.user', sep='|', header=None, names=unames)
#通过分割符'table',来表示每个列的对应的名称
rnames = ['uid', 'mid', 'rating', 'timestamp']
ratings = pd.read_table('d:\\park01\\ml-100k\\u.data', sep='\t', header=None, names=rnames)
#连接观众和评分数据
frame = pd.merge(ratings,users)
#性别评分差异
print(frame['rating'].groupby(frame['gender']).mean())
print('======================================================')
#年龄评分差异,[-1]四点五人到十位
print(frame['rating'].groupby(frame['age'].apply(round,args=[-1])).mean())
print('======================================================')
#结合年龄段的性别
print(frame['rating'].groupby([frame['age'].apply(round,args=[-1]),frame['gender']]).mean())
-
查看运行结果:
3.连接电影、评分、观众等数据进行分析
我们可以发现就算是所对应的文档和写的路径没有问题,但是还是报错了。这是因为数据集转换的问题,在处理中文信息,以及中国人在处理英文信息发生的,可以通过设置编码字符集来解决。 -
一方面在python开发环境当中设置字符集
-
另一方面在代码中通过encoding指定标准字符集
-
提供代码如下
import pandas as pd
'''
@Function:连接观众,评分,电影数据进行分析
@Author :王育红
@Date :2020/8/20
'''
# 通过分割符'|',来表示每个列的对应的名称
unames = ['uid', 'age', 'gender', 'occupation', 'zip']
users = pd.read_table('d:\\park01\\ml-100k\\u.user', sep='|', header=None, names=unames)
# 通过分割符'table',来表示每个列的对应的名称
rnames = ['uid', 'mid', 'rating', 'timestamp']
ratings = pd.read_table('d:\\park01\\ml-100k\\u.data', sep='\t', header=None, names=rnames)
# 这里有19个,要对应到文档中
mnames = ['mid', 'title', 'date1', 'data2', 'url',
'unknown', 'Action', 'Adventure', 'Animation',
'Children', 'Comedy', 'Crime', 'Documentary', 'Drama',
'Fantansy', 'Film-Noir', 'Horror', 'Musical',
'Mystery', 'Romance', 'Sci-Fi', 'Thriller', 'War', 'Western']
movies = pd.read_table('d:\\park01\\ml-100k\\u.item', sep='|', header=None, names=mnames,encoding='ISO-8859-1')
# 连接三个数据
frame = pd.merge(pd.merge(ratings,users),movies)
# 按性别分析每部电影的平均评分
print(frame['rating'].groupby([frame['gender'],frame['title']]).mean().sort_values(ascending=False))
- 查看运行结果:
好啦~ 就分享这么多。▽****▽ 从开始写代码到最后,我觉得代码的理解还是比较容易,电影评分数据结论的分析方面有点很难。写代码时,还是不够细心,在groupby()函数中分两个组时,总是忘记写一个中括号,导致代码出错,花了很长时间排错。总而言之,这次写大数据电影分析的代码也有不少收获。