关于Python的电影信息爬取与数据可视化分析报告

news2024/9/20 20:51:47

目录

1 引言

1.1 研究背景

1.2 研究目的

1.3 研究意义

2 相关技术介绍

2.1 Python语言及其应用领域

2.2 网络爬虫技术

2.3 数据可视化技术

2.4 PyCharm

2.5 Jupyter Notebook

3 数据爬取

4 数据预处理

5 数据分析及可视化

5.1数据分析背景

5.2从电影评分角度分析

5.3从评论人数与评分角度分析

5.4从电影年份角度分析

5.5从电影数量及类型分析

结 论

附 录


1 引言

1.1 研究背景

        随着电影市场规模的不断扩大,越来越多的人开始关注电影市场和电影数据。然而,市面上的电影数据分析工具相对较少,而且大多需要付费,因此,自己使用Python编写爬虫程序爬取电影数据并进行可视化分析成为了一种较为便捷的方法。

1.2 研究目的

        本报告旨在使用Python编写爬虫程序,爬取2016至2023年电影市场的相关数据,并进行可视化分析,以探讨电影市场的发展趋势、不同类型电影的受众群体以及电影市场的经济效益等问题。

1.3 研究意义

        这个研究的意义在于,通过利用Python编程语言和网络爬虫技术,对电影信息进行爬取、清洗和存储,并利用数据可视化技术对数据进行分析和展示,从而揭示出电影市场的一些规律和趋势,为电影从业者和观众提供决策支持和参考。

        具体来说,这个研究可以帮助电影从业者了解电影市场的竞争情况,找到更加有利的电影制作方向和策略,提高电影的票房和口碑;同时,观众可以通过分析和评估电影的评分、类型、时长、制片国家、发行时间等信息,更好地选择自己感兴趣的电影,提高观影体验和满意度。

        此外,这个研究还可以为数据科学和数据可视化领域的研究提供一个具体的应用案例,拓展了相关领域的研究范围和深度,对于推动数据科学和数据可视化技术的发展和应用具有积极的促进作用。

2 相关技术介绍

2.1 Python语言及其应用领域

        Python是一种高级编程语言,具有简单易学、优雅简洁、功能强大、可移植性好等特点,在科学计算、数据分析、人工智能、Web开发、自动化测试等领域广泛应用。

        Python的应用领域包括但不限于以下几个方面:

        1. 数据科学和数据分析:Python拥有丰富的数据处理和分析库,如NumPy、Pandas、SciPy、Matplotlib等,可以用于数据清洗、可视化和分析,被广泛应用于数据科学和数据分析领域。

        2. 人工智能和机器学习:Python拥有强大的机器学习和深度学习库,如TensorFlow、PyTorch、Keras等,可以用于图像识别、自然语言处理、智能推荐等领域的开发和应用。

        3. Web开发:Python拥有流行的Web框架,如Django、Flask等,可以用于Web应用的开发和部署。

        4. 自动化测试:Python可以用于自动化测试,如Selenium、Pytest等,可以用于Web应用、移动应用、桌面应用等领域的自动化测试和持续集成。

        5. 游戏开发:Python可以用于游戏开发,如Pygame等,可以用于2D/3D游戏的开发和制作。

        总之,Python具有广泛的应用领域和优秀的生态系统,成为了现代编程语言中的热门选项之一。

2.2 网络爬虫技术

        网络爬虫技术(Web scraping)是指利用计算机程序自动化地抓取互联网上的数据,通常是从网页中提取文本、图片、视频等信息。网络爬虫技术可以帮助我们快速地获取互联网上的大量数据,从而进行数据分析、挖掘和应用开发。

        网络爬虫技术通常分为以下几个步骤:

        1. 确定目标网站:确定需要爬取的目标网站,并确定需要爬取的信息类型和格式。

        2. 分析网站结构:分析目标网站的网页结构和数据布局,以便能够准确地提取所需数据。

        3. 编写爬虫程序:根据分析结果,编写爬虫程序,使用HTTP请求和解析HTML等技术实现网页抓取和数据提取。

        4. 存储数据:将抓取的数据存储到本地文件或数据库中,以备后续分析和应用。

        网络爬虫技术在各个领域都有着广泛的应用,如商业数据分析、舆情监测、搜索引擎优化、新闻媒体采集、科学研究等。但需要注意的是,在使用网络爬虫技术时,需要遵守相关法律法规和网站的使用条款,不得对他人的隐私和知识产权造成侵犯。

2.3 数据可视化技术

        数据可视化技术是指利用图形、图表、地图等视觉化方式,将数据转化为易于理解和分析的形式,以便更好地发现数据之间的关系、趋势和规律。数据可视化技术可以帮助我们更加直观地理解和展示数据,从而支持数据驱动的决策和应用开发。

        数据可视化技术通常包括以下几个方面:

        1. 数据预处理:在进行数据可视化之前,需要对数据进行清洗、处理和转换,以便更好地适应数据可视化的需求。

        2. 可视化设计:根据数据特点和分析目的,选择合适的可视化技术和设计风格,以便更好地呈现数据。

        3. 可视化实现:使用数据可视化库或工具,如D3.js、Tableau、matplotlib等,将数据转化为图形或图表进行展示。

        4. 可视化交互:通过添加交互功能,如鼠标悬停、点击、拖动等,增强数据可视化的互动性和体验性。

        数据可视化技术在各个领域都有着广泛的应用,如商业数据分析、科学研究、新闻媒体采集、政府公共服务等。它可以帮助我们更好地理解和发现数据,从而支持决策和创新。但需要注意的是,在进行数据可视化时,需要遵循一些设计原则和规范,以便更好地传达数据信息和表达分析结果。

2.4 PyCharm

        PyCharm是一款由JetBrains公司开发的Python集成开发环境(IDE),是Python开发者广泛使用的工具之一。PyCharm提供了丰富的功能和工具,可以帮助开发者提高开发效率和代码质量。

        PyCharm的功能包括但不限于以下几个方面:

        1. 代码编辑:PyCharm提供了强大的代码编辑功能,包括代码补全、语法高亮、代码格式化等,可以帮助开发者快速编写Python代码。

        2. 代码调试:PyCharm提供了强大的调试功能,可以帮助开发者快速定位和修复代码中的错误。

        3. 版本控制:PyCharm集成了多种版本控制工具,包括Git、SVN等,可以帮助开发者管理代码版本和协作开发。

        4. 集成开发环境:PyCharm集成了多个Python开发相关工具和库,如Pip、Virtualenv、Django等,可以帮助开发者更加便捷地进行开发。

        5. 自动化测试:PyCharm提供了多种自动化测试工具和框架,如unittest、pytest等,可以帮助开发者快速编写和运行自动化测试。

        总之,PyCharm是一款功能强大的Python集成开发环境,可以帮助开发者提高开发效率和代码质量,是Python开发者不可或缺的工具之一。

2.5 Jupyter Notebook

        Jupyter Notebook是一款交互式的Web应用程序,可以创建、编辑和共享包含代码、公式、可视化和说明文档等多种元素的文档,支持多种编程语言,包括Python、R、Julia等。Jupyter Notebook通常作为Anaconda Python发行版的一部分提供,也可以单独安装使用。

        Jupyter Notebook的特点包括但不限于以下几个方面:

        1. 交互性:Jupyter Notebook可以与用户进行交互,允许用户在Web界面中编写和执行代码,并实时显示代码执行结果。

        2. 可视化:Jupyter Notebook支持多种可视化元素,如图表、图片、视频等,可以帮助用户更好地展示数据和分析结果。

        3. 共享性:Jupyter Notebook可以通过互联网和本地网络共享,方便用户分享和协作开发。

        4. 可扩展性:Jupyter Notebook支持多种插件和扩展,可以增强其功能和应用范围。

        5. 支持多种编程语言:Jupyter Notebook支持多种编程语言,如Python、R、Julia等,可以满足不同用户的需求。

        总之,Jupyter Notebook是一款强大的交互式Web应用程序,可以帮助用户更好地展示和分析数据,提高工作效率和代码质量。作为Anaconda Python发行版的一部分,Jupyter Notebook已经成为Python数据科学和机器学习领域的重要工具之一。

3 数据爬取

