热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Moviedata-10M电影数据集统计分析之源码分享(Python)

之前写过一篇电影数据分析的文章”在进行源码分享之前,这里先说说我们的运行环境吧,我是使用jupyter进行实验的(强烈推荐),python3.6版本,依赖的相关库如下:如果对上面的库不了解或者不会安装的,请自行查阅,这里就不一一细说了。

之前写过一篇电影数据分析的文章” 豆瓣13万电影数据统计与分析 “,引起了一些读者的关注,并且在后台咨询我是否可以分享下源码。为了满足大家的需要,我在五一期间将源码略作整理了下,并从中筛选了几个绘图源码在这里分享给大家,如有疑问,可在评论区留言。特别说明下,文中分析的数据来自电影数据集Moviedata-10M中的movies.csv文件,需要的童鞋可以按照官方的说明进行下载即可。

准备工作

在进行源码分享之前,这里先说说我们的运行环境吧,我是使用jupyter进行实验的(强烈推荐),python 3.6版本,依赖的相关库如下:

  • pandas
  • matplotlib
  • seaborn
  • numpy
  • WordCloud
  • imageio
  • squarify

如果对上面的库不了解或者不会安装的,请自行查阅,这里就不一一细说了。

数据加载

由于文件是csv文件,所以加载数据只需要使用 python 里面的pandas库即可,采用pandas中的read_csv就可以将csv中的数据加载到内存中,代码如下:

import csv
import pandas as pd
import random
movies = pd.read_csv("../data/movies.csv", encoding="utf-8")

统计分析

在 豆瓣13万电影数据统计与分析 一文,我从不同的维度对电影数据进行了分析,在这里不会将全部的源码分享出来,但是会将核心内容贴出来。

按上映年份统计电影

首先导入相关依赖库,主要是matplotlib,如下:

import matplotlib.pyplot as plt
import matplotlib
matplotlib.matplotlib_fname()

下面这几行代码是为了解决图表中的中文乱码问题,仅供参考:

#解决matplotlib 乱码
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']='sans-serif'
#解决负号'-'显示为方块的问题
matplotlib.rcParams['axes.unicode_minus'] = False
from matplotlib.font_manager import _rebuild
_rebuild()

在绘制图表之前,我们需要对数据进行处理,构造我们需要的数据格式:

#如果year字段为空,就从release_date进行截取
def map_year(x):
    year = x["year"]
    if year == 0:
        year = str(x["release_date"]).split("-")[0]
    return str(year)
    
movies["year2"] = movies.apply(lambda x: map_year(x), axis=1)
#获取2020年之前上映的电影
movies = movies[movies["year2"]<"2020"]

得到2020年之前的电影之后,我们再分组统计每年上映的电影数量

year_grp = movies.groupby("year2").size().reset_index(name="num") \
                 .sort_values(by="year2", ascending=True)
year_grp = year_grp.rename(columns={"year2":"year"})

接着,按照年份和上映的电影量进行绘图,首先分享下散点图的绘制方法,代码如下:

import seaborn as sns
#散点图
def draw_stripplot(df, df_x, df_y, title="Title", ylabel="Y", savepath="defalt.png"):
    # draw stripplot start
    fig, ax = plt.subplots(figsize=(20,10), dpi= 80)    
    sns.stripplot(df_x, df_y, jitter=0.25, size=8, ax=ax, linewidth=.5)

    # decoration
    plt.gca().set_xticklabels(df_x, rotation=90, horizOntalalignment= 'right')
    plt.title(title, fOntsize=16)
    plt.ylabel(ylabel)
    plt.savefig(savepath)
    plt.show()

draw_stripplot(year_grp, year_grp.year, year_grp.num, 
            title="Number Of Movies Released Each Year(1873-2019)", 
            ylabel='# Number', 
            savepath="result/movies_number_of_each_year_stripplot.png")

draw_stripplot方法是可以共用的,如果其他的聚合数据生成了,也可以调用上面的方法。得到的图表如下所示:

Moviedata-10M电影数据集统计分析之源码分享(Python)

Fig 1.每年上映的电影数(趋势图)

按评分统计电影

首先分组统计出每个评分的电影数量

df = movies.groupby('douban_score').size().reset_index(name='counts')
df = df[df["douban_score"]>0]
df["douban_score"] = df.douban_score.astype("str")

采用 movies[movies["douban_score"] > 0]["douban_score"].mean() 可以统计出电影的平均得分为6.63。

接着编写柱状图绘制函数,代码如下:

#柱状图
def draw_barplot(df, df_x, df_y, title="Title", ylabel="# Y", 
                savepath="default.png", fOntsize=5, x_fOntsize=10):
    all_colors = list(plt.cm.colors.cnames.keys())
    random.seed(100)
    c = random.choices(all_colors, k=df_x.shape[0])

    # Plot Bars柱状
    plt.figure(figsize=(20,10), dpi= 200)
    plt.bar(df_x, df_y, color=c, width=.5)
    for i, val in enumerate(df_y.values):
        plt.text(i, val, int(val), horizOntalalignment='center', 
                verticalalignment='bottom', 
                fOntdict={'fontweight':200, 'size':fontsize})

    # Decoration
    plt.gca().set_xticklabels(df_x, rotation=90, horizOntalalignment= 'right', 
                            fOntdict={"size":x_fontsize})
    plt.title(title, fOntsize=16)
    plt.ylabel(ylabel)
    plt.savefig(savepath)
    plt.show()

将数据采用上面别写函数进行渲染:

draw_barplot(df, df.douban_score, df.counts, 
            title="Movie Statistics For Each Score", 
            ylabel='# Score', savepath="result/movie_stat_by_score.png", fOntsize=10)

得到的柱状图如下所示:

Moviedata-10M电影数据集统计分析之源码分享(Python)

Fig 2.各个评分下的电影数统计

按照国家进行统计

首先根据国家进行聚合,

movies_regiOns= movies
movies_regions["regions"] = movies_regions.regions  \
                .apply(lambda x: x.split("/")[0].split(" ")[0].strip())
df = movies_regions.groupby('regions').size().reset_index(name='counts')
df = df[df["regions"]!=""].sort_values(by=["counts"], ascending=False)[:50]

然后调用 draw_barplot 函数即可:

draw_barplot(df, df.regions, df.counts, 
            title="Movie Statistics For Each Region", ylabel='# Number', 
            savepath="result/movies_stat_by_regions.png", fOntsize=8,x_fOntsize=12)

结果图如下:

Moviedata-10M电影数据集统计分析之源码分享(Python)

Fig 3.按发行地域统计电影数(Top 50的发行地域)

按语言进行统计

数据构建

df = movies.groupby('languages').size().reset_index(name='counts')
df = df[df["languages"]!=""]
df = movies.languages.apply(lambda x: x.split("/")[-1].split(" ")[0])   \
         .reset_index(name="languages").drop(columns="id")
df = df.groupby("languages").size().reset_index(name='counts')
df = df[df["languages"]!=""]
df = df.sort_values(by=["counts"], ascending=False)[:20]

绘制饼状图,并进行渲染:

import matplotlib.pyplot as plt
import numpy as np

def draw_pieplot(df, df_x, df_y, 
                title="Title", 
                subtitle="subtitle", 
                savepath="default.png"):
    # Draw Plot
    fig, ax = plt.subplots(figsize=(12, 7), subplot_kw=dict(aspect="equal"), dpi= 80)

    data = df_y
    categories = df_x
    explode = np.zeros(df_x.shape[0])
    explode[3] = 0.1

    def func(pct, allvals):
        absolute = int(pct/100.*np.sum(allvals))
        return "{:.1f}% ({:d} )".format(pct, absolute)

    wedges, texts, autotexts = ax.pie(data,
                                      autopct=lambda pct: func(pct, data),
                                      textprops=dict(color="w"),
                                      colors=plt.cm.Dark2.colors,
                                     startangle=140)

    # Decoration
    ax.legend(wedges, categories, 
            title=subtitle, loc="center left", 
            bbox_to_anchor=(1, 0, 0.5, 1))
    plt.setp(autotexts, size=10, weight=700)
    ax.set_title(title)
    plt.savefig(savepath)
    plt.show()
    
draw_pieplot(df, df.languages, df.counts, 
            title="Statistics By Languages: Pie Chart", 
            subtitle="Languages", 
            savepath="result/movie_language_stat_pieplot.png")

结果图如下:

Moviedata-10M电影数据集统计分析之源码分享(Python)

Fig 4.按语言统计电影数

对中国的电影进行分析

同理,首先构造数据格式:

movies_china = movies[movies.regions.str.startswith("中国") |  \
                      movies.regions.str.startswith("香港") |  \
                      movies.regions.str.startswith("台湾") |  \
                      movies.regions.str.startswith("澳门")]

df = movies_china.reset_index().groupby('year').size().reset_index(name="counts")
df = df[df["year"]!=""][df["year"]!=0]
df = df.sort_values(by="year", ascending=True)
#df["counts"] = df.counts.astype("str")

接着绘制线性趋势图:

def draw_plot_liner2(df, df_x, df_y, 
                    x_name, 
                    y_name, 
                    title="Title", 
                    ylabel="Y", 
                    savepath="defalt.png"):
    # Draw Plot - liner
    plt.figure(figsize=(16,10), dpi= 80)
    plt.plot(x_name, y_name, data=df, color='tab:red')

    plt.yticks(fOntsize=12, alpha=.7)
    plt.title(title, fOntsize=22)
    plt.ylabel(ylabel)
    plt.grid(axis='both', alpha=.3)

    # Remove borders
    plt.gca().spines["top"].set_alpha(0.0)    
    plt.gca().spines["bottom"].set_alpha(0.3)
    plt.gca().spines["right"].set_alpha(0.0)    
    #plt.gca().spines["left"].set_alpha(0.3)   
    plt.savefig(savepath)
    plt.show()

draw_plot_liner2(df, df.year, df.counts,'year','counts', 
                title="Statistics of Movie_China For Each Year", 
                ylabel='# Number', savepath="result//movies_china_each_year.png")

最后得到的趋势图如下:

Moviedata-10M电影数据集统计分析之源码分享(Python)

Fig 5.中国每年的电影数量统计

如果需要渲染多个国家进行对比,只需要将多个国家的数据进行聚合然后一个个绘制到图上即可。

词云

电影类型词云

如果想要绘制类型词云,需要上面提到的WordCloud库。

from wordcloud import WordCloud
import collections
import imageio

当具备这些之后,我们首先要准备数据,取出电影标签,然后进行词频统计,

object_list = movies.genres.tolist()
word_list = []
for words in object_list:
    word_list.extend(words.split("/"))
word_counts = collections.Counter(word_list) # 对分词做词频统计

接着调用WordCloud库进行分析

b_mask = imageio.imread("./data/bg_my.jpeg") #如果运行到这里找不到图片,请自行替换图片即可

wc = WordCloud(font_path="Hiragino Sans GB.ttc", # 字体
               background_color = 'white', # 背景色
               max_words = 2000, # 最大显示单词数
               #width=1000,
               #height=500,
               max_font_size = 160, # 频率最大单词字体大小
               mask=b_mask
               #stopwords = stopwords # 过滤噪声词
              ).generate_from_frequencies(word_counts)

wc.to_file("genres_cloud.png")
plt.imshow(wc, interpolation="bilinear")
plt.axis("off")
plt.show()

如果词库比较大的话,时间需要久一点,最后得到的图片如下:

Moviedata-10M电影数据集统计分析之源码分享(Python)

Fig 6.电影类型词云

标签词云也是类似的,只修要重新渲染下数据即可。

结束语

文章共介绍了散点图、线性图、柱状图、饼状图、词云这几个核心图表的绘制,只要下载了相关库,那么构造出相应的数据格式之后,代码可以直接运行,后续我会考虑以jupyter文件分享出来,大家可以关注下我的公众号:【斗码小院】,相关内容会第一时间发布到公众号中,如果相关问题,也可以在公众号的“关于小院”一栏进行留言。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 我们


推荐阅读
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • pythonMatplotlib(二)
    Matplotlib+pandas作图一、对csv文件进行提取ruixi.csv对上述表格进行提取并做图画出图像二、对.xlsx进行提取:rui ... [详细]
  • 动量|收益率_基于MT策略的实战分析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了基于MT策略的实战分析相关的知识,希望对你有一定的参考价值。基于MT策略的实战分析 ... [详细]
  • 基于词向量计算文本相似度1.测试数据:链接:https:pan.baidu.coms1fXJjcujAmAwTfsuTg2CbWA提取码:f4vx2.实验代码:imp ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 本文总结了使用不同方式生成 Dataframe 的方法,包括通过CSV文件、Excel文件、python dictionary、List of tuples和List of dictionary。同时介绍了一些注意事项,如使用绝对路径引入文件和安装xlrd包来读取Excel文件。 ... [详细]
  • python3 nmap函数简介及使用方法
    本文介绍了python3 nmap函数的简介及使用方法,python-nmap是一个使用nmap进行端口扫描的python库,它可以生成nmap扫描报告,并帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。文章详细介绍了python-nmap的几个py文件的功能和用途,包括__init__.py、nmap.py和test.py。__init__.py主要导入基本信息,nmap.py用于调用nmap的功能进行扫描,test.py用于测试是否可以利用nmap的扫描功能。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • 我用Tkinter制作了一个图形用户界面,有两个主按钮:“开始”和“停止”。请您就如何使用“停止”按钮终止“开始”按钮为以下代码调用的已运行功能提供建议 ... [详细]
  • 数学建模入门python绘制频率直方图
    文章目录例题数据处理绘图操作调用演示例题数据处理将以下的数据保存到磁盘上17275169551696417165167471716216867165521696216865 ... [详细]
  • 人脸检测 pyqt+opencv+dlib
    一、实验目标绘制PyQT界面,调用摄像头显示人脸信息。在界面中,用户通过点击不同的按键可以实现多种功能:打开和关闭摄像头, ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有