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

【Python爬虫(27)】探索数据可视化的魔法世界

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取,还涉及数据处理与分析。无论是新手小白还是进阶开发者,都能从中汲取知识,助力掌握爬虫核心技能,开拓技术视野。

目录

  • 一、数据可视化的魔法魅力
  • 二、常用数据可视化工具大盘点
    • 2.1 Matplotlib:Python 绘图基石
    • 2.2 Seaborn:基于 Matplotlib 的优雅升华
  • 三、Matplotlib 实战:绘制简单图表
    • 3.1 折线图:数据趋势的直观呈现
    • 3.2 柱状图:数据对比的有力工具
    • 3.3 散点图:数据关系的探索利器
  • 四、爬虫数据可视化实战
    • 4.1 爬取数据:获取分析素材
    • 4.2 数据预处理:清洗和整理数据
    • 4.3 可视化展示:让数据说话
  • 五、总结与展望


一、数据可视化的魔法魅力

在数据的广袤宇宙中,数据可视化就像是一把神奇的钥匙,能够打开隐藏在数据背后的奥秘之门。它将枯燥、抽象的数据转化为直观、生动的图形和图表,让我们能够一眼洞察数据中的规律、趋势和关系。

数据可视化在当今的数字化时代具有举足轻重的地位。在商业分析领域,企业通过数据可视化展示销售数据、市场趋势等,帮助决策者迅速做出明智的决策。比如,通过折线图展示过去几年的销售额变化,能够清晰地看到业务的增长或衰退趋势,从而制定相应的营销策略。在科学研究中,数据可视化助力科研人员理解复杂的实验数据,发现新的科学规律。例如,在基因研究中,通过可视化技术展示基因序列和表达水平,有助于揭示基因之间的相互作用和疾病的发病机制。

数据可视化的应用场景可谓无处不在。在金融领域,它用于风险评估、投资分析,帮助投资者了解市场动态和资产配置情况。在医疗保健领域,医生可以通过可视化患者的生理数据和病历信息,更准确地诊断疾病和制定治疗方案。在教育领域,数据可视化可以帮助教师分析学生的学习成绩和行为数据,从而提供个性化的教育支持。

二、常用数据可视化工具大盘点

在数据可视化的工具百宝箱中,有许多强大而实用的工具可供我们选择。下面,让我们来深入了解一下其中两款备受欢迎的工具:Matplotlib 和 Seaborn。

2.1 Matplotlib:Python 绘图基石

Matplotlib 是 Python 中最基础且功能强大的绘图库,堪称 Python 绘图领域的基石。它就像是一位全能的艺术家,为开发者提供了丰富的图表类型,包括折线图、柱状图、散点图、饼图等,几乎可以绘制任何你能想象到的图形 。其设计极为灵活,支持高度定制,让你能够根据自己的需求随心所欲地调整图表的每一个细节。

先来看一个使用 Matplotlib 绘制折线图的简单示例:

import matplotlib.pyplot as plt# 数据准备
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]# 创建图形
plt.plot(x, y, label="y = x^2", color='blue')# 添加标题与标签
plt.title("Matplotlib Basic Plot")
plt.xlabel("X Axis")
plt.ylabel("Y Axis")# 显示图例
plt.legend()# 显示图形
plt.show()

在这个示例中,我们首先导入了 Matplotlib 的 pyplot 模块并别名为 plt。然后准备了 x 和 y 轴的数据,接着使用plt.plot()函数绘制折线图,通过label参数为折线添加标签,color参数设置折线颜色为蓝色。之后,使用plt.title()、plt.xlabel()和plt.ylabel()分别添加标题和坐标轴标签,最后通过plt.legend()显示图例,plt.show()展示图形。

Matplotlib 的强大之处还在于它的高度可定制性。我们可以轻松地修改图表的字体、颜色、线条样式等。例如,将上述代码中的图形外观进行自定义:

plt.plot(x, y, color='green', linestyle='--', linewidth=2)
plt.title("Customized Plot", fontsize=14, color='red')
plt.xlabel("X Axis", fontsize=12)
plt.ylabel("Y Axis", fontsize=12)
plt.show()

在这段代码中,我们将折线颜色改为绿色,线条样式改为虚线,线宽设置为 2。标题的字体大小改为 14,颜色为红色,坐标轴标签的字体大小改为 12 。通过这些简单的设置,我们就可以轻松地将一个普通的折线图变得独具特色。

2.2 Seaborn:基于 Matplotlib 的优雅升华

Seaborn 是建立在 Matplotlib 基础之上的高级可视化库,它就像是为 Matplotlib 这位艺术家穿上了一件华丽的外衣,使数据可视化更加简洁、易用。Seaborn 默认提供了更美观的图形样式,让你的图表无需过多的手动调整就能呈现出专业的外观。它还简化了常见统计图表的绘制,特别适用于统计图表的生成,如箱线图、热图、回归图等。

