您的位置:首页 > 编程语言 > Python开发

利用Python进行数据分析 笔记4

2017-03-28 13:32 721 查看
MovieLens 1M数据集
GroupLens Research采集了一组从20世纪90年末到21世纪初由MovieLens用户提供的电影评分数据。这些数据中包括电影评分、电影元数据(风格类型和年代)以及关于用户的人口统计学数据(年龄、邮编、性别和职业等)。基于机器学习算法的推荐系统一般都会对此类数据感兴趣。
MovieLens 1M数据集含有来自6000名用户对4000部电影的100万条评分数据。它分为三个表:评分、用户信息和电影信息。将该数据从zip文件中解压出来之后,可以通过pandas.read_table将各个表分别读到一个pandas
DataFrame对象中:
import pandas
as
pd

unames=['user_id','gender','age','occupation','zip']

users=pd.read_table('G:/python/pydata-book-master/ch02/movielens/users.dat',sep='::',header=None,names=unames)

rnames=['user_id','movie_id','rating','timestamp']

ratings=pd.read_table('G:/python/pydata-book-master/ch02/movielens/ratings.dat',sep='::',header=None,names=rnames)

mnames=['movie_id','title','genres']

movies=pd.read_table('G:/python/pydata-book-master/ch02/movielens/movies.dat',sep='::',header=None,names=mnames)

利用Python的切片语法,通过查看每个DataFrame的前几行即可验证数据加载工作是否一切顺利:
users[:5]
print ratings

 
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1000209 entries, 0 to 1000208
Data columns:
user_id      1000209  non-null values
movie_id     1000209  non-null values
rating       1000209  non-null values
timestamp    1000209  non-null values
dtypes: int64(4)
 
注意,其中的年龄和职业是以编码形式给出的。分析散布在三个表中的数据可不是一件轻松的事情。假设我们想要根据性别和年龄计算某部电影的平均得分,如果将所有数据合并到一个表中的话问题就简单了。可以先用pandas的merge函数将ratings跟users合并到一起,然后再将movies也合并进去。Pandas会根据列名的重叠情况推断出哪些列是合并或链接键:
data = pd.merge(pd.merge(ratings,users),movies)
print data

 
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1000209 entries, 0 to 1000208
Data columns:
user_id       1000209  non-null values
movie_id      1000209  non-null values
rating        1000209  non-null values
timestamp     1000209  non-null values
gender        1000209  non-null values
age           1000209  non-null values
occupation    1000209  non-null values
zip           1000209  non-null values
title         1000209  non-null values
genres        1000209  non-null values
dtypes: int64(6), object(4)
 

print data.ix[0]

user_id                                 1
movie_id                                1
rating                                  5
timestamp                       978824268
gender                                  F
age                                     1
occupation                             10
zip                                 48067
title                    Toy Story (1995)
genres        Animation|Children's|Comedy
Name: 0
 
现在,熟悉一下pandas,就能轻松地根据任意用户或电影属性对评分数据进行聚合操作了,为了按性别计算每部电影的平均得分,可以使用pivot_table方法:
mean_ratings=data.pivot_table('rating',rows='title',cols='gender',aggfunc='mean')
mean_ratings[:5]

该操作会产生另一个DataFrame,其内容为电影平均得分,行标为电影名称,列标为性别。现在,可以尝试过滤掉评分数据不够250条的电影。为了达到这个目的,先对title进行分组,然后利用size()得到一个含有各电影分组大小的Series对象:
ratings_by_title=data.groupby('title').size()

ratings_by_title[:10]

active_titles=ratings_by_title.index[ratings_by_title>=250]

active_titles

该索引中含有评分数据大于250条的电影名称,然后就可以据此从前面的mean_ratings中选取所需的行了:
mean_ratings=mean_ratings.ix[active_titles]
mean_ratings

 
为了了解女性观众最喜欢的电影,可以对F列降序排列:
top_female_ratings=mean_ratings.sort_index(by='F',ascending=False)
top_female_ratings[:10]

 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: