电影智能推荐系统
背景介绍
人们经常会在视频平台上观看影片,有时目标明确,想要观看某部电影,但有时仅仅是随机搜寻。
如果视频平台可以利用基于物品的智能推荐系统,有效地从用户对其观看过的电影的评分中挖掘数据,便可以根据用户偏好的电影个性化地推荐更多类似的电影,优化用户体验,提高用户粘性,创造额外收入。
分析步骤
- 读取数据
- 数据分析
- 合并电影数据和评分数据
- 计算每部电影的评分均值
- 计算每部电影的“评分次数”
- 创建数据透视表,以’'用户编号“为行索引,”名称“为列名称,”评分“为数据值
- 智能推荐
以电影"阿甘正传(2031)"为例,计算各个电影与"阿甘正传(2031)"的相关系数,并删除相关系数是NaN的数据,最后筛选出评分次数超过20次的电影数据,并按照相关系数降序排序。
代码实现
# 读取数据
import pandas as pd
movies = pd.read_excel('电影.xlsx')
movies = movies.loc[:, ~movies.columns.str.contains('Unnamed')]
movies.head()
score = pd.read_excel('评分.xlsx')
score.head()
# 合并电影数据和评分数据
df = pd.merge(movies, score, on='电影编号')
df.head()
# 计算每部电影的评分均值,并组装成DataFrame
ratings = pd.DataFrame(df.groupby('名称')['评分'].mean())
# 添加评分次数列
ratings['评分次数'] = df.groupby('名称')['评分'].count()
# 根据评分次数降序排序
ratings.sort_values('评分次数', ascending=False).head()
# 创建透视表
user_movie = df.pivot_table(index='用户编号', columns='名称', values='评分')
user_movie.tail()
user_movie.shape
# 智能推荐
FG = user_movie['阿甘正传(2031)'] # FG阿甘英文名称的缩写
pd.DataFrame(FG).head()
# axis默认为0,计算user_movie各列与FG的相关系数
corr_FG = user_movie.corrwith(FG)
similarity = pd.DataFrame(corr_FG, columns=['相关系数'])
similarity.head()
# 删除相关系数是NaN的数据
similarity.dropna(inplace=True)
similarity.head()
# 合并DataFrame
similarity_new = pd.merge(similarity, pd.DataFrame(ratings['评分次数']), left_index=True, right_index=True)
similarity_new.head()
# 筛选出评分次数超过20次的电影数据,并按照相关系数降序排序
similarity_new[similarity_new['评分次数'] > 20].sort_values(by='相关系数', ascending=False).head(10)
实时效果反馈
1. 合并DataFrame的方法是___________________
A corrwith()
B merge()
C groupby()
D mean()
2. 创建DataFrame透视表的方法是_______________
A crosstab()
B pivot_table()
C sort_values()
D merge()
答案
1=>B 2=>B
实战补充——groupby()分组妙用
在日常的数据分析中,经常需要将数据根据某个(多个)字段划分为不同的群体进行分
析,而DataFrame中的groupby()可以灵活地完成各种分组计算的需求。
代码演示
import pandas as pd
# 创建DataFrame对象
data = pd.DataFrame([['三国', '王刚', 6, 8], ['盗梦空间', '王二', 8, 6], ['盗梦空间', '张三', 10, 8], ['海上钢琴师', '刘勇', 8, 8], ['海上钢琴师', '赵五', 8, 10]], columns=['电影名称', '影评师', '观前评分', '观后评分'])
# 根据"电影名称"分组,然后对每一组的“观后评分”计算平均值
data.groupby('电影名称')['观后评分'].mean()
# 也可以通过DataFrame的形式展示结果
data.groupby('电影名称')[['观后评分']].mean()
#对分组后的多个列求平均值
data.groupby('电影名称')[['观前评分', '观后评分']].mean()
# 通过多个字段分组
data.groupby(['电影名称', '影评师'])[['观后评分']].mean()
# 统计分组后每一组对应列的次数
count = data.groupby('电影名称')[['观后评分']].count()
# 修改列名称
count = count.rename(columns={'观后评分':'评分次数'})
实时效果反馈
1. 对DataFrame进行分组的方法是___________________
A corrwith()
B merge()
C groupby()
D mean()
2. DataFrame分组后计算平均值的方法是_________________,计算次数的方法是_______________
A mean()、 count()
B count()、mean()
C mean()、merge()
D count()、merge()
答案
1=>C 2=>A