与 Matplotlib 相比,Seaborn 具有以下明显优势:

  • 简化绘图流程:Seaborn 封装了许多常见的统计图表,使得创建复杂图表的过程变得更加简单。例如,绘制一个带有分类和颜色区分的散点图,使用 Seaborn 只需几行代码即可完成。
  • 内置主题和调色板:Seaborn 自带多种美观的主题和调色板,能够生成具有专业风格的图表。你可以轻松地切换不同的主题和调色板,以满足不同的需求和审美。
  • 自动处理统计图表:Seaborn 可以自动完成很多与统计图表相关的任务,例如数据分组、回归拟合、计算置信区间等。这大大减轻了开发者的工作量,让你能够更专注于数据的分析和展示。
  • 与 Pandas 深度集成:Seaborn 能够直接处理 Pandas 的 DataFrame 对象,这使得数据的加载和可视化更加便捷。你可以直接将 DataFrame 中的数据用于绘制各种图表,无需进行复杂的数据转换。

接下来,通过实例来感受一下 Seaborn 在绘制复杂图表时的便利性。首先,使用 Seaborn 绘制一个散点图,并通过颜色和样式区分不同的类别:

import seaborn as sns
import matplotlib.pyplot as plt# 使用Seaborn内置数据集
tips = sns.load_dataset("tips")# 绘制散点图
sns.scatterplot(x="total_bill", y="tip", data=tips, hue="time", style="sex")# 添加标题
plt.title("Seaborn Scatter Plot")
plt.show()

在这个例子中,我们首先导入了 Seaborn 并别名为 sns,同时导入了 Matplotlib 的 pyplot 模块。然后使用 Seaborn 的load_dataset()函数加载内置的tips数据集,该数据集包含了餐厅账单和小费的相关信息。接着,使用sns.scatterplot()函数绘制散点图,x和y参数分别指定了横轴和纵轴的数据,data参数指定了使用的数据集,hue参数通过time变量对数据进行分类并使用不同颜色表示,style参数通过sex变量对数据进行分类并使用不同样式的点表示。最后添加标题并展示图形。

再来看一个绘制箱线图和热图的示例:

# 绘制箱线图
sns.boxplot(x="day", y="total_bill", data=tips)
plt.title("Boxplot using Seaborn")
plt.show()# 绘制热图
correlation = tips.corr()
sns.heatmap(correlation, annot=True, cmap='coolwarm')
plt.title("Correlation Heatmap")
plt.show()

在绘制箱线图时,使用sns.boxplot()函数,x和y参数分别指定了分类变量和数值变量,data参数指定数据集。绘制热图时,首先计算数据集的相关性矩阵correlation,然后使用sns.heatmap()函数绘制热图,annot=True表示在热图上显示数值,cmap='coolwarm’指定了颜色映射方案 。通过这两个简单的示例,我们可以看到 Seaborn 在绘制统计图表时的简洁和高效。

三、Matplotlib 实战:绘制简单图表

3.1 折线图:数据趋势的直观呈现

折线图是一种非常直观的图表类型,它通过将数据点用线段连接起来,清晰地展示数据随时间或其他连续变量的变化趋势 。在 Matplotlib 中,使用plt.plot()函数可以轻松绘制折线图。

假设我们有一家电商公司过去 12 个月的销售额数据,如下所示:

import matplotlib.pyplot as plt# 月份
months = range(1, 13)
# 销售额(单位:万元)
sales = [120, 150, 130, 180, 200, 220, 250, 230, 210, 190, 170, 160]# 绘制折线图
plt.plot(months, sales, label='销售额', color='red', linestyle='-', linewidth=2, marker='o')# 添加标题和坐标轴标签
plt.title('电商公司过去12个月销售额变化趋势')
plt.xlabel('月份')
plt.ylabel('销售额(万元)')# 设置x轴刻度为月份
plt.xticks(months)# 显示图例
plt.legend()# 显示图形
plt.show()

在这段代码中,我们首先定义了月份和销售额的数据。然后使用plt.plot()函数绘制折线图,label参数为折线添加了标签,color参数设置折线颜色为红色,linestyle设置线条样式为实线,linewidth设置线宽为 2,marker设置标记点样式为圆圈 。接着,使用plt.title()、plt.xlabel()和plt.ylabel()分别添加标题和坐标轴标签。通过plt.xticks()设置 x 轴刻度为月份。最后,使用plt.legend()显示图例,plt.show()展示图形。运行上述代码,我们可以得到一个清晰展示销售额变化趋势的折线图,从图中可以直观地看出销售额在哪些月份增长,哪些月份下降,以及整体的变化趋势。

3.2 柱状图:数据对比的有力工具

柱状图是一种用于比较不同类别数据大小的图表,它以矩形柱的高度或长度来表示数据的值。在 Matplotlib 中,使用plt.bar()函数绘制垂直柱状图,使用plt.barh()函数绘制水平柱状图。

假设有一个水果销售统计数据,包含苹果、香蕉、橙子、草莓四种水果的销量,我们来绘制一个垂直柱状图进行比较:

import matplotlib.pyplot as plt# 水果种类
fruits = ['苹果', '香蕉', '橙子', '草莓']
# 销量(单位:千克)
sales_volume = [150, 120, 180, 100]# 绘制垂直柱状图
plt.bar(fruits, sales_volume, color=['red', 'yellow', 'orange', 'pink'])# 添加标题和坐标轴标签
plt.title('不同水果销量对比')
plt.xlabel('水果种类')
plt.ylabel('销量(千克)')# 显示图形
plt.show()

在这段代码中,我们定义了水果种类和销量的数据。使用plt.bar()函数绘制垂直柱状图,fruits作为 x 轴的类别,sales_volume作为柱状图的高度,通过color参数为每个柱状图设置了不同的颜色 。然后添加标题和坐标轴标签,最后展示图形。运行代码后,我们可以看到不同水果销量的直观对比,很容易看出哪种水果销量最高,哪种最低。

