使用的模块
本部分主要使用的是pandas模块对数据进行分析、处理。
MovieLens数据集
MovieLens数据集是关于带你赢评分的数据,数据来自书本提供网站,这里附上我使用数据的网址:https://grouplens.org/datasets/movielens/。 在页面内找到MovieLens 1M Dataset标题下的ml-1m.zip压缩包文件,点击下载。下载的数据包括README、movies.dat、ratings.dat和users.dat四个文件。用到的数据文件是电影信息(movies.dat)、评分信息(ratings.dat)和用户信息(users.dat)三个dat格式的文件。
文件可以通过记事本打开进行预览,可以看到内容是通过“::”符号分隔的数据。
Movielens数据集处理
首先将数据读入:
# coding=gbk
import pandas as pd #导入pandas模块
unames=["user_id","gender","age","occupation","zip"] #给用户信息文件定义属性,包括用户id、性别、年龄、职业等
rnames=["user_id","movie_id","rating","timestamp"] #打分属性
mnames=['movie_id','title','genres'] #电影属性:电影id、电影名、分类
rnames=['user_id','movie_id','rating','timestamp'] #评分属性
users=pd.read_table("C:/Users/GuanLi/Desktop/ML_1M/users.dat",sep="::",
header=None,names=unames) #读取用户信息文件
movies=pd.read_table("C:/Users/GuanLi/Desktop/ML_1M/movies.dat",sep="::",
header=None,names=mnames) #读取电影信息文件
ratings=pd.read_table("C:/Users/GuanLi/Desktop/ML_1M/ratings.dat",sep="::",
header=None,names=rnames) #读取评分文件
可以通过输出读入数据的前五条记录进行查看一下导入数据的格式。
print("输出前五条用户信息:")
print(users[:5])
print("输出前五条电影信息:")
print(movies[:5])
print("输出前五条评分信息:")
print(ratings[:5])
如果需要将用户信息与用户评分信息、电影信息合并,可以通过pandas的merge函数实现:
#将users、ratings、movies合并
data=pd.merge(pd.merge(ratings,users),movies)
print(data[:5]) #输出前五条记录
pandas会根据列名的重叠情况推断出来哪些列是合并(连接)键,这里user_id是连接键。
在对数据进行简单的组合处理之后,可以通过pandas模块的一些函数对数据进行分析操作。首先使用pivot_table方法按性别计算每一部电影的平均得分。
#按性别计算每部电影的平均得分
mean_ratings_gender=data.pivot_table("rating",index="title",columns="gender",
aggfunc="mean")
print(mean_ratings_gender[:5]) #输出前五条记录
上述处理得到了另一个DataFrame(pandas的一种数据类型),内容是不同性别下电影的平均得分,行标为电影名称。为了保证平均评分的有效性和一般性,接下来过滤掉用户评分不够180(任取的数字,仅作练习)条的电影。先对title进行分组,然后利用size()得到一个含各电影分组大小的Series(pandas的另一种数据类型)对象。
ratings_by_title=data.groupby("title").size() #将数据按照被评论次数分组
print(ratings_by_title[:10]) #输出前十条记录
过滤掉评论不足180条的电影记录,并计算均值得分:
#过滤掉评分数据不够180条的电影
active_titles=ratings_by_title.index[ratings_by_title>=180]
print(active_titles[:10])
mean_ratings=mean_ratings_gender.ix[active_titles] #计算评论数据大于180条的电影根据性别得到的平均得分
print(mean_ratings[:10])
#根据女性评分对电影进行倒序排列
top_female_ratings=mean_ratings.sort_index(by="F",ascending=False)
print(top_female_ratings[:10]) #得到女性评分前十的电影
有时候性别不同喜欢的电影类型不同,那么通过计算评分分歧找出男、女观众分歧最大的电影。
mean_ratings_gender['diff']=mean_ratings_gender['M']-mean_ratings_gender['F'] #利用男性评分减去女性评分,得到差值
sorted_by_diff=mean_ratings_gender.sort_index(by='diff') #进行排序
print(sorted_by_diff[:10])
如果只是想找出分歧最大的电影,不考虑性别因素,那么可以计算得分数据的方差或标准差。
rating_std_by_title=data.groupby('title')['rating'].std() #根据电影名称分组的得分数据标准差
print(rating_std_by_title[:5]) #输出前五条记录
rating_std=rating_std_by_title.ix[active_titles] #根据active_titles进行过滤
print(rating_std.sort_values(ascending=False)[:5]) #输出前五条记录
降序排列后输出前五条记录:
pandas除了以上函数和功能以外还可以查看数据的维度、查找数据中的空值并进行替换(补空值)以及其他一些数据处理功能。后续通过另一数据集babynames进行学习。