MovieLens 思路

  1. 将数据文件读取到pandas DataFrame对象中,比如user.dat文件的格式为:UserID::Gender::Age::Occupation::Zip-code,通过pandas.read_table 来实现
import pandas as pd
unames=['user_id','gender','age','occupation','zip']
users=pd.read_table('E:/pydata-book-master/pydata-book-master/ch02/movielens/users.dat',sep='::',header=None,names=unames')
![users[:5]](https://img-blog.csdn.net/20170802204246174?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzk0NjY2MTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
  1. 将所有数据合并到一个表中,pandas会根据列名的重叠情况推断出哪些是合并键,通过pd.merge方法:
data=pd.merge(pd.merge(ratings,users),movies)#一次只能合并两个
![查看表中的第一个内容:](https://img-blog.csdn.net/20170802204921310?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzk0NjY2MTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
  1. 按性别计算每部电影的平均得分,通过pivot_table方法,产生另外一个DataFrame:
(平均评分,指定了index,所以后面对该表的sort_index均是对title进行sort)mean_ratings=data.pivot_table('rating',index='title',cols='gender',aggfun='mean')
(http://img.blog.csdn.net/20170802210208667?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzk0NjY2MTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
  1. 过滤掉data表格中评分数据不够250的电影:
ratings_by_title=data.group('title').size()#groupby方法只是把一样的东西放在一堆,但是不经过任何处理,所以没什么用,后面必须加个方法,size方法就是数清这堆东西有多少个,title作为index
active_titles=ratings_by_title.index[ratings_by_title>=250]#选取评分超过250条的构成索引,Series对象特性,自动为值比较。(https://img-blog.csdn.net/20170802212639934?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzk0NjY2MTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
  1. 得到过滤后的索引后(即有价值数据),我们就可以进行简单的数据处理,比如刚刚的求平均得分,就可以只看过滤后的,后来的数据处理都是基于有价值数据:
mean_ratings=mean_ratings.ix[active_titles]
  1. 了解女性最喜欢的电影,对F降序排列:
top_female_ratings=mean_ratings.sort_values(by='F',ascending=False)
  1. 找出男性和女性评分分歧最大的电影:
mean_ratings['diff']=mean_ratings['M']-mean_ratings['F']
sorted_by_diff=mean_ratings.sort_values(by='diff')
sorted_by_diff[::-1]#男性观众更喜欢的电影
  1. 找出分歧最大的电影(不考虑性别因素):
rating_std_by_title=data.group('title')['rating'].std()
rating_std_by_title=rating_std_by_title.ix[active_titles]
rating_std_by_title.sort_values(ascending=False)[:10]#python3中已经废除了order方法,只有sort_index,sort_value方法,方法中的by属性只用于有多个可选值,假如只有一列value,用by方法选定会报错
  1. 找特定的数据:
top_female_rating[top_female_rating.index=='Sunset Blvd. (a.k.a. Sunset Boulevard) (1950)']

你可能感兴趣的:(MovieLens 思路)