接下来,我们再绘制一个水平柱状图,假设有一个城市不同区域的房价数据:

# 区域
areas = ['A区', 'B区', 'C区', 'D区']
# 平均房价(单位:元/平方米)
house_prices = [50000, 45000, 60000, 48000]# 绘制水平柱状图
plt.barh(areas, house_prices, color=['blue', 'green', 'purple', 'brown'])# 添加标题和坐标轴标签
plt.title('不同区域房价对比')
plt.xlabel('平均房价(元/平方米)')
plt.ylabel('区域')# 显示图形
plt.show()

这里使用plt.barh()函数绘制水平柱状图,areas作为 y 轴的类别,house_prices作为柱状图的长度,同样通过color参数设置颜色 。添加标题和坐标轴标签后展示图形,通过水平柱状图可以清晰地比较不同区域房价的高低。

3.3 散点图:数据关系的探索利器

散点图主要用于展示两个变量之间的关系,通过观察散点的分布情况,可以发现数据之间是否存在某种相关性、聚类或异常值 。在 Matplotlib 中,使用plt.scatter()函数绘制散点图。

假设我们有一组学生的学习时间和考试成绩的数据,来看看学习时间和成绩之间的关系:

import matplotlib.pyplot as plt# 学习时间(小时)
study_hours = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
# 考试成绩(分)
scores = [60, 65, 70, 75, 80, 85, 90, 92, 95, 98]# 绘制散点图
plt.scatter(study_hours, scores, color='green', marker='s', s=100)# 添加标题和坐标轴标签
plt.title('学习时间与考试成绩关系')
plt.xlabel('学习时间(小时)')
plt.ylabel('考试成绩(分)')# 显示图形
plt.show()

在这段代码中,我们定义了学习时间和考试成绩的数据。使用plt.scatter()函数绘制散点图,study_hours作为 x 轴数据,scores作为 y 轴数据,color设置点的颜色为绿色,marker设置点的样式为正方形,s设置点的大小为 100 。添加标题和坐标轴标签后展示图形。从散点图中可以观察到,随着学习时间的增加,考试成绩有上升的趋势,说明两者之间可能存在正相关关系。

再来看一个更复杂的例子,假设有不同城市的人口密度和犯罪率的数据,并且希望根据城市类型对点进行颜色区分:

import numpy as np
import matplotlib.pyplot as plt# 城市数量
num_cities = 50# 人口密度(人/平方公里)
population_density = np.random.randint(100, 5000, num_cities)
# 犯罪率(每10万人中的犯罪案件数)
crime_rate = np.random.randint(100, 1000, num_cities)
# 城市类型(0代表小城市,1代表大城市)
city_type = np.random.randint(0, 2, num_cities)# 颜色映射
colors = ['blue' if t == 0 else'red' for t in city_type]# 绘制散点图
plt.scatter(population_density, crime_rate, c=colors, marker='o', s=50)# 添加标题和坐标轴标签
plt.title('城市人口密度与犯罪率关系')
plt.xlabel('人口密度(人/平方公里)')
plt.ylabel('犯罪率(每10万人中的犯罪案件数)')# 显示图例
plt.legend(['小城市', '大城市'], loc='upper right')# 显示图形
plt.show()

在这个例子中,我们使用numpy生成了随机的人口密度、犯罪率和城市类型数据。通过列表推导式根据城市类型生成了对应的颜色列表。使用plt.scatter()函数绘制散点图,c参数传入颜色列表,实现根据城市类型对点进行颜色区分 。添加标题、坐标轴标签和图例后展示图形。通过这个散点图,可以更直观地探索不同类型城市的人口密度和犯罪率之间的关系,以及不同类型城市数据点的分布情况。

四、爬虫数据可视化实战

4.1 爬取数据:获取分析素材

在进行数据可视化之前,我们首先需要获取数据。这里我们使用 Python 爬虫来抓取网页数据,以爬取某电商网站上的商品信息为例,展示如何使用requests库和BeautifulSoup库进行数据爬取。

requests库是 Python 中用于发送 HTTP 请求的强大工具,它可以方便地获取网页内容。BeautifulSoup库则是用于解析 HTML 和 XML 文档的库,能够帮助我们从网页内容中提取出所需的数据 。

以下是一个简单的爬取某电商网站商品信息的代码示例:

import requests
from bs4 import BeautifulSoup# 目标网址
url = 'https://example.com/products'  # 请替换为实际网址# 发送HTTP GET请求
response = requests.get(url)# 检查请求是否成功
if response.status_code == 200:# 使用BeautifulSoup解析网页内容soup = BeautifulSoup(response.text, 'html.parser')# 提取商品信息,假设商品信息包含在class为'product-item'的div标签中product_items = soup.find_all('div', class_='product-item')products = []for item in product_items:# 提取商品名称,假设商品名称在class为'product-name'的span标签中name = item.find('span', class_='product-name').text.strip()# 提取商品价格,假设商品价格在class为'product-price'的span标签中price = item.find('span', class_='product-price').text.strip()products.append({'商品名称': name, '商品价格': price})# 打印提取到的商品信息for product in products:print(product)else:print(f'请求失败,状态码: {response.status_code}')

