jupyter notebook 电影数据分析

一、数据探索

导入需要用到的库

import numpy as np
import pandas as pd

1.1 读取user文件

  • 关于用户的人口统计信息
  • 使用 | 分隔列表
  • 用户编号 | 年龄 | 性别 | 职业 | 邮政编码
  • 用户编号被data 数据集引用
df_user = pd.read_csv("./data/user", delimiter="|", header=None, names=["用户编号", "年龄", "性别", "职业", "邮政编码"])
df_user.head()

结果展示: 

1.2 查看文件信息

df_user.info()

结果展示: 

2.1 读取data文件

  • 完整的 u 数据集,943 个用户对 1682 个项目的 100000 个评分。每个用户至少评价了 20 部电影。用户和项目是从1开始连续编号
  • 使用制表符(\t)分隔列表
  • 字段信息:用户编号 | 商品编号 | 评价 | 时间戳 (时间戳是自 1/1/1970 UTC 以来的 unix 秒数)
df_data = pd.read_csv("./data/data", sep="\t", header=None, names=["用户编号", "商品编号", "评价", "时间戳"])
df_data.head()

结果展示: 

 2.2 查看文件信息

df_data.info()

结果展示: 

3.3  读取item文件

  • 物品信息(电影)
  • 使用 | 分隔列表
  • 字段名:电影编号 | 电影名称 | 发布日期 | 视频发布日期 | IMDb 网址 | 未知 | 行动 | 冒险 | 动画 | 儿童 | 喜剧 | 犯罪 | 纪录片 | 戏剧 | 奇幻 | 黑色电影 | 恐怖 | 音乐剧 | 谜| 浪漫 | 科幻 | 惊悚 | 战争 | 西方 |
  • 最后 19 个字段是流派,1 表示电影属于那种类型,0 表示不是;电影可以在几个流派一次
  • 电影编号 是 data 数据集中使用的商品编号
col_names = '电影编号 | 电影名称 | 发布日期 | 视频发布日期 | IMDb 网址 | 未知 | 行动 | 冒险 | 动画 | 儿童 | 喜剧 | 犯罪 | 纪录片 | 戏剧 | 奇幻 | 黑色电影 | 恐怖 | 音乐剧 | 谜| 浪漫 | 科幻 | 惊悚 | 战争 | 西方 '.split('|')
col_names = [col.strip() for col in col_names] # 去掉空格
df_item = pd.read_csv("./data/item", sep="|", header=None, names=col_names, encoding="ISO-8859-1")
df_item.head()

结果展示: 

3.2 查看文件信息

df_item.info()

结果展示:  

 

二、问题

1.查询每个用户的平均打分

df_score_mean = df_data.groupby("用户编号")["评价"].mean()
df_score_mean.apply(lambda x:round(x,1))

结果展示:  

 

3.查看不同职业、性别的平均打分

df_user_data = df_user.merge(df_data) # 先将user和data表连接起来
df_all = df_user_data.merge(df_item, left_on="商品编号", right_on="电影编号") # 再将user_data和item表通过两个字段连接起来
df_all.head() # 展示得到的新表df_all

结果展示:  

  

df_all[["性别", "职业", "评价"]].groupby(by=["性别", "职业"]).mean().apply(lambda x: round(x, 1)).head()

由于数据太多只显示几行 

结果展示:  

 

4.查询电影平均分排名

df1 = df_all[["商品编号","电影名称","评价"]]
df1.groupby("商品编号").mean().sort_values("评价",ascending=False).head(10)

结果展示:  

 

5.查询大于平均分的电影的数量

score_mean = df_all["评价"].mean() # 平均分
score_mean
df_all[df_all["评价"] > score_mean].shape[0] # 大于平均分

结果展示:  

 

6.查询高分电影中(>3)打分次数最多的用户,并求出此人打的平均分

df_count = df_all[df_all["评价"] > 3].groupby("用户编号").count()
df_count # 先统计出评价大于3的用户次数

结果展示:  

uid = df_count.sort_values("年龄",ascending=False).index[0]
uid # 取出这个用户的id

df_all[df_all["用户编号"] == uid]["评价"].mean() # 该用户的平均评价

结果展示:  

7.查询每个用户的平均打分,最低打分,最高打分

df_all[["用户编号","评价"]].groupby("用户编号").agg(["mean","max","min"])

结果展示:  

 

8.查询被评分超过100次的电影的平均分排名 TOP10

df_grp = df_all[["商品编号","评价"]].groupby("商品编号")
df_grp # 提取出字段
df_gt_100 = df_grp.count() > 100 # 评价总数大于100的
df_gt_100 = df_gt_100.reset_index() # 获取评价总数大于100的索引
df_gt_100.head() # 展示前几行

结果展示:  

 

df_result = df_gt_100.merge(df_data,left_on="商品编号",right_on="商品编号")
df_result # df_gt_100和df_data连接起来

结果展示:  

 

df_head10 = df_result[df_result["评价_x"] == True].groupby("商品编号")["评价_y"].mean().sort_values(ascending=False).head(10)
df_head10

结果展示:  

猜你喜欢

转载自blog.csdn.net/qq_56520755/article/details/130339153