当前位置: 首页 > article >正文

《利用 Python 和 Pyecharts 对豆瓣电影数据可视化分析》

        在数据分析的世界里,通过可视化的方式展示数据能够让我们更直观地理解数据背后的信息。今天,我将和大家分享如何使用 Python 结合 Pyecharts 库对电影相关数据进行多种维度的可视化分析,这些数据来源于我们的电影信息数据库。

结果展示:

数据来源:

Python爬取豆瓣电影全部分类数据并存入数据库

一、准备工作

        在开始之前,我们需要确保已经安装了以下几个重要的库:

pip install pyecharts
pip install pandas
pip install pymysql
  • pyecharts:用于创建各种精美的图表,帮助我们实现数据可视化。
  • pymysql:用于连接 MySQL 数据库,以便我们能够从中获取电影数据。
  • pandas:强大的数据处理库,能方便地对从数据库中读取的数据进行整理和分析。

二、数据库连接与数据查询

        我们的电影数据存储在 MySQL 数据库中,以下是针对不同分析需求从数据库获取数据的过程。

不同国家 / 地区电影占比分布

        首先,我们来看看不同国家 / 地区电影在我们的数据集中的占比情况。

# 连接数据库
db = pymysql.Connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='921108',
    db='data'
)

# 查询不同国家/地区电影的数量
query = "SELECT movie_country, COUNT(*) as count FROM movie_info GROUP BY movie_country"
df = pd.read_sql(query, db)

# 关闭数据库连接
db.close()

        在上述代码中,我们通过 pymysql 连接到名为 data 的数据库,然后执行一条 SQL 查询语句,按照 movie_country 字段对电影进行分组,并统计每组的数量,也就是每个国家 / 地区电影的数量。最后关闭数据库连接,将查询结果存储在 df 数据框中,以便后续使用。

三、创建可视化图表

(一)不同国家 / 地区电影占比分布饼图

        基于前面查询到的不同国家 / 地区电影数量的数据,我们可以使用 pyecharts 来创建一个饼图展示其占比分布。

from pyecharts.charts import Pie
from pyecharts import options as opts

# 创建饼图
pie = Pie()
pie.add("", [list(z) for z in zip(df['movie_country'].tolist(), df['count'].tolist())])
pie.set_global_opts(title_opts=opts.TitleOpts(title="不同国家/地区电影的占比分布",
                    title_textstyle_opts=opts.TextStyleOpts(font_size=25,color='pink'), pos_left="50%"),
                    legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%", is_show=False
        ))
pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
pie.render("movie_country_pie.html")

        在这段代码中,我们首先创建了一个 Pie 图表对象,然后将数据添加到饼图中。通过设置 title_opts 我们为饼图添加了一个标题,设置了标题的字体大小为 25,颜色为 pink,并且使其在水平方向上居中显示。同时,我们对图例进行了一些设置,比如设置其方向为垂直方向,位置在顶部 15% 左侧 2% 处,并且这里暂时不显示图例(可根据需求调整是否显示)。最后,通过设置 label_opts 让数据标签显示为每个区域名称以及其占比的百分比形式,最后将生成的饼图渲染为 movie_country_pie.html 文件,方便在浏览器中查看。

(二)不同电影类型数量分布柱状图

        接下来,我们分析不同电影类型的数量分布情况。不过这里需要注意的是,电影类型在数据库中存储的形式有点特殊,是字符串形式但内容是列表格式的字符串,比如 "['动作', '动画', '奇幻', '冒险']"

from pyecharts.charts import Bar
import pymysql
import pandas as pd
from collections import Counter
from pyecharts import options as opts
import ast

# 连接数据库
db = pymysql.Connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='921108',
    db='fjj'
)

# 查询电影信息,包含电影类型(假设是字符串形式存储在movie_type字段,但内容是列表格式的字符串)
query = "SELECT movie_type FROM movie_info"
df = pd.read_sql(query, db)

# 关闭数据库连接
db.close()