在上述代码中,我们首先导入了requests库和BeautifulSoup库。然后定义了目标网址,使用requests.get()方法发送 HTTP GET 请求获取网页内容。通过检查response.status_code判断请求是否成功,如果成功则使用BeautifulSoup将网页内容解析为可操作的对象 。接着,使用soup.find_all()方法找到所有包含商品信息的div标签,再在每个div标签中通过find()方法提取商品名称和价格。最后,将提取到的商品信息存储在列表中并打印出来。

为了方便后续的数据处理和分析,我们可以将爬取到的数据保存为 CSV 格式的文件。使用 Python 的csv模块可以轻松实现这一功能:

import csv# 将数据保存为CSV文件
with open('products.csv', 'w', newline='', encoding='utf-8') as csvfile:fieldnames = ['商品名称', '商品价格']writer = csv.DictWriter(csvfile, fieldnames=fieldnames)writer.writeheader()for product in products:writer.writerow(product)

在这段代码中,我们使用csv.DictWriter创建一个写入 CSV 文件的对象,指定字段名fieldnames。然后使用writer.writeheader()写入表头,再通过循环使用writer.writerow()将每个商品的数据写入文件 。这样,我们就成功地将爬取到的数据保存为 CSV 文件,为后续的数据预处理和可视化做好了准备。

4.2 数据预处理:清洗和整理数据

从网页上爬取到的数据往往存在各种问题,如重复数据、缺失值、数据格式不一致等,这些问题会影响数据可视化的效果和数据分析的准确性。因此,在进行可视化之前,需要对数据进行预处理。

数据预处理的重要性不言而喻。它可以提高数据的质量,使数据更加准确、完整和一致,从而为后续的数据分析和可视化提供可靠的基础。例如,去除重复数据可以避免在分析和可视化中出现重复计算和误导性的结果;处理缺失值可以确保数据的完整性,避免因缺失数据而导致分析结果的偏差 。

下面通过代码示例展示如何使用 Pandas 库对爬取的数据进行预处理。假设我们已经将爬取到的商品数据保存为products.csv文件,现在读取该文件并进行预处理:

import pandas as pd# 读取CSV文件
data = pd.read_csv('products.csv')# 去除重复数据
data = data.drop_duplicates()# 处理缺失值,这里简单地删除含有缺失值的行
data = data.dropna()# 检查数据类型,如果需要,进行数据类型转换
# 例如,将价格列转换为数值类型
data['商品价格'] = pd.to_numeric(data['商品价格'], errors='coerce')# 打印预处理后的数据
print(data.head())

在上述代码中,首先使用pd.read_csv()函数读取 CSV 文件,将数据加载到 Pandas 的 DataFrame 对象中。然后使用drop_duplicates()方法去除重复数据,确保每一条数据都是唯一的。接着,使用dropna()方法删除含有缺失值的行,保证数据的完整性 。之后,通过pd.to_numeric()方法将价格列转换为数值类型,errors='coerce’参数表示如果转换失败则将该值设为NaN。最后,使用data.head()查看预处理后数据的前几行,以确认预处理的效果。

4.3 可视化展示:让数据说话

经过数据爬取和预处理后,我们就可以根据数据的特点选择合适的图表类型进行可视化展示了。假设我们希望展示不同商品价格的分布情况,这时可以选择柱状图。

下面是使用 Matplotlib 绘制柱状图展示商品价格分布的代码:

import matplotlib.pyplot as plt
import pandas as pd# 读取预处理后的数据
data = pd.read_csv('products.csv')# 提取商品名称和价格
product_names = data['商品名称']
product_prices = data['商品价格']# 绘制柱状图
plt.bar(product_names, product_prices)# 添加标题和坐标轴标签
plt.title('不同商品价格分布')
plt.xlabel('商品名称')
plt.ylabel('商品价格')# 旋转x轴标签,避免重叠
plt.xticks(rotation=45)# 显示图形
plt.show()

在这段代码中,首先读取预处理后的 CSV 数据。然后分别提取商品名称和价格列。接着使用plt.bar()函数绘制柱状图,product_names作为 x 轴的类别,product_prices作为柱状图的高度 。使用plt.title()、plt.xlabel()和plt.ylabel()添加标题和坐标轴标签。为了避免 x 轴标签重叠,使用plt.xticks(rotation=45)将 x 轴标签旋转 45 度。最后,通过plt.show()展示图形。

如果我们希望展示商品价格随时间的变化趋势(假设数据中包含时间信息),则可以使用折线图。假设我们有一个包含时间和价格的数据集prices.csv,代码如下:

import matplotlib.pyplot as plt
import pandas as pd# 读取数据
data = pd.read_csv('prices.csv')# 将时间列转换为日期时间类型
data['时间'] = pd.to_datetime(data['时间'])# 绘制折线图
plt.plot(data['时间'], data['商品价格'])# 添加标题和坐标轴标签
plt.title('商品价格随时间变化趋势')
plt.xlabel('时间')
plt.ylabel('商品价格')# 显示图形
plt.show()

在这个例子中,首先读取数据并使用pd.to_datetime()将时间列转换为日期时间类型,以便 Matplotlib 能够正确处理时间轴。然后使用plt.plot()函数绘制折线图,以时间为 x 轴,商品价格为 y 轴 。添加标题和坐标轴标签后展示图形,通过折线图可以清晰地看到商品价格随时间的变化趋势。