爬取数据的步骤如下:

  1. 确定爬取的目标网站:首先需要确定需要爬取的目标网站,并了解该网站的数据结构和页面布局。
  2. 分析目标网站的数据结构和页面布局:对于目标网站的数据结构和页面布局,可以使用浏览器的开发者工具进行查看分析。
  3. 编写爬虫程序:在了解目标网站的数据结构和页面布局之后,可以开始编写爬虫程序。
  4. 运行爬虫程序:运行爬虫程序时,需要注意一些反爬虫机制,如请求头、访问频率、验证码等,可以使用一些反反爬虫技巧,如使用代理、设置访问间隔、分布式爬虫等。
  5. 存储数据:将爬取到的数据存储到本地文件或数据库中,以便后续的使用和分析。

        本报告从名为阳光电影的网站上爬取电影信息。脚本使用requests库发送GET请求来获取网站的HTML内容。然后,使用lxml库解析HTML内容并提取相关信息。脚本还使用csv库将提取的信息写入CSV文件。脚本还使用fake_useragent库为每个请求生成一个随机的用户代理,以防止被网站屏蔽。最后,脚本使用logging库记录任何在爬取过程中出现的错误。

        脚本定义了两个函数“get_detail”和“spider”:

        “get_detail”函数接受两个参数:视频详情页的URL和CSV写入器(csvwriter),用于获取视频的详情信息并将其写入CSV文件中。函数首先将详情页的URL拼接成完整的URL,然后使用requests库向该URL发送GET请求,获取详情页面的HTML文本。接下来,使用GBK编码解码HTML文本,并使用lxml.etree解析HTML文本,然后从HTML文本中提取出各种电影详情信息,如电影的中文译名、原名、产地、类型、语言、上映日期、豆瓣评分、时长、导演和演员列表等信息,并将其保存在一个字典中。在提取完所有的视频详情信息后,函数会使用logging库记录日志,并将视频信息写入CSV文件中。如果写入CSV文件时发生错误,将会使用error_logger记录错误日志。

        “spider”函数接受一个参数pages,用于指定爬取的页数,其主要功能是爬取指定页数的视频信息,并将其保存到CSV文件中。函数首先打开CSV文件,并使用csv.DictWriter写入表头。然后,使用循环遍历每一页,构造每一页的URL,并发送GET请求,获取每一页的HTML文本,并使用lxml.etree解析HTML文本。接下来,从每一页中提取出所有的详情链接,并遍历每个详情链接,调用get_video_detail函数获取视频详情信息,并使用csv.DictWriter将其写入CSV文件中。在遍历每个详情链接时,函数还会随机暂停1-3秒,以防止被反爬识别。在每一页爬取完毕后,函数会使用logging库记录日志,提示每一页爬取完毕。

        最后,启动爬虫程序。调用“spider”函数,并传递了一个参数120,表示需要爬取120页的电影信息。

4 数据预处理

        在真实世界里,数据来源各式各样质量良莠不齐,所以原始数据一般是有缺陷的,不完整的,重复的,是极易受侵染的。这样的数据处理起来不仅效率低下而且结果也不尽人意,这种情况下数据的预处理显得尤为重要。一方面,数据预处理把原始数据规范化、条理化,最终整理成结构化数据,极大地节省了处理海量信息的时间;另一方面,数据预处理可以使得挖掘愈发准确并且结果愈发真实有效。

5 数据分析及可视化

5.1数据分析背景

        随着电影行业的不断发展,必将越来越依靠于数据分析 的手段来获取收益。对演员和其电影口碑分析可以得出演员的的票房号召力;从票房分析影片类型对于观众的接受度、导演 的人气指数等等,都具有很强的经济效益。观众群体的广泛性和个人情感的复杂性都影响着影业的未来发展。报告从四个角度对电影信息数据进行分析:第一,从评分的占比角度入手分析观众对电影市场的认可程度;第二,从评论人数与评分入手分析观影潮流,第三,从电影年份和评分关系入手分析历年电影口碑分化趋势;第四,从电影类型入手分析时下热门电影素材类型。

5.2从电影评分角度分析

        评分是观众从接受的角度对影片进行的评价和回馈,一方面取决于电影本身的艺术质量,另一方面则取决于观众本身的需求,即影片在多大程度上与观众的期待视域达到融。图5-1可以看出评分在8-9分的电影占据11.37%,说明观众对于电影市场的认可程度比较高;而9分以上电影仅占比9.91%,表明电影市场高质量电影数量有待提高。而7分以下电影占据78.72%,则说明电影市场质量还有很大的提升空间。

图 5-1 各个评分段占据总体的比例

5.3从评论人数与评分角度分析

        评论人数与评分之间呈现正相关关系,相关系数为0.52,属于中等程度相关(相关系数在[-1,1],在统计学意义成立的基础上,相关系数越接近于1,评论人数与票房之间正相关性越大),表现为评价人数越多,评分高可能性越大。评论人数多的电影评分也普遍较高,反映出当下大众的观影潮流。

