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

Python 之 Pandas merge() 函数、set_index() 函数、drop_duplicates() 函数和 tolist() 函数

文章目录

  • 一、merge() 函数
    • 1. inner
    • 2. left 和 right
    • 3. outer
  • 二、set_index() 函数
  • 三、drop_duplicates() 函数
  • 四、tolist() 函数
  • 五、视频数据分析案例
    • 1. 问题要求
    • 2. 解决过程

  • 在最开始,我们先导入常规的 numpy 和 pandas 库。
import numpy as np
import pandas as pd
  • 为了方便维护,数据在数据库内都是分表存储的,比如用一个表存储所有用户的基本信息,一个表存储用户的消费情况。
  • 所以,在日常的数据处理中,经常需要将两张表拼接起来使用,这样的操作对应到 SQL 中是 join,在 Pandas 中则是用 merge 来实现。这篇文章就讲一下 merge 的主要原理。
  • 上面的引入部分说到 merge 是用来拼接两张表的,那么拼接时自然就需要将用户信息一一对应地进行拼接,所以进行拼接的两张表需要有一个共同的识别用户的键(key)。
  • 总结来说,整个 merge 的过程就是将信息一一对应匹配的过程,下面介绍 merge 的四种类型,分别为 inner、left、right 和 outer。

一、merge() 函数

  • merge() 函数的语法格式如下:
pd.merge(left,right,how: str = 'inner',on=None,left_on=None,right_on=None,left_index: bool = False,
right_index: bool = False,sort: bool = False,suffixes=('_x', '_y'),copy: bool = True,indicator: bool = False,validate=None,)
  • merge() 函数的参数含义如下:
  • left/right 表示两个不同的 DataFrame 对象。
  • how 表示要执行的合并类型,从 {‘left’, ‘right’, ‘outer’, ‘inner’} 中取值,默认为 inner 内连接。
  • on 表示指定用于连接的键(即列标签的名字),该键必须同时存在于左右两个 DataFrame 中,如果没有指定,并且其他参数也未指定,那么将会以两个 DataFrame 的列名交集做为连接键。
  • left_on 表示指定左侧 DataFrame 中作连接键的列名。该参数在左、右列标签名不相同,但表达的含义相同时非常有用。
  • right_on 表示指定左侧 DataFrame 中作连接键的列名。
  • left_index 为布尔参数,默认为 False。如果为 True 则使用左侧 DataFrame 的行索引作为连接键。
  • right_index 为布尔参数,默认为 False。如果为 True 则使用左侧 DataFrame 的行索引作为连接键。
  • sort 为布尔参数,默认为 False,则按照 how 给定的参数值进行排序。设置为 True,它会将合并后的数据进行排序。
  • suffixes 表示字符串组成的元组。当左右 DataFrame 存在相同列名时,通过该参数可以在相同的列名后附加后缀名,默认为 (‘x’,‘y’)。
  • copy 默认为 True,表示对数据进行复制。
  • 这里需要注意的是,Pandas 库的 merge() 支持各种内外连接,与其相似的还有 join() 函数(默认为左连接)。

1. inner

  • merge() 的 inner 的类型称为内连接,它在拼接的过程中会取两张表的键(key)的交集进行拼接。
  • 下面以图解的方式来一步一步拆解。

在这里插入图片描述

  • 首先我们有以下的数据,左侧和右侧的数据分别代表了用户的基础信息和消费信息,连接两张表的键是 userid。
  • 例如,我们先生成 df_1 的初始数据。
df_1 = pd.DataFrame({"userid":['a', 'b', 'c', 'd'], "age":[23, 46, 32, 19]})
df_1 
#  userid age
#0	a	  23
#1	b	  46
#2	c	  32
#3	d	  19
  • 我们再生成与 df_1 相连接的数据 df_2。
df_2 = pd.DataFrame({"userid":['a', 'c'],"payment":[2000, 3500]})
df_2
#userid	payment
#0	a	2000
#1	c	3500
  • 使用 merge() 函数对 df_1 和 df_2 进行拼接。由于 df_2 中只有 a 和 c 的参数,因此,合并之后只有 a 和 c。
df_1.merge(df_2,on='userid')
#userid	age	payment
#0	a	23	2000
#1	c	32	3500
  • 还有另一种写法。
pd.merge(df_1, df_2, on='userid')
#userid	age	payment
#0	a	23	2000
#1	c	32	3500
  • 对于上述过程,我们可以采用如下图片进行解释。
  • (1) 取两张表的键的交集,这里 df_1 和 df_2 的 userid 的交集是 {a,c}。

在这里插入图片描述

  • (2) 对应匹配。

在这里插入图片描述

  • (3) 结果。