在实际的可视化过程中,还可以对图表进行更多的美化和标注,使其更加美观和易于理解。例如,可以添加图例、调整颜色、设置线条样式等。以柱状图为例,对上述代码进行美化:

import matplotlib.pyplot as plt
import pandas as pd# 读取预处理后的数据
data = pd.read_csv('products.csv')# 提取商品名称和价格
product_names = data['商品名称']
product_prices = data['商品价格']# 绘制柱状图,设置颜色和透明度
plt.bar(product_names, product_prices, color='skyblue', alpha=0.8)# 添加标题和坐标轴标签,设置字体大小和颜色
plt.title('不同商品价格分布', fontsize=16, color='red')
plt.xlabel('商品名称', fontsize=14)
plt.ylabel('商品价格', fontsize=14)# 旋转x轴标签,避免重叠
plt.xticks(rotation=45)# 添加数据标签,显示每个柱子的具体数值
for i, price in enumerate(product_prices):plt.text(i, price, str(price), ha='center', va='bottom')# 显示图形
plt.show()

在这段美化后的代码中,通过color='skyblue’设置柱状图的颜色为天蓝色,alpha=0.8设置透明度为 0.8。使用fontsize参数设置标题和坐标轴标签的字体大小,color='red’设置标题颜色为红色 。通过循环使用plt.text()在每个柱子上方添加数据标签,显示具体的价格数值,ha='center’表示水平居中对齐,va='bottom’表示垂直底部对齐。这样,经过美化后的柱状图更加直观和美观,能够更好地展示数据信息。

五、总结与展望

数据可视化作为数据科学领域的关键技术,能够将抽象的数据转化为直观、易懂的图形,帮助我们更好地理解数据背后的信息。通过 Matplotlib 和 Seaborn 等工具,我们可以轻松地创建各种类型的图表,展示数据的特征、趋势和关系。

Matplotlib 作为 Python 中基础的绘图库,提供了丰富的绘图函数和高度的定制性,能够满足各种复杂的绘图需求。而 Seaborn 则在 Matplotlib 的基础上,进一步简化了绘图流程,提供了更美观的默认样式和强大的统计图表绘制功能,使数据可视化更加高效和专业。

在实际项目中,我们可以根据具体的数据特点和分析目标,选择合适的图表类型和可视化工具。通过数据可视化,我们不仅能够更清晰地展示数据,还能从中发现潜在的规律和问题,为决策提供有力的支持。

未来,随着数据量的不断增长和数据分析需求的日益复杂,数据可视化技术也将不断发展和创新。新的可视化工具和技术将不断涌现,为我们提供更多的选择和更强大的功能。同时,数据可视化也将与人工智能、机器学习等领域深度融合,实现更加智能化、自动化的数据可视化分析。

希望读者在掌握了本文介绍的内容后,能够积极地将数据可视化技术应用到实际项目中,不断探索和尝试新的可视化方法和工具,让数据可视化成为数据分析和决策的得力助手。

相关文章:

【Python爬虫(27)】探索数据可视化的魔法世界

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取&#xff…...

渲染 101 支持 3ds Max 的渲染器及其优势

在 3ds Max 创作流程里,渲染环节对最终成果的呈现效果起着决定性作用,渲染 101 云渲染平台则为 3ds Max 用户提供了全面且高效的渲染解决方案。 支持的渲染器 V-Ray 渲染器 在 3ds Max 中应用广泛,具备全局光照、光线追踪技术,…...

在 Java 中使用 `if` 语句实现双重判定

关于在 Java 中使用 if 语句实现双重判定,并使用 Eclipse 和 JUnit4 进行单元测试的详细介绍: --- ### 一、双重判定的实现 **双重判定**指在 if 语句中通过逻辑运算符组合两个条件。常用方式: - **逻辑与 &&**:两个条件…...

Ollama 安装

Ollama 支持多种操作系统,包括 macOS、Windows、Linux 以及通过 Docker 容器运行。 Ollama 对硬件要求不高,旨在让用户能够轻松地在本地运行、管理和与大型语言模型进行交互。 CPU:多核处理器(推荐 4 核或以上)。GPU…...

Docker Swarm 内置的集群编排

在现代容器化应用中,容器编排(Container Orchestration)是至关重要的,它负责自动化容器的部署、扩展、负载均衡和管理。Docker Swarm 是 Docker 提供的原生集群管理和容器编排工具,允许用户通过 Docker CLI 在多个 Doc…...

AF3 _build_query_to_hit_index_mapping函数解读

AlphaFold3 中templates模块的_build_query_to_hit_index_mapping函数是将原始查询序列(original_query_sequence)中的索引与hit 序列(hit_sequence)中的索引进行映射。 在蛋白质序列比对(如 HHsearch)中,hit 是与查询序列部分匹配的区域。由于存在缺口(-)和部分比对…...

Windows 中的启动项如何打开?管理电脑启动程序的三种方法

在日常使用电脑时,我们经常会发现一些应用程序在开机时自动启动,这不仅会拖慢系统的启动速度,还可能占用不必要的系统资源。幸运的是,通过几个简单的步骤,你可以轻松管理这些开机自启的应用程序。接下来,我…...

科普:“git“与“github“

Git与GitHub的关系可以理解为:Git是一种软件工具,而GitHub则是一个在线平台,它们是“一家子”。二者的关联最直接体现在你通过Git在GitHub仓库中clone软件包到你的机器中来。 具体来说: 一、Git 定义:Git是一个开源的…...