5.4从电影年份角度分析

        电影行业从1950年后开始兴起,在90年代后迎来了高潮;80年代后电影的评分有质的飞跃。可能在于电影制作的技术的到了提升,具体体现在画质、特性等方面;2000年以后的 电影评分逐渐倾向于两极分化的趋势。总体来说电影年份与电影评分呈正相关关系。

5.5从电影数量及类型分析

        观众对于喜剧题材和爱情题材类的电影认可度明显要高于其他类型。而武侠、功夫类题材的电影观众的认可度普遍偏低,说明动作类型电影品质还有很大提升空间,观众口味多元 化,并不是很喜欢单纯的动作片,相比之下,奇幻、科幻类题材的电影更受观众追捧。喜剧类影片一直以来都是电影市场的一大支柱,受到了制片商的极大追捧。近年来低成本、高回报的喜剧电影扎堆,其整体质量也不错,未来喜剧电影任然存在很大的发展前景。爱情题材电影虽然受观众认可度相对较高,但比之于喜剧题材电影任然有很大的上升空间,爱情片应该多在多元化和现代化方面下功夫,以更好适应在大众文化的时代背景下高速增长的观影需求。惊悚题材和恐怖题材无论在数量还是质量上都明显低于其他类型的电影,情况堪忧。

结 论

        大数据时代的到来使这个社会中的海量数据变成了巨大的潜在财富,大数据的作用是不可估量的,而且大数据已经渗透 到了社会的各个领域。运用网络爬虫爬取海量数据在信息繁荣 的大数据时代更加行之有效。Python作为一门脚本语言,它有着简单易学,面向对象,开源和拥有丰富的库等优点。报告阐述了Python语言在数据爬取及可视化分析中的应用。通过对电影信息的可视化分析,可以给影片公司一些制片提示,也可以给观影者提供重要的参考信息。因此,数据分析观念无论是概念的本身,还是它对于自身发展都具有很高的价值。

附 录

网络爬虫代码:

# 导入需要的库
import csv
import logging
import time
from random import randint

import requests
import urllib3
from fake_useragent import UserAgent
from lxml import etree

# 禁用SSL警告
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