在这里插入图片描述

  • 相信整个过程并不难理解,上面演示的是同一个键下,两个表对应只有一条数据的情况(一个用户对应一条消费记录)。
  • 那么,如果一个用户对应了多条消费记录的话,那又是怎么拼接的呢?
  • 假设现在的数据变成了下面这个样子,在 df_2 中,有两条和 a 对应的数据:
  • 我们同样用 inner 的方式进行 merge:
df_1 = pd.DataFrame({"userid":['a', 'b', 'c', 'd'], "age":[23, 46, 32, 19]})​
df_2 = pd.DataFrame({"userid":['a', 'c','a', 'd'],"payment":[2000, 3500, 500, 1000]})
pd.merge(df_1, df_2, on="userid")
#userid	age	payment
#0	a	23	2000
#1	a	23	500
#2	c	32	3500
#3	d	19	1000
  • 整个过程除了对应匹配阶段,其他和上面基本都是一致的。

2. left 和 right

  • left 和 right 的 merge 方式其实是类似的,分别被称为左连接和右连接。这两种方法是可以互相转换的,所以在这里放在一起介绍。
  • left 在 merge 时,以左边表格的键为基准进行配对,如果左边表格中的键在右边不存在,则用缺失值 NaN 填充。
  • right 在 merge 时,以右边表格的键为基准进行配对,如果右边表格中的键在左边不存在,则用缺失值 NaN 填充。
  • 这是什么意思呢?我们用一个例子来具体解释一下,这是演示的数据。

在这里插入图片描述

  • 现在用 left 的方式进行 merge。
df_1 = pd.DataFrame({"userid":['a', 'b', 'c', 'd'], "age":[23, 46, 32, 19]})
​df_2 = pd.DataFrame({"userid":['a', 'c','e'],"payment":[2000, 3500, 600]})
pd.merge(df_1, df_2,how='left', on="userid")
#userid	age	payment
#0	a	23	2000.0
#1	b	46	NaN
#2	c	32	3500.0
#3	d	19	NaN
  • 其过程可用如下图片进行解释。
  • (1) 以左边表格的所有键为基准进行配对。图中,因为右表中的e不在左表中,故不会进行配对。

在这里插入图片描述

  • (2) 若右表中的 payment 列合并到左表中,对于没有匹配值的用缺失值 NaN 填充。

在这里插入图片描述

  • 对于 right 类型的 merge 和 left 其实是差不多的,只要把两个表格的位置调换一下,两种方式返回的结果就是一样的,如下:
pd.merge(df_1, df_2,how='right', on="userid")
#userid	age	payment
#0	a	23.0	2000
#1	c	32.0	3500
#2	e	NaN	600

3. outer

  • outer 是外连接,在拼接的过程中它会取两张表的键(key)的并集进行拼接。看文字不够直观,还是上例子吧!
  • 还是使用上方用过的演示数据

在这里插入图片描述

pd.merge(df_1, df_2,how='outer',on='userid')
#userid	age	payment
#0	a	23.0	2000.0
#1	b	46.0	NaN
#2	c	32.0	3500.0
#3	d	19.0	NaN
#4	e	NaN	600.0
  • 其过程可用如下图片进行解释。
  • 取两张表键的并集,这里是 {a,b,c,d,e}。

在这里插入图片描述

二、set_index() 函数

  • 专门用来将某一列设置为 index 的方法。
  • 其语法模板如下:
DataFrame.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)
  • 其参数含义如下:
  • keys 表示要设置为索引的列名(如有多个应放在一个列表里)。
  • drop 表示将设置为索引的列删除,默认为 True。
  • append 表示是否将新的索引追加到原索引后(即是否保留原索引),默认为 False。
  • inplace 表示是否在原 DataFrame 上修改,默认为 False。
  • verify_integrity 表示是否检查索引有无重复,默认为 False。
  • 首先,我们生成初始数据。
df = pd.DataFrame({'month': [1, 4, 7, 10],'year': [2012, 2014, 2013, 2014],'sale': [55, 40, 84, 31]})
df
#	month	year	sale
#0	1	2012	55
#1	4	2014	40
#2	7	2013	84
#3	10	2014	31
  • 我们将索引设置为 month 列:
df.set_index('month')year	sale
month		
#1	2012	55
#4	2014	40
#7	2013	84
#10	2014	31
  • 我们将 month 列设置为 index 之后,并保留原来的列。
df.set_index('month',drop=False)
#   month	year	sale
#month			
#1	1	2012	55
#4	4	2014	40
#7	7	2013	84
#10	10	2014	31
  • 我们保留原来的 index 列。
df.set_index('month', append=True)
df.loc[0]
#month       1
#year     2012
#sale       55
#Name: 0, dtype: int64
  • 我们使用 inplace 参数取代原来的对象。
df.set_index('month', inplace=True)
df
#	year	sale
#month		
#1	2012	55
#4	2014	40
#7	2013	84
#10	2014	31
  • 我们通过新建 Series 并将其设置为 index。
