Python案例实操3 | 您所在的位置:网站首页 › 豆瓣影评数据统计分析 › Python案例实操3 |
Python案例实操3-电影数据分析
一、读取数据二、数据处理1.索引重命名2.合并数据集3.选取子集4.缺失值处理5.数据格式转换
三、数据分析及可视化1.电影类型随时间变化趋势图2.统计电影分类情况3.电影类型与利润的关系4.Universal Pictures 和 Paramount Pictures 公司电影发行数据对比5.改编电影和原创电影的对比情况6.电影时长与电影票房及评分的关系7.电影关键词分析
本案例数据来源于 kaggle 上的
Movie数据集,主要研究以下几个问题:
电影类型如何随着时间的推移发生变化的?统计电影分类的情况?电影类型与利润的关系?Universal 和 Paramount 两家影视公司的对比情况如何?改编电影和原创电影的对比情况如何?电影时长与电影票房及评分的关系?分析电影关键字
实战开始: 一、读取数据 creditlist = pd.read_csv(r'E:\WorkSpaces\Python\data\tmdb\tmdb_5000_credits.csv') movielist = pd.read_csv(r'E:\WorkSpaces\Python\data\tmdb\tmdb_5000_movies.csv') 二、数据处理 1.索引重命名 # 修改 creditlist中的列索引 字典格式{'old','new'},inplace=True表示在原数据上修改 creditlist.rename(columns={'movie_id': 'id', 'crew': 'directors', 'cast': 'actors'}, inplace=True) # 修改 movielist中的列索引 movielist.rename( columns={'original_language': 'language', 'production_companies': 'companies', 'production_countries': 'countries'}, inplace=True) 2.合并数据集合并数据集,注意列索引保持一致 # 数据合并 键指定 id 和 title databoth = pd.merge(creditlist, movielist, on=['id', 'title']) 3.选取子集选取子集,选择我们需要的列 # 筛选特征值(目标值) # ['电影名称', '类型','语言', '导演','主演','首映日期','电影时长(分钟)','平均评分','评论次数','关键词','制作公司列表','制作国家列表','预算(美元)','收入(美元)','浏览次数'] datalist = pd.DataFrame(databoth, columns=['title', 'genres', 'language', 'directors', 'actors', 'release_date', 'runtime', 'vote_average', 'vote_count', 'keywords', 'companies', 'countries', 'budget', 'revenue', 'popularity']) 4.缺失值处理少量缺失值可进行手动赋值处理,大量缺失值可使用dropna()删除或者fillna()替换 # 检测缺失值 isnull() + sum() res_null = pd.isnull(datalist).sum() print('缺失值检测结果:\n', res_null) # 检测到release_date 有一条为空,runtime有两条为空 # 针对方式:手动填充,找出具体的电影名称,自己查找相关信息 # a、确定bool数组 mask = datalist.loc[:, 'release_date'].isnull() mask2 = datalist.loc[:, 'runtime'].isnull() # b、根据bool数组来获取缺失值位置的电影名称 movie_name = datalist.loc[mask, 'title'] movie_name2 = datalist.loc[mask2, 'title'] print('缺失上映日期的电影名称为:\n', movie_name) # 4553 America Is Still the Place # Name: title, dtype: object print('缺失电影时长的电影名称为:\n', movie_name2) # 2656 Chiamatemi Francesco - Il Papa della gente # 4140 To Be Frank, Sinatra at 100 # Name: title, dtype: object # c 、 填充 datalist.loc[mask, 'release_date'] = '2014-06-01' datalist.iloc[2656, datalist.columns.get_indexer(['runtime'])] = 94 datalist.iloc[4140, datalist.columns.get_indexer(['runtime'])] = 81 5.数据格式转换 # 以类型为例 [{"id": 28, "name": "Action"}, {"id": 12, "name": "Adventure"}, {"id": 14, "name": "Fantasy"}, {"id": 878, "name": "Science Fiction"}] # 转换成 Action,Adventure,Fantasy,Science Fiction 格式 def data_format(datas): """ 数据格式转换 :param datas: 数据 :return: 转换之后的数据 """ name_list = [] # 遍历 列表 for item in datas: # 如果item存在 if item: movie_type = item['name'] name_list.append(movie_type) return ','.join(name_list) # --电影类型 格式转换-- print('电影类型:\n', datalist.loc[:, 'genres']) # json数据类型 # json.loads # 可以将json转化为python类型 # 将 datalist.loc[:, 'genres'] 由 json类型转化为 python类型 datalist.loc[:, 'genres'] = datalist.loc[:, 'genres'].transform(json.loads) # 调用方法 疑问?这里是怎么调用方法的,参数怎么传的 datalist.loc[:, 'genres'] = datalist.loc[:, 'genres'].transform(data_format) print('电影类型 转换之后的结果:\n', datalist.loc[:, 'genres']) # 其他字段转换类似,此处不再重复展示... 三、数据分析及可视化 1.电影类型随时间变化趋势图思路: 在每行数据后追加所有电影类型列,初始值为0遍历每一部电影的’genres’列,把分类包含在该列中的值置为1分组并按照类型求和![]() 思路 1、创建一个全为0的dataframe,列索引置为电影的分类,temp_df 2、遍历每一部电影,temp_df中把分类出现的列的值置为1 3、求和
1)Universal Pictures 和 Paramount Pictures 公司电影发行量对比 对’companies’列数据进行处理,判断是否包含Universal Pictures 或 Paramount Pictures公司 # 先增加两列数据 两家公司发行的电影数量 datalist.loc[:, 'Universal Pictures'] = 0 datalist.loc[:, 'Paramount Pictures'] = 0 # 判断 ---bool数组,包含Universal Pictures公司 mask1 = datalist.loc[:, 'companies'].str.contains('Universal Pictures') # 修改 datalist.loc[mask1, 'Universal Pictures'] = 1 # 判断 --bool数组,包含Paramount Pictures公司 mask2 = datalist.loc[:, 'companies'].str.contains('Paramount Pictures') # 修改 datalist.loc[mask2, 'Paramount Pictures'] = 1 # 发行量计算 res_pie = datalist.loc[:, ['Universal Pictures', 'Paramount Pictures']].sum() # 绘图 res_pie.plot(kind="pie", figsize=(20, 8), fontsize=10, autopct="%d", title='电影发行量对比图') # 默认不支持中文 ---修改RC参数 plt.rcParams['font.sans-serif'] = 'SimHei' plt.savefig('电影发行量对比图.jpg')2)分析 Universal Pictures 和 Paramount Pictures 两家影视公司电影发行量随时间变化的趋势 如何确定电影是改编的?还是原创的呢? 与电影相关的关键字 keywords 如果在这里是根据小说改编的 base on novel/fairy tale/… 只要出现 base on 这个字眼 就说明 是改编的 # 先增加一列 datalist.loc[:, 'not_original'] = '原创' # 确定bool数组,如果是改编的,那就将 not_original 修改为'not_original' mask = datalist.loc[:, 'keywords'].str.contains('based on') # 修改 datalist.loc[mask, 'not_original'] = '改编' # 按照是否原创进行分组,统计原创电影的平均预算、收入、利润 # 计算 利润 datalist.loc[:, 'profit'] = datalist.loc[:, 'revenue'] - datalist.loc[:, 'budget'] res_not_original = datalist.groupby('not_original')[['budget', 'revenue', 'profit']].mean() print('res_not_original\n', res_not_original) # 绘图 res_not_original.plot(kind="bar", figsize=(20, 8), fontsize=20, title='原创与改编电影预算、收入、利润对比柱状图') # 默认不支持中文 ---修改RC参数 plt.rcParams['font.sans-serif'] = 'SimHei' plt.ylabel('美元') plt.xlabel('原创或改编') plt.savefig('原创与改编电影预算、收入、利润对比柱状图.jpg') 6.电影时长与电影票房及评分的关系按照 电影时长 分组,查看不同电影时长的平均票房、平均评分 1、自定义时长分组 2、进行离散化 3、分组聚合,对票房和评分进行求均值 print('查看电影时长、票房、评分:\n', datalist.loc[:, ['runtime', 'revenue', 'vote_average']].head()) # 1、自定义时长分组 bins = [0, 60, 90, 120, 150, 180, 210, 240] # 2、数据离散化 datalist.loc[:, 'runtime'] = pd.cut(x=datalist.loc[:, 'runtime'], bins=bins, include_lowest=True) # 3、分组聚合,对票房和评分进行求均值 res_runtime = datalist.groupby('runtime')[['revenue', 'vote_average']].mean().sort_values( by=['revenue', 'vote_average']) print('res_runtime:\n', res_runtime) # 绘图 指定评分列vote_average使用右y轴(子图) ax = res_runtime.plot(secondary_y=['vote_average'], figsize=(10, 5), title='不同时长的电影票房、评分的对比柱状图') ax.set_xlabel('时长(分钟)') ax.set_ylabel('票房(美元)') ax.right_ax.set_ylabel('评分') # 右y轴的标签 plt.rcParams['font.sans-serif'] = 'SimHei' plt.savefig('不同时长的电影票房、评分的对比柱状图.jpg') 7.电影关键词分析
参考文章:https://blog.csdn.net/markshui/article/details/108214328 |
CopyRight 2018-2019 实验室设备网 版权所有 |