欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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])

数据结果
MovieLens 1M数据集

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])

数据结果
MovieLens 1M数据集

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])

数据结果
MovieLens 1M数据集

四、绘制电影分类统计图
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()

图形结果
MovieLens 1M数据集