df.set_index(pd.Series(range(4)))
#year	sale
#0	2012	55
#1	2014	40
#2	2013	84
#3	2014	31

三、drop_duplicates() 函数

  • 去重通过字面意思不难理解,就是删除重复的数据。
  • 在一个数据集中,找出重复的数据删并将其删除,最终只保存一个唯一存在的数据项,这就是数据去重的整个过程。
  • 删除重复数据是数据分析中经常会遇到的一个问题。通过数据去重,不仅可以节省内存空间,提高写入性能,还可以提升数据集的精确度,使得数据集不受重复数据的影响。
  • Panda DataFrame 对象提供了一个数据去重的函数 drop_duplicates()。
  • 其语法模板如下:
DataFrame.drop_duplicates(subset=None, keep='first', inplace=False, ignore_index=False)
  • 其部分参数含义如下:
  • subset 表示要进去重的列名,默认为 None。
  • keep 有三个可选参数,分别是 first、last、False,默认为 first,表示只保留第一次出现的重复项,删除其余重复项,last 表示只保留最后一次出现的重复项,False 则表示删除所有重复项。
  • inplace 为布尔值参数,默认为 False 表示删除重复项后返回一个副本,若为 Ture 则表示直接在原数据上删除重复项。
  • 我们先生成初始数据,用以后续的观察操作。
df = pd.DataFrame({'brand': ['Yum Yum', 'Yum Yum', 'Indomie', 'Indomie', 'Indomie'],'style': ['cup', 'cup', 'cup', 'pack', 'pack'],'rating': [4, 4, 3.5, 15, 5]})
df
#brand	style	rating
#0	Yum Yum	cup	4.0
#1	Yum Yum	cup	4.0
32	Indomie	cup	3.5
#3	Indomie	pack	15.0
#4	Indomie	pack	5.0
  • 在默认情况下,它会基于所有列删除重复的行。
df.drop_duplicates()
#brand	style	rating
#0	Yum Yum	cup	4.0
#2	Indomie	cup	3.5
#3	Indomie	pack	15.0
#4	Indomie	pack	5.0
  • 我们删除特定列上的重复项,使用子集。
df.drop_duplicates(subset=['brand'])
#brand	style	rating
#0	Yum Yum	cup	4.0
#2	Indomie	cup	3.5
  • 我们删除重复项并保留最后出现的项,使用保留。
df.drop_duplicates(subset=['brand', 'style'], keep='last')
#brand	style	rating
#1	Yum Yum	cup	4.0
#2	Indomie	cup	3.5
#4	Indomie	pack	5.0

四、tolist() 函数

  • pandas 的 tolist() 函数用于将一个系列或数据帧中的列转换为列表。
  • 首先,我们查看 df 中的 索引取值,他的起始值是 0,终止值是 1,步长是 1。
df.index
#RangeIndex(start=0, stop=5, step=1)
  • 我们使用 tolist() 函数将其转化为列表。
df.index.tolist()
#[0, 1, 2, 3, 4]

五、视频数据分析案例

1. 问题要求

  • 问题 1:分析出不同导演电影的好评率,并筛选出 TOP20。
  • 要求:
  • (1) 计算统计出不同导演的好评率。
  • (2) 通过多系列柱状图,做图表可视化。
  • 提示:
  • (1) 好评率 = 好评数 / 评分人数。
  • (2) 可自己设定图表风格。
  • 问题 2: 统计分析 2001-2016 年每年评影人数总量,求出不同剧的评分人数、好评数总和。

2. 解决过程

  • 首先,我们导入 numpy 和 pandas 库,由于要进行图表可视化,因此,我们再导入 matplotlib 库。
import numpy as np 
import pandas as pd
from matplotlib import pyplot as plt
  • 然后,进行文件的读取,并查看文件的信息。