# 配置日志记录,记录日志级别为INFO,并将日志输出到文件spider.log中
logging.basicConfig(filename='spider.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# 初始化error_logger,用于记录错误日志,记录日志级别为ERROR,并将日志输出到文件error.log中
error_logger = logging.getLogger('error_logger')
error_logger.setLevel(logging.ERROR)

# 请求头信息,包括User-Agent和Referer
HEADERS = {
    'User-Agent': UserAgent().random,
    'Referer': 'https://www.*.net/html/*/*/index.html'
}

# 基础URL
BASE_URL = 'https://www.*.net'

# 定义一个字典,用于存储电影信息
video_info = {
    'Video_Name_CN': None,
    'Video_Name': None,
    'Video_Address': None,
    'Video_Type': None,
    'Video_Language': None,
    'Video_Date': None,
    'Video_Number': None,
    'Video_Time': None,
    'Video_Director': None,
    'Video_Cast': []
}


# 定义函数,用于获取电影详情页的信息
def get_video_detail(details_url, csvwriter):
    detail_url = BASE_URL + details_url
    with requests.Session() as session:
        response = session.get(url=detail_url, headers=HEADERS, verify=False)
    detail_html_text = response.content.decode('gbk')
    detail_html = etree.HTML(detail_html_text)
    detail_content = detail_html.xpath("//div[@id='Zoom']//text()")

    # 遍历详情页的信息,提取出需要的信息,并存储到video_info字典中
    for index, info in enumerate(detail_content):
        if info.startswith('◎译  名'):
            video_info['Video_Name_CN'] = info.replace('◎译  名', '').strip()
        if info.startswith('◎片  名'):
            video_info['Video_Name'] = info.replace('◎片  名', '').strip()
        if info.startswith('◎产  地'):
            video_info['Video_Address'] = info.replace('◎产  地', '').strip()
        if info.startswith('◎类  别'):
            video_info['Video_Type'] = info.replace('◎类  别', '').strip()
        if info.startswith('◎语  言'):
            video_info['Video_Language'] = info.replace('◎语  言', '').strip()
        if info.startswith('◎上映日期'):
            video_info['Video_Date'] = info.replace('◎上映日期', '').strip()
        if info.startswith('◎豆瓣评分'):
            video_info['Video_Number'] = info.replace('◎豆瓣评分', '').strip()
        if info.startswith('◎片  长'):
            video_info['Video_Time'] = info.replace('◎片  长', '').strip()
        if info.startswith('◎导  演'):
            video_info['Video_Director'] = info.replace('◎导  演', '').strip()
        if info.startswith('◎主  演'):
            video_info['Video_Cast'] = []
            video_actor = info.replace('◎主  演', '').strip()
            video_info['Video_Cast'].append(video_actor)
            for actor in detail_content[index + 1:]:
                actor = actor.strip()
                if actor.startswith("◎"):
                    break
                video_info['Video_Cast'].append(actor)

    # 将获取到的电影信息写入到CSV文件中,并记录日志
    logging.info(f"{video_info['Video_Name_CN']}, {video_info['Video_Date']}, {video_info['Video_Time']}")
    try:
        csvwriter.writerow(video_info)
    except Exception as e:
        error_logger.error(f"Error occurred while writing to csv: {e}")


# 定义爬虫函数,用于爬取指定页数的电影信息
def spider(pages):
    # 打开CSV文件,并写入表头
    with open('movies.csv', 'a', encoding='utf-8', newline='') as file:
        csvwriter = csv.DictWriter(file, fieldnames=video_info.keys())
        csvwriter.writeheader()

        # 遍历每一页,获取电影列表页的信息,并提取出电影详情页的链接
        for page in range(1, pages + 1):
            page_url = f'{BASE_URL}/html/*/*/list_23_{page}.html'
            with requests.Session() as session:
                request = session.get(url=page_url, headers=HEADERS)
            page_html_text = request.text
            page_html = etree.HTML(page_html_text)
            detail_urls = page_html.xpath('//*[@class="co_content8"]//a/@href')

            # 遍历每个电影详情页,并调用get_video_detail函数获取电影信息
            for detail_url in detail_urls:
                if detail_url.startswith('/'):
                    try:
                        get_video_detail(detail_url, csvwriter)
                    except Exception as e:
                        error_logger.error(f"Error occurred: {e}")

                    # 随机等待1-3秒,防止被网站封IP
                    time.sleep(randint(1, 3))

            # 记录日志,表示该页已经爬取完成
            logging.info(f"==============第{page}页爬取完毕!=================")


if __name__ == '__main__':
    spider(120)

数据分析代码:

# In[1]:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from pyecharts.charts import Pie, Bar, Line, WordCloud
from pyecharts import options as opts
from pyecharts.globals import ThemeType
import collections
import warnings

plt.rcParams['font.sans-serif'] = ['SimHei']  #解决中文显示
plt.rcParams['axes.unicode_minus'] = False  #解决符号无法显示

# 忽略警告信息
warnings.filterwarnings('ignore')

# In[2]:
# 读取电影数据集
data = pd.read_csv('./movies.csv')

# In[3]:
# 删除缺失值和重复行
data.dropna(inplace=True)
data.drop_duplicates(inplace=True)

# In[4]:
# 对数据集进行预处理
data['Video_Name_CN'] = data['Video_Name_CN'].apply(
    lambda x: x.split('/')[0])  # 处理Video_Name_CN
data['Video_Name'] = data['Video_Name'].apply(
    lambda x: x.split('/')[0])  # 处理Video_Name
data['Video_Address'] = data['Video_Address'].apply(
    lambda x: x.split('/')[0].split(',')[0].strip())  # 处理Video_Address
data['Video_Language'] = data['Video_Language'].apply(
    lambda x: x.split('/')[0].split(',')[0])  # 处理Video_Language
data['Video_Date'] = data['Video_Date'].apply(
    lambda x: x.split('(')[0].strip())  # 处理Video_Date
data['Year'] = data['Video_Date'].apply(lambda x: x.split('-')[0])  # 提取年份信息
data = data[data['Year'] >= '2016']  # 只保留2016年及以后的电影数据
data['Num_of_Users'] = data['Video_Number'].apply(lambda x: str(x).split(
    'from')[-1].split('users')[0].replace(',', '').strip())  # 处理Num_of_Users
data['Num_of_Users'] = pd.to_numeric(data['Num_of_Users'],
                                     errors='coerce')  # 将Num_of_Users列转换为数值类型
data['Video_Number'] = data['Video_Number'].apply(
    lambda x: x.split('/')[0].strip())  # 处理Video_Number
data['Video_Number'] = pd.to_numeric(data['Video_Number'],
                                     errors='coerce')  # 将Video_Number列转换为数值类型
data['Video_Time'] = data['Video_Time'].apply(
    lambda x: x.split('分钟')[0])  # 处理Video_Time
data['Video_Time'] = pd.to_numeric(data['Video_Time'],
                                   errors='coerce')  # 将Video_Time列转换为数值类型
data['Video_Director'] = data['Video_Director'].apply(
    lambda x: x.split()[0])  # 处理Video_Director
data.dropna(inplace=True)  # 再次删除缺失值

# In[5]:
# 分析各个国家发布的电影数量占比
df1 = data.groupby('Video_Address').size().sort_values(
    ascending=False).head(10)
pie1 = Pie(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
pie1.add(
    series_name='电影数量',
    data_pair=[list(z) for z in zip(df1.index.tolist(), df1.values.tolist())],
    radius='70%',
)
pie1.set_series_opts(tooltip_opts=opts.TooltipOpts(trigger='item'))
pie1.render_notebook()

# In[6]:
# 发布电影数量最高Top5导演
df2 = data['Video_Director'].value_counts().head()
bar1 = Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK))
bar1.add_xaxis(df2.index.tolist())
bar1.add_yaxis('电影数量', df2.values.tolist())
bar1.set_series_opts(itemstyle_opts=opts.ItemStyleOpts(color='#B87333'))
bar1.set_series_opts(label_opts=opts.LabelOpts(position="top"))
bar1.render_notebook()