# 提取并统计每个电影类型词的出现次数
movie_type_list = []
for movie_type_str in df['movie_type']:
    # 使用ast.literal_eval将字符串形式的列表转换为真正的列表
    movie_type_list.extend(ast.literal_eval(movie_type_str))

type_count = Counter(movie_type_list)

# 准备柱状图数据(如果后续还需要绘制柱状图展示电影类型数量分布的话)
x_axis = list(type_count.keys())
y_axis = list(type_count.values())

# 创建柱状图(如果后续还需要绘制柱状图展示电影类型数量分布的话)
bar = Bar()
bar.add_xaxis(x_axis)
bar.add_yaxis("电影类型数量", y_axis)

# 添加数据标签(如果后续还需要绘制柱状图展示电影类型数量分布的话)
bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True))

bar.set_global_opts(title_opts={"text": "不同电影类型的数量分布"},
                    xaxis_opts={"axisLabel": {"rotate": 45}})
bar.render("movie_type_counts.html")

        在上述代码中,首先通过 pymysql 连接到名为 fjj 的数据库并查询出电影类型数据。然后,由于数据存储形式的特殊性,我们使用 ast.literal_eval 函数将字符串形式的列表转换为真正的列表,再通过 Counter 统计每个电影类型词的出现次数。接着,我们准备好绘制柱状图所需的 x 轴(电影类型)和 y 轴(对应类型的数量)数据,创建 Bar 图表对象,添加数据标签以及设置全局选项,最后将图表渲染为 movie_type_counts.html 文件。

(三)不同电影日期区间数量分布柱状图

        除了电影类型和国家 / 地区,我们还可以对电影的上映日期进行分析,看看不同日期区间内电影的数量分布情况。

from pyecharts.charts import Bar
import pymysql
import pandas aspd
from collections import Counter
from pyecharts import options as opts

# 连接数据库
db = pymysql.Connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='921108',
    db='fjj'
)

# 查询电影信息,包含电影日期(假设格式为 'YYYY-MM-DD')
query = "SELECT movie_date FROM movie_info"
df = pd.read_sql(query, db)

# 关闭数据库连接
db.close()

# 提取年份并划分区间统计电影数量
date_interval_count = Counter()
for date in df['movie_date']:
    year = date.year
    if year < 1990:
        date_interval_count['1990年以前'] += 1
    elif 1990 <= year < 2000:
        date_interval_count['1990 - 1999年'] += 1
    elif 2000 <= year < 2020:
    date_interval_count['2010 - 2020年'] += 1
    else:
        date_interval_count['2020年及以后'] += 1

# 准备柱状图数据
x_axis = list(date_interval_count.keys())
y_axis = list(date_interval_count.values())

# 创建柱状图
bar = Bar()
bar.add_xaxis(x_axis)
bar.add_yaxis("电影数量", y_axis)

# 设置数据标签格式及位置,使其更加美观清晰
bar.set_series_opts(
    label_opts=opts.LabelOpts(
        is_show=True,
        position="top",
        formatter="{b}: {c}"
    )
)

# 设置柱状图的全局选项
bar.set_global_opts(
    title_opts={"text": "不同电影日期区间的数量分布"},
    xaxis_opts={"axisLabel": {"rotate": 45}},
    legend_opts={"show": True},
    tooltip_opts={"show": True}
)

bar.render("movie_date_bar.html")

        在这段代码中,同样先通过 pymysql 连接到 fjj 数据库并查询出电影日期数据。然后,通过提取年份并按照设定的区间划分规则,使用 Counter 统计每个区间内电影的数量。之后准备好绘制柱状图的 x 轴和 y 轴数据,创建 Bar 图表对象,设置数据标签格式及位置以及全局选项,最后将图表渲染为 movie_date_bar.html 文件。

(四)电影评分分布饼图

        最后,我们来看看电影评分在不同区间的分布情况。

from pyecharts.charts import Pie
from pyecharts import options as opts
import pymysql
import pandas as pd