data = pd.read_csv('爱奇艺视频数据.csv',encoding="gbk")
data.info()
#<class 'pandas.core.frame.DataFrame'>
#RangeIndex: 99999 entries, 0 to 99998
#Data columns (total 24 columns):
# #   Column  Non-Null Count  Dtype  
#---  ------  --------------  -----  
# 0   数据获取日期  99999 non-null  object 
# 1   演员      97981 non-null  object 
# 2   视频ID    99999 non-null  object 
# 3   详细链接    99998 non-null  object 
# 4   剧名      99999 non-null  object 
# 5   状态      99158 non-null  object 
# 6   类型      99999 non-null  object 
# 7   来源平台    99999 non-null  object 
# 8   整理后剧名   99999 non-null  object 
# 9   更新时间    644 non-null    object 
# 10  上映时间    78755 non-null  float64
# 11  语言      85926 non-null  object 
# 12  评分      99970 non-null  float64
# 13  地区      98728 non-null  object 
# 14  上映年份    78755 non-null  float64
# 15  简介      99970 non-null  object 
# 16  导演      97614 non-null  object 
# 17  差评数     99970 non-null  float64
# 18  评分人数    99970 non-null  float64
# 19  播放量     99453 non-null  float64
# 20  更新至     1272 non-null   float64
# 21  总集数     98871 non-null  float64
# 22  第几季     99999 non-null  int64  
# 23  好评数     99970 non-null  float64
#dtypes: float64(9), int64(1), object(14)
#memory usage: 18.3+ MB
  • pandas 读取 csv 文件默认是按块读取的,即不一次性全部读取。
  • 另外 pandas 对数据的类型是完全靠猜的,所以 pandas 每读取一块数据就对 csv 字段的数据类型进行猜一次,所以有可能 pandas在读取不同块时对同一字段的数据类型猜测结果不一致。
  • low_memory=False 参数设置后,pandas 会一次性读取 csv 中的所有数据,然后对字段的数据类型进行唯一的一次猜测。这样就不会导致同一字段的 Mixed types 问题了。
  • 但是这种方式真的非常不好,一旦 csv 文件过大,就会内存溢出;所以推荐用第 1 中解决方案。
  • (1) 设置 read_csv 的 dtype 参数,指定字段的数据类型。
pd.read_csv(sio, dtype={"user_id": int, "username": object})
  • (2) 设置 read_csv的low_memory 参数为 False。
pd.read_csv(sio, low_memory=False})
  • 我们可以查看前几条数据。
data.head(3)
  • 读取数据的列标签。
data.columns
#Index(['数据获取日期', '演员', '视频ID', '详细链接', '剧名', '状态', '类型', '来源平台', '整理#后剧名',
#       '更新时间', '上映时间', '语言', '评分', '地区', '上映年份', '简介', '导演', '差评数', #'评分人数',
#       '播放量', '更新至', '总集数', '第几季', '好评数'],
#      dtype='object')
  • 我们计算统计出不同导演的好评率。
data.groupby('导演')[['好评数','评分人数']].sum()
#好评数	评分人数
#导演		
#Exact	375172.0	458543.0
#John Fawcett Steve Dimarco Paul Fox	1477942.0	1729878.0
#Michael Cuesta	527348.0	604104.0
#Michael Dinner	1032245.0	1312847.0
#Michael Engler	47804.0	61844.0
#...	...	...
#龚朝	4634.0	8620.0
#龚朝/杨巧文/王伟仁	676160.0	964912.0
#龚朝晖	4044245.0	5941895.0
#龚艺群	194079.0	290358.0
#龚若飞	29126.0	43151.0
#1196 rows × 2 columns
  • 新增好评率。
df_q1 = data.groupby('导演').sum()[['好评数','评分人数']]
df_q1['好评率'] = df_q1['好评数']/df_q1['评分人数']
df_q1
#好评数	评分人数	好评率
#导演			
#Exact	375172.0	458543.0	0.818183
#John Fawcett Steve Dimarco Paul Fox	1477942.0	1729878.0	0.854362
#Michael Cuesta	527348.0	604104.0	0.872942
#Michael Dinner	1032245.0	1312847.0	0.786265
#Michael Engler	47804.0	61844.0	0.772977
#...	...	...	...
#龚朝	4634.0	8620.0	0.537587
#龚朝/杨巧文/王伟仁	676160.0	964912.0	0.700748
#龚朝晖	4044245.0	5941895.0	0.680632
#龚艺群	194079.0	290358.0	0.668413
#龚若飞	29126.0	43151.0	0.674979
#1196 rows × 3 columns
  • 我们筛选出 TOP20。
result_q1 = df_q1.sort_values('好评率',ascending=False)[:20]
result_q1
  • 由于要画图,对图的一些属性进行设置。
# 设置中文:
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
# 中文负号
plt.rcParams['axes.unicode_minus'] = False# 设置分别率 为100
plt.rcParams['figure.dpi'] = 100
# 设置大小
plt.rcParams['figure.figsize'] = (10,3)
# 绘制图形
plt.bar(result_q1.index,result_q1['好评率'])
# 设置y轴范围
plt.ylim(0.98,1)
# 设置x轴文字倾斜
plt.xticks(rotation=70)
# 设置网格
plt.grid(True, linestyle='--')

在这里插入图片描述

  • 绘制柱状图。
result_q1['好评率'].plot(kind='bar',color = 'b',width = 0.8,alpha = 0.4,rot = 45,grid = True,ylim = [0.98,1],figsize = (12,4),title = '不同导演电影的好评率')

在这里插入图片描述

  • 至此,我们的问题一就得到了解决,下面进行问题二的计算。
  • 我们取出大于 2000 年的数据,并绘制面积图。