# In[7]:
# 分析电影平均评分最高的前十名国家
df3 = data.groupby('Video_Address')['Video_Number'].mean().sort_values(
    ascending=False).head(10)

# 创建水平条形图
def create_barh_chart(x_data, y_data):
    ax = x_data.plot(kind='barh', color='#6495ED')
    ax.set_xlabel('平均评分')
    ax.set_ylabel('国家')
    ax.invert_yaxis()
    for i, v in enumerate(y_data):
        ax.text(v + 0.1, i - 0.15, str(round(v, 2)))
    return ax

# 生成水平条形图
ax = create_barh_chart(df3, df3.values)
plt.show()

# In[8]:
# 分析哪种语言最受欢迎
result_list = []
for i in data['Video_Language'].values:
    word_list = str(i).split('/')
    for j in word_list:
        result_list.append(j)
word_counts = collections.Counter(result_list)
word_counts_top = word_counts.most_common(100)
wc1 = WordCloud()
wc1.add('', word_counts_top)
wc1.render_notebook()

# In[9]:
# 分析哪种类型电影最受欢迎
result_list = []
for i in data['Video_Type'].values:
    result_list.extend(str(i).split('/'))
word_counts = collections.Counter(result_list)
word_counts_top = word_counts.most_common(100)
wc2 = WordCloud()
wc2.add('', word_counts_top)
wc2.render_notebook()

# In[10]:
# 分析各种类型电影的比例
word_counts_top = word_counts.most_common(10)
pie2 = Pie(init_opts=opts.InitOpts(theme=ThemeType.MACARONS))
pie2.add(series_name='类型',
         data_pair=word_counts_top,
         rosetype='radius',
         radius='60%')
pie2.set_global_opts(title_opts=opts.TitleOpts(
    title="各种类型电影的比例", pos_left='center', pos_top=50))
pie2.set_series_opts(tooltip_opts=opts.TooltipOpts(
    trigger='item', formatter='{a} <br/>{b}:{c} ({d}%)'))
pie2.render_notebook()

# In[11]:
# 分析电影片长的分布
sns.displot(data['Video_Time'], kde=True)
plt.show()

# In[12]:
# 分析片长和评分的关系
plt.scatter(data['Video_Time'], data['Video_Number'])
plt.title('片长和评分的关系', fontsize=15)
plt.xlabel('片长', fontsize=15)
plt.ylabel('评分', fontsize=15)
plt.show()

# In[13]:
# 统计2016年到至今的电影年产量
df4 = data.groupby('Year').size()
line = Line()
line.add_xaxis(xaxis_data=df4.index.to_list())
line.add_yaxis('年产量', y_axis=df4.values.tolist(), is_smooth=True)
line.set_global_opts(
    xaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True)),
    title_opts=opts.TitleOpts(title="2016年到至今的电影年产量",
                              pos_left='center',
                              pos_bottom='5%'))
line.render_notebook()

# In[14]:
# 各个评分段占据总体的比例
bins = [0, 3, 5, 7, 8, 9, 10]
labels = ['0-3分', '3-5分', '5-7分', '7-8分', '8-9分', '9-10分']
data['score_range'] = pd.cut(data['Video_Number'],
                             bins=bins,
                             labels=labels,
                             include_lowest=True)
