导包
#pandas
import pandas as pd
#plt
import matplotlib.pyplot as plt
%matplotlib inline
#numpy
import numpy as np
#这是什么
from scipy.sparse import csr_matrix
#这是什么
from mpl_toolkits.axes_grid1 import make_axes_locatable
#这是什么,K近邻算法?
from sklearn.cluster import KMeans
#均方差
from sklearn.metrics import mean_squared_error
#这是什么
import itertools
#这是什么
from sklearn.metrics import silhouette_samples,silhouette_score
#读取文件
#文件下载网站https://grouplens.org/datasets/movielens/
电影表
movies = pd.read_csv(’./ml-latest-small/movies.csv’)
movies.head()
#movieId:电影编号 title:电影名 genres:电影类型
用户评分表
ratings = pd.read_csv(’./ml-latest-small/ratings.csv’)
ratings.tail()
#userId:评论人id movieId:电影id ratings:评分
#timestamp:时间戳(应该是用户发出的评论的时间)
#查看用户数量
ratings[‘userId’].unique()
#,英语内容是发出评论的人次对应的被评论的电影数量,shape也可以搞定
print(‘the datasets contains:’,len(ratings),‘ratings of’,len(movies),‘movies.’)
》》》
the datasets contains: 100836 ratings of 9742 movies.
查看某一类型的电影的数量
movies[movies[‘genres’].str.contains(‘Comedy|Romance’)].count()
》》》
movieId 4468
title 4468
genres 4468
dtype: int64
#函数需要再做理解,先放过
#定义一个函数计算每一个用户对所有科幻电影和爱情电影的平均评分
def get_genre_ratings(ratings,movies,genres,column_names):
genre_ratings = pd.DataFrame()
for genre in genres:
genre_movies = movies[movies['genres'].str.contains(genre)]
avg_genre_votes_per_user = ratings[rating['movieId'].isin(genre_movies['movieId']).loc[:,'rating']].groupby(['userId'])['rating'].mean().round(2)
genre_ratings = pd.concat([genre_ratings,avg_genre_votes_per_user],axis=1)
genre_ratings.columns = column_names
return genre_ratings
genre_ratings = get_genre_ratings(ratings,movies,['Romance','Sci-Fi'],['avg_romance_rating','avg_scifi_rating'])
genre_ratings.head()
也不理解
为了让更多的人参与研究,我们将偏向我们的分组,只从那些喜欢爱情片或科幻电影的用户那里获得评级。
def bias_genre_rating_dataset(genre_ratings, score_limit_1, score_limit_2):
biased_dataset = genre_ratings[((genre_ratings['avg_romance_rating'] < score_limit_1 - 0.2) & (genre_ratings['avg_scifi_rating'] > score_limit_2)) | ((genre_ratings['avg_scifi_rating'] < score_limit_1) & (genre_ratings['avg_romance_rating'] > score_limit_2))]
biased_dataset = pd.concat([biased_dataset[:300], genre_ratings[:2]])
biased_dataset = pd.DataFrame(biased_dataset.to_records())
return biased_dataset
#Bias the dataset
biased_dataset = bias_genre_rating_dataset(genre_ratings, 3.2, 2.5)
#Printing the resulting number of records & the head of the dataset
print("Number of records: ", len(biased_dataset))
biased_dataset.head()
问题太大,待续