movie_year = data.groupby('上映年份')[['评分人数']].sum()
movie_year_2000 = movie_year.loc[2000:]
plt.stackplot(movie_year_2000.index,movie_year_2000['评分人数'])

在这里插入图片描述

  • 然后,我们求出不同剧的评分人数、好评数总和,好评数前 20 绘图。
movie_title_group = data.groupby('整理后剧名')[['评分人数','好评数']].sum()
result_title = movie_title_group.sort_values('好评数',ascending=False)[:20]
result_title
  • 并绘制柱状图。
result_title['好评数'].plot(kind='bar',color = 'b',width = 0.8,alpha = 0.4,rot = 45,grid = True,ylim = [1.3e+08,1.1e+09],figsize = (12,4),title = '不同剧的好评数')

在这里插入图片描述

相关文章:

Python 之 Pandas merge() 函数、set_index() 函数、drop_duplicates() 函数和 tolist() 函数

文章目录一、merge() 函数1. inner2. left 和 right3. outer二、set_index() 函数三、drop_duplicates() 函数四、tolist() 函数五、视频数据分析案例1. 问题要求2. 解决过程在最开始&#xff0c;我们先导入常规的 numpy 和 pandas 库。 import numpy as np import pandas as …...

MySQL实战之深入浅出索引(下)

1.前言 在上一篇文章中&#xff0c;我们介绍了InnoDB索引的数据结构模型&#xff0c;今天我们再继续聊一下跟MySQL索引有关的概念。 在介绍之前&#xff0c;我们先看一个问题&#xff1a; 表初始化语句 mysql> create table T ( ID int primary key, k int NOT NULL DEFA…...

(二分查找)leetcode1539. 第 k 个缺失的正整数

文章目录一、题目1、题目描述2、基础框架3、原题链接二、解题报告1、思路分析2、时间复杂度3、代码详解三、本题小知识一、题目 1、题目描述 给你一个 严格升序排列 的正整数数组 arr 和一个整数 k 。 请你找到这个数组里第 k 个缺失的正整数。 示例 1&#xff1a; 输入&…...

yaml文件格式详解及实例

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; 文章目录yaml简介yaml语法规则Yaml语法实例数组…...

AOP在PowerJob中的使用,缓存锁保证并发安全,知识细节全总结

这是一篇简简单单的文章&#xff0c;需要你简简单单看一眼就好&#xff0c;如果有不明白的地方&#xff0c;欢迎留言讨论。 在之前的文章中出现过一次AOP的使用&#xff0c;就是在运行任务之前&#xff0c;需要判断一下&#xff0c;触发该任务执行的server&#xff0c;是不是数…...

对账平台设计

背景 随着公司业务的蓬勃发展&#xff0c;交易履约清结算业务的复杂性也在不断的增高&#xff0c;资金以及各种数据的一致性和准确性也变得越发重要。 以交易链路为例&#xff0c;存在着如下一些潜在的不一致场景&#xff1a; 订单支付成功了&#xff0c;但是订单状态却还是“…...

JavaEE进阶第五课:SpringBoot的创建和使用

上篇文章介绍了Bean 作用域和生命周期&#xff0c;这篇文章我们将会介绍SpringBoot的创建和使用 目录1.为什么要学习StringBoot1.1什么是SpringBoot1.2SpringBoot的优点2.如何用Idea创建SpringBoot项目3.项目目录介绍和运行3.1输入Helloworld结尾1.为什么要学习StringBoot 在前…...

我带过的一名C++实习生——Z同学

刚开始带Z同学&#xff0c;吃饭聊天时&#xff0c;我顺便了解了下他的擅长&#xff1a;linux平台下C、C网络编程。 接下来的实习&#xff0c;主要分为两个阶段&#xff1a;小组公共培训和项目实训。 小组公共培训为期2周&#xff0c;主要学习和了解公司文化制度&#xff0c;讲师…...

面试题13. 机器人的运动范围

面试题13. 机器人的运动范围 难度&#xff1a;middle\color{orange}{middle}middle 题目描述 地上有一个 mmm 行 nnn 列的方格&#xff0c;从坐标 [0,0][0,0][0,0] 到坐标 [m−1,n−1][m-1,n-1][m−1,n−1] 。一个机器人从坐标 [0,0][0, 0][0,0] 的格子开始移动&#xff0c;它…...

LeetCode189_189. 轮转数组

LeetCode189_189. 轮转数组 一、描述 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,…...

java Files和Paths的使用详解 附有使用demo

前言 Java Files和Paths是Java 7中引入的新API&#xff0c;用于处理文件和目录。Files类提供了许多有用的静态方法来操作文件和目录&#xff0c;而Path类则表示文件系统中的路径。 创建文件和目录 在Java中创建文件和目录非常简单。我们可以使用Files类的createFile()方法和…...

如何使用ApacheTomcatScanner扫描Apache Tomcat服务器漏洞