df5 = data.groupby('score_range').size()
pie3 = Pie(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
pie3.add(
    series_name='评分比例',
    data_pair=[list(z) for z in zip(df5.index.tolist(), df5.values.tolist())],
    radius=['70%', '30%'])
pie3.set_global_opts(title_opts=opts.TitleOpts(
    title="各个评分段占据总体的比例", pos_left='center', pos_top='5%'))
pie3.set_series_opts(tooltip_opts=opts.TooltipOpts(trigger='item'))
pie3.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}\n({d}%)"))
pie3.render_notebook()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1904561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式开发SPI基本介绍与应用

目录 #SPI通信协议 #SPI基础概念 #SPI通信模式 #SPI通信时序类型 前言&#xff1a;本篇笔记参考嘉立创的开发文档&#xff0c;连接放在最后。 #SPI通信协议 #SPI基础概念 Serial Peripheral Interface 缩写SPI 翻译&#xff1a;串行外设接口 同步串行通信协议&…

运维系列.Nginx配置中的高级指令和流程控制

运维专题 Nginx配置中的高级指令和流程控制 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/…

镭速实现大文件传输软件预览功能

在当前的数字时代&#xff0c;大文件传输软件成为了提高工作效率和文件管理便捷性的关键工具。镭速作为其中的一员&#xff0c;以其独特的功能和优势&#xff0c;为用户提供了多样化的文件预览和传输解决方案。 目前镭速支持对文档格式文件&#xff0c;一般图片格式及视频格式…

非比较排序 计数排序

1.核心思路 首先要找出max 和 min&#xff0c;最大值 - 最小值 1&#xff0c;就可以计算出数据在什么范围然后创建计数数组大小&#xff0c;a[i] - min 在数组的相对位置计数 通过自然序列排序然后把计数好的值&#xff0c;按照顺序依次放回原数组即可 动图解释&#xff0c;其…

Nettyの源码分析

本篇为Netty系列的最后一篇&#xff0c;按照惯例会简单介绍一些Netty相关核心源码。 1、Netty启动源码分析 代码就使用最初的Netty服务器案例&#xff0c;在bind这一行打上断点&#xff0c;观察启动的全过程&#xff1a; 由于某些方法的调用链过深&#xff0c;节约篇幅&#xf…

Nuxt框架中内置组件详解及使用指南(二)

title: Nuxt框架中内置组件详解及使用指南&#xff08;二&#xff09; date: 2024/7/7 updated: 2024/7/7 author: cmdragon excerpt: 摘要&#xff1a;“本文详细介绍了Nuxt 3中和组件的使用方法&#xff0c;包括组件的基本概念、属性、自定义属性、获取引用以及完整示例&a…

利用redis Zset实现 排行榜功能 配合xxl-job持久化每一个赛季的排行榜

zset 可以排序 使用xxl-job实现定时任务 对历史排行榜持久化到数据库 排行榜有当前赛季排行版和历史排行榜 当前赛季排行榜利用redis 中的SortSet 数据结构 获取 每个月的 月初 利用xxl-job的定时任务持久化化上一个月的排行榜信息 并删除redis中的数据 当排行榜数据量巨大时…

【技术追踪】GeCA:高分辨率医学图像合成的神经元胞扩散(MICCAI-2024)

扩散方法与传统方法相结合&#xff0c;挺有意思~ 本文提出一种称为生成式元胞自动机 (Generative Cellular Automata&#xff0c;GeCA) 的新模型系列&#xff0c;其灵感来自于生物体从单细胞进化而来的过程&#xff0c;显著提高了11 种不同眼科疾病分类任务的表现。 论文&#…

k8s 部署 springboot 项目内存持续增长问题分析解决

写在前面 工作中遇到&#xff0c;请教公司前辈解决&#xff0c;简单整理记忆博文内容涉及一次 GC 问题的分析以及解决理解不足小伙伴帮忙指正 &#x1f603;,生活加油 99%的焦虑都来自于虚度时间和没有好好做事&#xff0c;所以唯一的解决办法就是行动起来&#xff0c;认真做完…

ES7210高性能四通道音频ADC转换模拟麦克风为IIS数字咪头