module ‘cv2.dnn‘ has no attribute ‘DictValue‘解决办法

module ‘cv2.dnn‘ has no attribute ‘DictValue‘解决办法 pip install opencv-python4.7.0.72 -i https://pypi.tuna.tsinghua.edu.cn/simple 测试: python -c"import cv2"...

国产编辑器EverEdit - 语法着色及嵌入式多语言着色

1 文档-着色及语法相关 1.1 应用场景 在编辑代码文件或脚本文件过程中,如果对语法着色、模式等文件进行了修改,需要立即生效时,可以通过文档-高级功能下的重新加载功能,立即生效相关配置。 1.2 使用方法 1.2.1 重新加载着色 着…...

设计模式教程:解释器模式(Interpreter Pattern)

1. 什么是解释器模式? 解释器模式(Interpreter Pattern)是一种行为型设计模式,通常用于处理语言(例如数学表达式、SQL查询等)中的语法和解释。该模式定义了一个文法,并通过解释器类来解释文法中…...

Three.js 快速入门教程【六】相机控件 OrbitControls

系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…...

【git】合并多个提交记录

1.说明 有时候因为某些小修改会导致代码多了很多不必要的提交,如果希望合并这些commit记录,我们可以使用rebase或者reset命令完成合并 2.rebase 这种方式是通过变基操作完成的,它适用于已经push到远程的情况,当我们变基好了之后…...

题海拾贝:【枚举】P2010 [NOIP 2016 普及组] 回文日期

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 1、题…...

SQL Server 链接服务器 MySQL 详细步骤

目录 前言 一、准备工作 1. 确认需求 2. 获取权限 二、安装必要的驱动程序和工具 1.下载并安装MySQL ODBC驱动&#xff1a; 2.安装 SQL Server 和 MySQL 的管理工具&#xff1a; 三、配置 SQL Server 以连接到MySQL 1.执行创建链接服务器的T-SQL语句&#xff1a; 2.配…...

Java集合框架之List接口详解