关于ApacheTomcatScanner ApacheTomcatScanner是一个功能强大的Python脚本&#xff0c;该脚本主要针对Apache Tomcat服务器安全而设计&#xff0c;可以帮助广大研究人员轻松扫描和检测Apache Tomcat服务器中的安全漏洞。 功能介绍 1、支持使用多线程Worker搜索Apache Tomcat服…...

js中的定时器 setTimeout()和setInterval()

JavaScript 定时器&#xff0c;有时也称为“计时器”&#xff0c;用来在经过指定的时间后执行某些任务&#xff0c;类似于我们生活中的闹钟。 在 JavaScript 中&#xff0c;我们可以利用定时器来延迟执行某些代码&#xff0c;或者以固定的时间间隔重复执行某些代码。例如&…...

【吃透Js】深入学习浅拷贝和深拷贝

一、JavaScript数据类型原始类型对象类型二、原始类型和对象类型的区别1.原始类型2.引用类型3.复制4.比较5.值传递三、浅拷贝概念实现方法四、深拷贝概念五、浅拷贝、深拷贝和赋值的区别浅拷贝和赋值六、小结想要真正搞明白深浅拷贝&#xff0c;你必须要熟练掌握赋值、对象在内…...

AUTOSAR为啥要开发新的社区商业模式?

总目录链接>> AutoSAR入门和实战系列总目录 文章目录1 自适应平台架构中的集群更新1.1 ara::diag 服务&#xff08;诊断&#xff09;更新1.2 信号到服务映射和自动驾驶接口让我们讨论一下信号到服务映射服务:Automated Driving Interface:2 车载应用商店概念本文介绍Re…...

数据结构和算法面试常见题必考以及前端面试题

1.数据结构和算法 1.1 反转单向链表 public class Node {public int value;public Node next; }public Node reverseList(Node head) {Node pre null;Node next null;while (head ! null) {next head.next;head.next pre;pre head;head head.next}return pre; }1.2 在顺…...

一文解决Python所有报错

前言 Python是一种强大的编程语言&#xff0c;但是它也有一些报错&#xff0c;这些报错可能会让你感到困惑。本文将介绍如何解决Python中的常见报错。 首先&#xff0c;让我们来看看Python中最常见的报错&#xff1a;SyntaxError。这种报错表明你的代码中有语法错误&#xff0c…...

LeetCode 1237. Find Positive Integer Solution for a Given Equation【双指针,二分,交互】

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

【C语言】结构体进阶

一、结构体 1. 结构体的声明 &#xff08;1&#xff09; 结构的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。&#xff08;2&#xff09;结构的声明 struct tag {member-list; }variable-list;例如描述一个学生&#x…...

全志T3+FPGA国产核心板——Pango Design Suite的FPGA程序加载固化

本文主要基于紫光同创Pango Design Suite(PDS)开发软件,演示FPGA程序的加载、固化,以及程序编译等方法。适用的开发环境为Windows 7/10 64bit。 测试板卡为全志T3+Logos FPGA核心板,它是一款基于全志科技T3四核ARM Cortex-A7处理器 + 紫光同创Logos PGL25G/PGL50G FPGA设计…...

深度学习之 imgaug (图像增强)学习笔记

深度学习之 imgaug &#xff08;图像增强&#xff09;前言1\. 安装和卸载2\. 示例2.1 基本使用2.2 包含常用的变换示例3 Augmenters常用函数3.1 iaa.Sequential()3.2 iaa.someOf()3.3 iaa.OneOf()3.4 iaa.Sometimes()3.5 iaa.WithColorspace()3.6 iaa.WithChannels()3.7 iaa.No…...

mysql字符串等值查询中条件字段值末尾有空格也能查到数据问题

一、事故还原 我们仍然使用学生信息表&#xff0c;但是我们只需要保留两个字段即可&#xff1a; CREATE TABLE student_info (id int(11) NOT NULL AUTO_INCREMENT COMMENT 学号,name varchar(20) CHARACTER SET utf8 DEFAULT NULL COMMENT 姓名, PRIMARY KEY (id) ) ENGINEIn…...

一个关于事件溯源Event Sourcing的小荔枝,Golang实现

最后更新于2023年3月1日 10:23:13 参考的这个文章&#xff1a;https://martinfowler.com/eaaDev/EventSourcing.html 用C sharp实现的&#xff0c;我改写成Golang了 最简单的例子 func main() {eProc : NewEventProcessor()//refact : Cargo{Name: "Refactoring"}…...

Vue3 组合式函数,实现minxins

截至目前&#xff0c;组合式函数应该是在VUE 3应用程序中组织业务逻辑最佳的方法。它让我们可以把一些小块的通用逻辑进行抽离、复用&#xff0c;使我们的代码更易于编写、阅读和维护。 一. 什么是“组合式函数”&#xff1f; 根据官方文档说明&#xff0c;在 Vue 应用的概念中…...