特征 高性能多位 Delta-Σ 音频 ADC 102 dB 信噪比 -85 分贝 THDN 24 位&#xff0c;8 至 100 kHz 采样频率 I2S/PCM 主串行数据端口或从串行数据端口 支持TDM 256/384Fs、USB 12/24 MHz 和其他非标准音频系统时钟 低功耗待机模式 应用 麦克风阵列 智能音箱 远场语音捕获 订购…

npm安装完yarn还是用不了?

前言 解决 找到你的包全局安装目录 复制路径&#xff0c;配置到Path全局环境变量 结果 不过发现在idea里还是用不了&#xff0c;此时你会想&#xff0c;这什么烂贴&#xff0c;没一点屁用 不过在重启idea之后&#xff0c;你也许就不会这么想了

【网络安全】实验五(身份隐藏与ARP欺骗)

一、本次实验的实验目的 &#xff08;1&#xff09;了解网络攻击中常用的身份隐藏技术&#xff0c;掌握代理服务器的配置及使用方法 &#xff08;2&#xff09;通过实现ARP欺骗攻击&#xff0c;了解黑客利用协议缺陷进行网络攻击的一般方法 二、搭配环境 打开三台虚拟机&#…

本地多卡(3090)部署通义千问Qwen2-72B大模型提速实践:从龟速到够用

最近在做文本风格转化&#xff0c;涉及千万token级别的文本。想用大模型转写&#xff0c;在线的模型一来涉及数据隐私&#xff0c;二来又不想先垫钱再找报销。本地的7-9B小模型又感觉效果有限&#xff0c;正好实验室给俺配了4卡3090的机子&#xff0c;反正也就是做个推理&#…

掌握MySQL基础命令:数据表结构修改详细操作

MySQL数据表&#xff08;Table&#xff09;是MySQL数据库中存储数据的基本结构单元。简单来说&#xff0c;数据表可以被看作是一个二维的、由行&#xff08;Row&#xff09;和列&#xff08;Column&#xff09;组成的表格&#xff0c;其中每一行代表了一个记录&#xff08;Reco…

微服务的分布式事务解决方案

微服务的分布式事务解决方案 1、分布式事务的理论模型1.1、X/Open 分布式事务模型1.2、两阶段提交协议1.3、三阶段提交协议 2、分布式事务常见解决方案2.1、TCC补偿型方案2.2、基于可靠性消息的最终一致性方案2.3、最大努力通知型方案 3、分布式事务中间件 Seata3.1、AT 模式3.…

数据跨境法案:美国篇上

近年来随着全球数字化的加速发展&#xff0c;数据已成为国家竞争力的重要基石。在这样的背景下&#xff0c;中国软件和技术出海的场景日益丰富。本系列邀请到在跨境数据方面的研究人员针对海外的数据跨境政策进行解读。 本期将针对美国对数据跨境流动的态度和政策进行阐释。过…

基础权限存储

一丶要求 建立用户组shengcan&#xff0c;其id为 2000建立用户组 caiwu&#xff0c;其id 为2001建立用户组 jishu&#xff0c;其id 为 2002建立目录/sc,此目录是 shengchan 部门的存储目录&#xff0c;只能被 shengchan 组的成员操作4.其他用户没有任何权限建立目录/cw,此目录…

两个全开源的3D模型素材下载网站源码 3D图纸模型素材 三维图形素材会员下载站源码

今天推荐两个全开源的3D模型素材下载网站源码 3D图纸模型素材 三维图形素材会员下载站源码&#xff0c;这两个源码完整&#xff0c;都是基于thinkphp内核开发的&#xff0c;框架稳定&#xff0c;带数据库&#xff0c;源码文件&#xff0c;可以直接部署使用。 第一个&#xff1a…

数据库课设---学生宿舍管理系统(sql server+C#)

1.引言 1.1 内容及要求 设计内容&#xff1a;设计学生宿舍管理系统。 设计要求&#xff1a; &#xff08;1&#xff09;数据库应用系统开发的需求分析&#xff0c;写出比较完善系统功能。 &#xff08;2&#xff09;数据库概念模型设计、逻辑模型设计以及物理模型设计。 …

【基于R语言群体遗传学】-10-适应性与正选择

在之前的博客中&#xff0c;我们学习了哈代温伯格模型&#xff0c;学习了Fisher模型&#xff0c;学习了遗传漂变与变异的模型&#xff0c;没有看过之前内容的朋友可以先看一下之前的文章&#xff1a; 群体遗传学_tRNA做科研的博客-CSDN博客 一些新名词 &#xff08;1&#xf…