目录 一、List接口概述 二、List接口常见实现类 三、List接口特有方法: 1.元素操作 2. 查找元素位置 3. 子列表与不可变列表 四、List特有迭代器:ListIterator 1.特有的迭代方式 2.ListIterator接口中的常用方法: ⑴.void add(E e):在光标位置插入元素。(会移动…...

【大语言模型_4】源码编译vllm框架cpu版

背景&#xff1a; 通过官方提供的pip install vllm安装的vllm框架不支持cpu加载模型。因此需要本地编译。 系统环境 操作系统&#xff1a;欧拉2203 python版本&#xff1a;3.10 编译步骤 一、安装gcc/g/cmake 1、下载源码&#xff1a;https://github.com/vllm-project/vllm 安…...

城市地质安全专题连载⑦ | 加强国土空间规划管控,规避城市地质安全风险

作者 | 徐海洋 在国土空间规划中&#xff0c;地质调查扮演着先导性和基础性的角色。它如同一把无形的尺子&#xff0c;衡量着每一寸土地的开发潜力与安全边界&#xff0c;不仅为城市规划提供了科学依据&#xff0c;还在规避地质安全风险、优化资源配置方面发挥着关键作用。然而…...

Go入门之函数

func subn1(x, y int) int {sub : x - yreturn sub } 函数参数简写&#xff0c;可以省略前边的&#xff0c;和后边的类型一样 func addn1(x ...int) int {sum : 0for _, v : range x {sum v}return sum } 求可变参数的核&#xff0c;表示传参的个数不确定 func addn1(x int…...

前端如何把SEO优化做到极致✅

在前端&#x1f680;如何把SEO优化做到极致✅ SEO 是 Search Engine Optimization 的缩写&#xff0c;即搜索引擎优化。它是一种通过调整网站的内容、结构、外部链接等方面的优化手段&#xff0c;来提高网站在搜索引擎中的自然排名&#xff0c;以求得获得更多的流量&#xff0…...

【Linux】多线程 -> 线程同步与基于BlockingQueue的生产者消费者模型

线程同步 条件变量 当一个线程互斥地访问某个变量时&#xff0c;它可能发现在其它线程改变状态之前&#xff0c;它什么也做不了。 例如&#xff1a;一个线程访问队列时&#xff0c;发现队列为空&#xff0c;它只能等待&#xff0c;直到其它线程将一个节点添加到队列中。这…...

Openssl交叉编译

在 OpenSSL 交叉编译中&#xff0c;linux-aarch64是一个用于指定目标平台的配置选项&#xff0c;表示目标是 X86 架构的 64位系统。这个选项可以从 OpenSSL 的 ./Configure 命令支持的平台列表中获取。 你可以通过运行以下命令查看 OpenSSL 支持的所有平台配置选项&#xff1a…...

基于Ubuntu系统的docker环境对MySQL8.0.36主从部署

1. 环境准备 1、1 前言 本文基于Ubuntu系统的docker环境对MySQL8.0.36进行2台物理服务器的主从部署。1.2 服务器硬件环境准备 准备2台物理服务器192.168.8.6 和 192.168.8.9。 2台物理服务器在同一个局域网环境下,可以相互网络通信。 服务器操作系统版本:Ubuntu 24.04.1 L…...

吃一堑长一智

工作中经历&#xff0c;有感触记录下 故事一 以前在一家公司时&#xff0c;自己是一名开发人员&#xff0c;遇到问题请教领导解决方案&#xff0c;当时领导给了建议&#xff0c;后来上线后出问题了&#xff0c;背了锅。心里想的是领导说这样做的呀&#xff0c;为什么出问题还…...

详解Nginx 配置

一、Nginx 介绍 Nginx 是一款轻量级的 Web 服务器 / 反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。它由俄罗斯的程序设计师 Igor Sysoev 所开发&#xff0c;自 2004 年发布以来&#xff0c;凭借其高性能、低内存消耗、高并发处理能力等特点&#xf…...

《深度揭秘:DeepSeek如何解锁自然语言处理密码》

在人工智能蓬勃发展的当下&#xff0c;自然语言处理&#xff08;NLP&#xff09;成为了连接人类与机器的关键桥梁。作为该领域的佼佼者&#xff0c;DeepSeek以其卓越的语义理解和生成能力&#xff0c;备受瞩目。今天&#xff0c;就让我们深入探寻DeepSeek在自然语言处理中实现语…...

备战蓝桥杯 -牛客

习题-[NOIP2006]明明的随机数 1046-习题-[NOIP2006]明明的随机数_2021秋季算法入门班第一章习题&#xff1a;模拟、枚举、贪心 思路&#xff1a;这道题用stl的set&#xff0c;今天写这道题复习了一下set的用法&#xff1a; s.find(a) s.end()的意思是判断元素a是否存在于集…...

Pandas:从一个DataFrame中直接索引赋值到另一个索引位置出错的Bug及其解决方案

这里写自定义目录标题 动机代码1&#xff0c;这个代码是有问题的代码2&#xff0c;这个代码是我调试代码。拆分代码&#xff0c;最后找到问题所在&#xff0c;这个代码是正确的代码3。本以为找到问题所在之后&#xff0c;又稍微修改了下代码 2&#xff0c;这个代码还是没问题的…...

电脑想安装 Windows 11 需要开启 TPM 2.0 怎么办?

尽管 TPM 2.0 已经内置在许多新电脑中&#xff0c;但很多人并不知道如何激活这一功能&#xff0c;甚至完全忽略了它的存在。其实&#xff0c;只需简单的几步操作&#xff0c;你就能开启这项强大的安全特性&#xff0c;为你的数字生活增添一层坚固的防护屏障。无论你是普通用户还…...

请谈谈 Vue 中的响应式原理,如何实现?

一、Vue2响应式原理&#xff1a;Object.defineProperty的利与弊 实现原理&#xff1a; // 数据劫持核心实现 function defineReactive(obj, key, val) {const dep new Dep(); // 依赖收集容器Object.defineProperty(obj, key, {get() {if (Dep.target) { // 当前Watcher实例…...

深入解析浏览器渲染全流程:从URL输入到页面渲染的底层原理与性能优化(附实战代码)

本文以https://example.com为例&#xff0c;逐层剖析浏览器从输入URL到页面渲染的完整链路&#xff0c;涵盖DNS解析、TCP/TLS握手、HTTP请求、DOM/CSSOM构建等核心阶段&#xff0c;结合代码示例与性能调优技巧&#xff0c;助你掌握浏览器底层运行机制。 一、导航阶段&#xff1…...

vue 识别 <think></think>

在 Vue.js 中处理自定义标签或者在 HTML 中嵌入特定标记&#xff08;例如 &#xff09;通常涉及到两个方面&#xff1a;模板语法和组件化。 模板语法 Vue 使用基于 HTML 的模板语法来声明式地将 DOM 绑定至底层数据。默认情况下&#xff0c;Vue 会忽略未知元素&#xff0c;除非…...

Three.js 快速入门教程【一】开启你的 3D Web 开发之旅

系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…...

ubuntu 执行 sudo apt-get update 报错

记录一下&#xff0c;遇到这个问题了&#xff0c;网络上看到的解决办法&#xff0c;亲测有效 执行sudo apt-get update ,却报以下错误&#xff0c;“SECURITY: URL redirect target contains control characters rejecting ” 经检查发现&#xff0c;/etc/apt/source.list 下的…...

YOLOv11-ultralytics-8.3.67部分代码阅读笔记-loaders.py

loaders.py ultralytics\data\loaders.py 目录 loaders.py 1.所需的库和模块 2.class SourceTypes: 3.class LoadStreams: 4.class LoadScreenshots: 5.class LoadImagesAndVideos: 6.class LoadPilAndNumpy: 7.class LoadTensor: 8.def autocast_list(source…...

ubuntu24基于虚拟机无法从主机拖拽文件夹

以下是解决问题的精简步骤&#xff1a; 安装 open-vm-tools-desktop&#xff1a; bash复制 sudo apt-get install open-vm-tools-desktop 重启虚拟机后&#xff0c;文字复制粘贴功能可正常工作。 禁用 Wayland&#xff1a; 编辑 /etc/gdm3/custom.conf 文件&#xff1a; bash复…...

二叉树(数据结构)

二叉树 二叉树也是用过递归定义的结构 先序遍历又称前序遍历 ​​ ​​ 按照先序遍历的方法去手算处理这个二叉树 ​​ 先A B C 再 A B D E C&#xff08;也就是把B换成BDE再放进去&#xff09; 再 A B D E C F 看这个插入的方法要掌握像二叉树这样向一个…...

Vue 实现通过URL浏览器本地下载 PDF 和 图片

1、代码实现如下&#xff1a; 根据自己场景判断 PDF 和 图片&#xff0c;下载功能可按下面代码逻辑执行 const downloadFile async (item: any) > {try {let blobUrl: any;// PDF本地下载if (item.format pdf) {const response await fetch(item.url); // URL传递进入i…...

MySQL版本选择与安装

MySQL版本选择与安装 MySQL 5.5 优点: 稳定性&#xff1a;5.5版本是长期支持&#xff08;LTS&#xff09;版本&#xff0c;因此它非常稳定&#xff0c;被广泛部署在生产环境中。 兼容性&#xff1a;与旧版本的MySQL和各种应用程序有很好的兼容性。 缺点: 过时&#xff1a;…...

Python网络爬虫技术详解文档

Python网络爬虫技术详解文档 目录 网络爬虫概述爬虫核心技术解析常用Python爬虫库实战案例演示反爬虫机制与应对策略爬虫法律与道德规范高级爬虫技术资源推荐与学习路径1. 网络爬虫概述 1.1 什么是网络爬虫 网络爬虫(Web Crawler)是一种按特定规则自动抓取互联网信息的程序…...

STM32 CubeMx配置串口收发使用DMA并调用Idle模式(二)

本篇主要结合代码落实&#xff0c;之前串口已经配置好的DMA方式。 一、首先我们把串口看成一个对象&#xff0c;它有属性、私有数据和方法&#xff1b; 每个串口都有名字属性&#xff1b;有初始化、发送、接收方法&#xff1b;还有一个私有数据&#xff08;这个私有数据是每个…...

现代游戏UI架构深度解析——以UIController为核心的模块化界面管理系统

一、架构全景与设计哲学 本文将以重构后的UIController为核心&#xff0c;深入探讨Unity引擎下的高效UI管理方案。该体系采用"分层-分治"设计理念&#xff0c;通过界面生命周期管理、动态适配策略、资源优化机制三个维度的协同工作&#xff0c;构建了适应复杂交互需…...

DeepSeek 助力 Vue 开发:打造丝滑的点击动画(Click Animations)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

**ARM Cortex-M4** 和 **ARM Cortex-M7* 运行freeRTOS

**是的&#xff0c;Cortex-M4 和 Cortex-M7 都可以运行 FreeRTOS**。FreeRTOS 是一个轻量级的实时操作系统&#xff08;RTOS&#xff09;&#xff0c;专为嵌入式系统设计&#xff0c;支持多种硬件架构&#xff0c;包括 ARM Cortex-M 系列&#xff08;如 Cortex-M0、M3、M4、M7 …...

### net7 + 出现了 自带的 限流中间件 固定窗口、滑动窗口 并发 令牌桶 全局限流器

资料 限流的方法 速率限制算法 固定窗口算法 是最简单的算法之一。它将请求限制为一个固定的时间窗口&#xff0c;该窗口在任何时间点都只允许固定数量的请求。 滑动窗口算法 是固定窗口算法的改进版本&#xff0c;它将请求限制为一个可变的窗口&#xff0c;该窗口在任何时间…...

【Python】迭代器与生成器详解,附代码(可迭代对象、定义、实现方式、区别、使用场景)

文章目录 1. 可迭代对象1.1 常见的可迭代对象1.2 迭代器和生成器 2. 迭代器2.1 定义2.2 原理2.3 特点2.4 示例2.4.1 for语句进行遍历2.4.2 next() 函数进行遍历2.4.3 自定义迭代器 2.5 内置迭代器 3. 生成器3.1 定义3.2 创建方式3.2.1 生成器表达式3.2.2 生成器函数 3.3 特点 4…...

05.Docker 容器命令

Docker 容器命令 Docker 容器命令1. 启动容器用法2. 显示当前存在容器3. 查看容器内的进程4. 查看容器资源使用情况5. 查看容器的详细信息6. 删除容器7. 容器的启动和停止8. 给正在运行的容器发信号9. 进入正在运行的容器10. 暴露所有容器端口11. 指定端口映射12. 查看容器的日…...

猿大师办公助手对比其他WebOffice在线编辑Office插件有什么优势

1. 原生Office功能完整嵌入&#xff0c;排版一致性保障 猿大师办公助手直接调用本地安装的微软Office、金山WPS或永中Office&#xff0c;支持所有原生功能&#xff08;如复杂公式、VBA宏等&#xff09;&#xff0c;确保网页编辑与本地打开的文档排版完全一致。 提供OLE嵌入和完…...

Ubuntu搭建RTSP服务器

下载 http://www.live555.com/liveMedia/public/ 安装ffmpeg sudo apt install -y ffmpeg 转换文件&#xff08;必须&#xff01;&#xff09; ffmpeg -i test.mp4 -codec copy -bsf: h264_mp4toannexb -f h264 test.264编译 ./genMakefiles linux-64bit make 启动服务器…...

视觉分析之边缘检测算法

9.1 Roberts算子 Roberts算子又称为交叉微分算法&#xff0c;是基于交叉差分的梯度算法&#xff0c;通过局部差分计算检测边缘线条。 常用来处理具有陡峭的低噪声图像&#xff0c;当图像边缘接近于正45度或负45度时&#xff0c;该算法处理效果更理想。 其缺点是对边缘的定位…...