什么是钉钉消息推送?

我是3y&#xff0c;一年CRUD经验用十年的markdown程序员&#x1f468;&#x1f3fb;‍&#x1f4bb;常年被誉为职业八股文选手 在前阵子我就已经接入了钉钉的群机器人和工作消息推送&#xff0c;一直没写文章同步到给大家。 像这种接入渠道的工作&#xff0c;虽然我没接入过&…...

利用 NVIDIATAO 和 WeightBias 加速AI开发

利用 NVIDIATAO 和 Weight&Bias 加速AI开发 利用图像分类、对象检测、自动语音识别 (ASR) 和其他形式的 AI 可以推动公司和商业部门内部的大规模转型。 然而&#xff0c;从头开始构建人工智能和深度学习模型是一项艰巨的任务。 构建这些模型的一个共同先决条件是拥有大量高…...

token - 令牌

文章目录token - 令牌学前须知&#xff1a;1&#xff0c;base64 防君子不防小人2&#xff0c;SHA-256 安全散列算法的一种&#xff08;hash&#xff09;3&#xff0c;HMAC-SHA2564&#xff0c;RSA256 非对称加密2.1 JWT - json-web-token1&#xff0c;三大组成2&#xff0c;jwt…...

应用模型开发指南上新介绍

Module、HAP、Ability、AbilitySta-ge、Context……您是否曾经被这些搞不懂又绕不开的知识点困扰&#xff1f; 现在&#xff0c;全新的《应用程序包基础知识》及《应用模型开发指南》为您答疑解惑&#xff01; 这里有您关注的概念解析、原理机制阐述&#xff0c;也有丰富的…...

Dbeaver连接Hive数据库操作指导

背景&#xff1a;由于工作需要&#xff0c;当前分析研究的数据基于Hadoop的Hive数据库中&#xff0c;且Hadoop服务端无权限进行操作且使用安全模式&#xff0c;在研究了Dbeaver、Squirrel和Hue三种连接Hive的工具&#xff0c;在无法绕开useKey认证的情况下&#xff0c;只能使用…...

【RabbitMQ笔记09】消息队列RabbitMQ之常见方法的使用

这篇文章&#xff0c;主要介绍消息队列RabbitMQ之常见方法的使用。 目录 一、消息队列常见方法 1.1、连接工厂ConnectionFactory 1.2、连接Connection 1.3、通道Channel 1.4、交换机相关方法 &#xff08;1&#xff09;exchangeDeclare()声明交换机 1.5、队列相关方法 …...

Linux字符设备驱动模型之设备号

从上文中可知&#xff0c;在Linux用户空间中&#xff0c;如若需要操作硬件设备&#xff0c;均通过/dev目录下的设备文件节点进行操作&#xff0c;基本上每一种设备都会存在一个或者多个的设备节点。 并且在Linux内核中&#xff0c;其表示字符设备的结构成员也提供了相应的设备号…...

C++多态原理

请看下面的程序&#xff0c;该程序演示了多态类对象存储空间的大小。 #include <iostream> using namespace std; class A {public:int i;virtual void func() {}virtual void func2() {} }; class B : public A {int j;void func() {} }; int main() {cout << si…...

PMP认证与NPDP认证哪个含金量高?

两个证涉及的领域不一样的&#xff0c;一个是项目管理&#xff0c;对应的是项目经理&#xff1b;一个是产品管理&#xff0c;对应的是产品经理。含金量不能相比&#xff0c;但在各自的领域的含金量是很高的&#xff0c;至少专业程度或者知名度是最高的。 我来分别说一下PMP认证…...

改进YOLOv7-Tiny系列:首发改进结合BiFPN结构的特征融合网络,网络融合更多有效特征,高效涨点

💡该教程为改进进阶指南,属于《芒果书》📚系列,包含大量的原创首发改进方式, 所有文章都是全网首发原创改进内容🚀 内容出品:CSDN博客独家更新 @CSDN芒果汁没有芒果 💡本篇文章 基于 YOLOv5、YOLOv7芒果改进YOLO系列:芒果改进YOLOv7-Tiny系列:首发改进结合BiFPN结…...

PPC Insights系列:洞见安全多方图联邦

开放隐私计算开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的服务区”。183篇原创内容公众号知…...

SQLite注入记录(目前最全、核心函数用法、布尔盲注、时间盲注、webshell、动态库,绕过方式)

目录 与Mysql区别 全部核心函数 普通注入 查询所有列 查看所有表名...

Java简单的生成/解析二维码(zxing qrcode)

Hi I’m Shendi Java简单的生成/解析二维码&#xff08;zxing qrcode&#xff09; 在之前使用 qrcode.js 方式生成二维码&#xff0c;但在不同设备上难免会有一些兼容问题&#xff0c;于是改为后端&#xff08;Java&#xff09;生成二维码图片 这里使用 Google 的 zxing包 Jar…...