# 连接数据库
db = pymysql.Connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='921108',
    db='data'
)

# 查询不同评分区间的电影数量
query = """
SELECT
    CASE
        WHEN score >= 0 AND score < 2 THEN '0 - 2分'
        WHEN score >= 2 AND score < 4 THEN '2 - 4分'
        WHEN score >= 4 AND score < 6 THEN '4 - 6分'
        WHEN score >= 6 AND score < 8 THEN '6 - 8分'
        WHEN score >= 8 AND score < 10 Then '8 - 10分'
    END AS score_range,
    COUNT(*) AS count
FROM
    fjj.movie_info
GROUP BY
    score_range
"""
df = pd.read_sql(query, db)

# 关闭数据库连接
db.close()

# 创建饼图
pie = Pie()
data_pairs = [list(z) for z in zip(df['score_range'].tolist(), df['count'].tolist())]
pie.add("", data_pairs)
pie.set_global_opts(title_opts=opts.TitleOpts(title="电影评分分布饼图",
                    title_textstyle_opts=opts.TextStyleOpts(font_size=25,color='pink'), pos_left="50%"),
                    legend_opts={"orient": "vertical", "left": "left"})
pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
pie.render("movie_score_pie.html")

        在这段代码中,先连接到 data 数据库,执行一条复杂的 SQL 查询语句,按照设定的评分区间对电影进行分组并统计每组的数量。然后创建 Pie 图表对象,将数据添加到饼图中,设置标题、图例和数据标签等选项,最后将生成的饼图渲染为 movie_score_pie.html 文件。

四、总结

        通过以上的代码示例,我们利用 Python 的 pymysqlpandas 等库结合 pyecharts 库,从数据库中获取电影相关数据,并针对不同的维度(国家 / 地区、电影类型、电影日期、电影评分)进行了可视化分析,生成了相应的饼图和柱状图。这些可视化图表能够帮助我们更直观地了解电影数据的分布情况,为进一步的数据分析和决策提供了有力的支持。希望大家在自己的数据分析项目中也能灵活运用这些方法和工具,挖掘出更多有价值的信息。


http://www.kler.cn/a/421318.html

相关文章:

  • 46 基于单片机的烧水壶系统设计
  • Elixir Application
  • docker更换容器存储位置
  • HTML5系列(11)-- Web 无障碍开发指南
  • ElasticSearch easy-es 聚合函数 group by 混合写法求Top N 词云 分词
  • CTF-PWN: WEB_and_PWN [第一届“吾杯”网络安全技能大赛 Calculator] 赛后学习(不会)
  • 「Java EE开发指南」如何在Java EE网站中使用CodeLive?
  • mysql-为什么需要线程池
  • 爬虫获取的数据如何确保准确性?
  • CAD 二次开发入门与实践:以 C# 为例
  • 【数据库系列】Spring Boot如何配置Flyway的回调函数
  • 跨 CA 签发多个证书的 Nginx mTLS 配置
  • web安全从0到1:burp-suite4
  • 【Web】0基础学Web—html基本骨架、语义化标签、非语义化标签、列表、表格、表单
  • Qt 信号与槽:UI设计的基础
  • redis的应用--分布式锁
  • 【Spring】Spring IOCDI:架构旋律中的“依赖交响”与“控制华章”
  • 基于java+springboot+layui的流浪动物交流信息平台设计实现
  • git查看本地库对应的远端库的地址
  • opencv-mobile在幸狐RV1106部署使用
  • IDEA中MAVEN的一些设置问题
  • 【青牛科技】BISS0001高性能的传感信号处理集成电路芯片,广泛用于安防、自控等领域能
  • 开发者如何使用GCC提升开发效率Cmake操作
  • 每日总结,今日学习Python(有ptChorm的破解,需要可以留言)
  • 算法刷题Day8:BM30 二叉搜索树与双向链表
  • Adam 和 AdamW 优化器详解及其训练显存需求分析:以LLaMA-2 7B为例(中英双语)