MovieLens 1M数据集
程序员文章站
2024-03-26 12:03:17
...
数据来源:http://www.grouplens.org/node/73
一、 导入python库
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
二、数据整理
1.通过pandas读取数据
pd.options.display.max_rows=10 #分块读取,让展示内容少一点
unames = list(str.split('UserID::Gender::Age::Occupation::Zip-code',"::"))
users = pd.read_table(r'D:\360极速浏览器下载\ml-1m\users.dat', sep='::', header=None, names=unames)
rnames = list(str.split('UserID::MovieID::Rating::Timestamp','::'))
ratings=pd.read_table(r'D:\360极速浏览器下载\ml-1m\ratings.dat',sep='::',header=None, names=rnames)
mnames = list(str.split('MovieID::Title::Genres',"::"))
movies = pd.read_table(r'D:\360极速浏览器下载\ml-1m\movies.dat',sep='::',header=None, names=mnames)
2.合并数据
data = pd.merge(users,ratings)
data = pd.merge(data,movies)
3.透视表:以电影名称和性别分类,按平均评分整理
mean_ratings = data.pivot_table(values='Rating',index='Title',columns='Gender',aggfunc='mean')
4.过滤平均评分少于250的电影
ratings_by_title = data.groupby('Title').size()
active_titles = ratings_by_title.index[ratings_by_title>=250]
5.筛选评分大约250的数据
mean_ratings = mean_ratings.loc[active_titles]
三、测量评分分歧
1.打印女性首选前10部电影
top_female_ratings = mean_ratings.sort_values(by='F',ascending='False')
print(top_female_ratings[:10])
数据结果
2.打印男女性评分差异最大的前10部电影
mean_ratings['diff'] = mean_ratings['M'] - mean_ratings['F']
sorted_by_diff = mean_ratings.sort_values(by='diff')
print(sorted_by_diff[:10])
数据结果
3.通过方差比较,打印评价分数差异最大的前10部电影
rating_std_by_title = data.groupby('Title')['Rating'].std()
rating_std_by_title = rating_std_by_title.loc[active_titles]
print(rating_std_by_title.sort_values(ascending=False)[:10])
数据结果
四、绘制电影分类统计图
1.一部电影可能存在多个标签,将电影分类拆分
temp_list = data['Genres'].str.split("|").tolist()
genres_list=list(set([i for j in temp_list for i in j]))
zeros_df = pd.DataFrame(np.zeros((data.shape[0],len(genres_list))),columns=genres_list)
for i in range(data.shape[0]):
zeros_df.loc[i,temp_list[i]] = 1
genres_count = zeros_df.sum(axis=0)
2.绘制电影分类统计图
font = FontProperties(fname=r"c:\windows\fonts\msyh.ttc")
fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)
ax1.bar(range(len(genres_list)),genres_count)
ax1.set_xticks(range(len(genres_list)))
ax1.set_xticklabels(genres_list,rotation=90, fontsize='small')
ax1.set_title('电影分类统计',fontproperties=font)
plt.show()
图形结果