若依项目导出后端响应的Excel文件流处理

若依开源项目&#xff1a;http://doc.ruoyi.vip/ruoyi-vue 问题 前端 1. download.js 添加自定义方法 /*** 自定义方法&#xff1a;导出后端响应的 excel 文件流* param url 请求后端的接口地址 例如&#xff1a;"/downloadExcel"* param name 响应后的文件名称&…...

华为OD机试【独家】提供C语言题解 - 数组排序

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明数组…...

JVM详解——内存结构

文章目录内存结构1、 运行时数据区2、虚拟机栈3、本地方法栈4、程序计数器5、 堆6、方法区7、运行时常量池8、内存溢出和内存泄漏9、 堆溢出内存结构 1、 运行时数据区 Java虚拟机在运行Java程序期间将管理的内存划分为不同的数据区&#xff0c;不同的区域负责不同的职能&…...

Jvisualvm监控Tomcat以及相关参数优化

Tomcat阻塞模式 阻塞模式&#xff08;BIO&#xff09; 客户端和服务器创建一个连接&#xff0c;它就会创建一个线程来处理这个连接&#xff0c;以为这客户端创建了几个连接&#xff0c;服务端就需要创建几个线程来处理你&#xff0c;导致线程会产生很多&#xff0c;有很多线程…...

界面组件DevExpress WinForms v22.2 - 全面升级数据展示功能

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…...

正点原子第一期

ZYNQ是一个fpga用来硬件编程&#xff0c;外加一个软件编程 FPGA是可通过编程来修改其逻辑功能的数字集成电路 第三篇语法篇 第七章 verilog HDL语法 Verilog的简介 可编程逻辑电路&#xff1a;允许用户自行修改内部连接的集成电路&#xff0c;其内部的电路结构可以通过编程数…...

「mysql是怎样运行的」第24章 一条记录的多幅面孔---事务的隔离级别与MVCC

「mysql是怎样运行的」第24章 一条记录的多幅面孔—事务的隔离级别与MVCC 文章目录「mysql是怎样运行的」第24章 一条记录的多幅面孔---事务的隔离级别与MVCC一、事前准备二、事务的隔离级别事务并发执行遇到的问题SQL标准中的四种隔离级别MySQL中支持的四种隔离级别三、MVCC原…...

入门Java第十五天 线程

一、多线程 1.1进程和线程 进程&#xff1a;进程就是操作系统中运行的每一个应用程序。例如&#xff1a;微信&#xff0c;QQ 线程&#xff1a;线程是进程中的每一个任务。 多线程&#xff1a;在一个进程中&#xff0c;可以同时执行多个线程。同时完成多个任务。 并发&#x…...

探索用卷积神经网络实现MNIST数据集分类

问题对比单个全连接网络&#xff0c;在卷积神经网络层的加持下&#xff0c;初始时&#xff0c;整个神经网络模型的性能是否会更好。方法模型设计两层卷积神经网络&#xff08;包含池化层&#xff09;&#xff0c;一层全连接网络。选择 5 x 5 的卷积核&#xff0c;输入通道为 1&…...

MySQL 索引失效场景

1&#xff0c;前言 索引主要是为了提高表的查询速率&#xff0c;但在某些情况下&#xff0c;索引也会失效的情况。 2&#xff0c;失效场景 2.1 最左前缀法则 查询从索引最左列开始&#xff0c;如果跳过索引中的age列&#xff0c;那么age后面字段的索引都将失效&#xff0c;…...

Xcode开发工具,图片放入ios工程

Xcode开发工具&#xff0c;图片放入ios工程&#xff0c;有三种方式&#xff1a; 一&#xff1a;Assets Assets.xcassets 一般是以蓝色的Assets.xcassets的文件夹形式在工程中&#xff0c;以Image Set的形式管理。当一组图片放入的时候同时会生成描述文件Contents.jso…...

操作系统权限提升(十九)之Linux提权-SUID提权

系列文章 操作系统权限提升(十八)之Linux提权-内核提权 SUID提权 SUID介绍 SUID是一种特殊权限&#xff0c;设置了suid的程序文件&#xff0c;在用户执行该程序时&#xff0c;用户的权限是该程序文件属主的权限&#xff0c;例如程序文件的属主是root&#xff0c;那么执行该…...

直播 | StarRocks 实战系列第三期--StarRocks 运维的那些事

2023 年开春&#xff0c; StarRocks 社区重磅推出入门级实战系列直播&#xff0c;手把手带你从 Zero to Hero 成为一个 “StarRocks Pro”&#xff01;通过实际操作和应用场景的结合&#xff0c;我们将帮你系统性地学习 StarRocks 这个当今最热门的开源 OLAP 数据库。本次&…...