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

pandas教程:GroupBy Mechanics 分组机制

文章目录

  • Chapter 10 Data Aggregation and Group Operations(数据汇总和组操作)
  • 10.1 GroupBy Mechanics(分组机制)
  • 1 Iterating Over Groups(对组进行迭代)
  • 2 Selecting a Column or Subset of Columns (选中一列,或列的子集)
  • 3 Grouping with Dicts and Series(用Dicts与Series进行分组)
  • 4 Grouping with Functions(用函数进行分组)
  • 5 Grouping by Index Levels (按索引层级来分组)

Chapter 10 Data Aggregation and Group Operations(数据汇总和组操作)

这一章的内容:

  • 把一个pandas对象(seriesDataFrame)按key分解为多个
  • 计算组的汇总统计值(group summary statistics),比如计数,平均值,标准差,或用户自己定义的函数
  • 应用组内的转换或其他一些操作,比如标准化,线性回归,排序,子集选择
  • 计算透视表和交叉列表
  • 进行分位数分析和其他一些统计组分析

10.1 GroupBy Mechanics(分组机制)

Hadley Wickham,是很多R语言有名库的作者,他描述group operation(组操作)为split-apply-combine(分割-应用-结合)。第一个阶段,存储于seriesDataFrame中的数据,根据不同的keys会被split(分割)为多个组。而且分割的操作是在一个特定的axis(轴)上。例如,DataFrame能按行(axis=0)或列(axis=1)来分组。之后,我们可以把函数apply(应用)在每一个组上,产生一个新的值。最后,所以函数产生的结果被combine(结合)为一个结果对象(result object)。下面是一个图示:

每一个用于分组的key能有很多形式,而且keys也不必都是一种类型:

  • 含有值的listarray的长度,与按axis分组后的长度是一样的
  • 值的名字指明的是DataFrame中的列名
  • 一个dictSeries,给出一个对应关系,用于对应按轴分组后的值与组的名字
  • 能在axis index(轴索引)上被调用的函数,或index上的labels(标签)

注意后面三种方法都是用于产生一个数组的快捷方式,而这个数组责备用来分割对象(split up the object)。不用担心这些很抽象,这一章会有很多例子来帮助我们理解这些方法。先从一个例子来开始吧,这里有一个用DataFrame表示的表格型数据集:

import numpy as np
import pandas as pd
df = pd.DataFrame({'key1' : ['a', 'a', 'b', 'b', 'a'],'key2' : ['one', 'two', 'one', 'two', 'one'], 'data1' : np.random.randn(5), 'data2' : np.random.randn(5)})
df
data1data2key1key2
01.3645330.633262aone
11.3533680.361008atwo
20.253311-1.107940bone
3-1.513444-1.038035btwo
4-0.9203172.037712aone

假设我们想要,通过使用key1作为labels,来计算data1列的平均值。有很多方法可以做到这点,一种是访问data1,并且使用列(a series)在key1上,调用groupby。(译者:其实就是按key1来进行分组,但只保留data1这一列):

grouped = df['data1'].groupby(df['key1'])
grouped
<pandas.core.groupby.SeriesGroupBy object at 0x111db3710>

这个grouped变量是一个GroupBy object(分组对象)。实际上现在还没有进行任何计算,除了调用group key(分组键)df['key1']时产生的一些中间数据。整个方法是这样的,这个GroupBy object(分组对象)已经有了我们想要的信息,现在需要的是对于每一个group(组)进行一些操作。例如,通过调用GroupBymean方法,我们可以计算每个组的平均值:

grouped.mean()
key1
a    0.599194
b   -0.630067
Name: data1, dtype: float64

之后我们会对于调用.mean()后究竟发生了什么进行更详细的解释。重要的是,我们通过group key(分组键)对数据(a series)进行了聚合,这产生了一个新的Series,而且这个series的索引是key1列中不同的值。

得到的结果中,index(索引)也有’key1’,因为我们使用了df['key1']

如果我们传入多个数组作为一个list,那么我们会得到不同的东西:

means = df['data1'].groupby([df['key1'], df['key2']]).mean()
means
key1  key2
a     one     0.222108two     1.353368
b     one     0.253311two    -1.513444
Name: data1, dtype: float64

这里我们用了两个key来分组,得到的结果series现在有一个多层级索引,这个多层索引是根据key1key2不同的值来构建的:

means.unstack()
key2onetwo
key1
a0.2221081.353368
b0.253311-1.513444

在上面的例子里,group key全都是series,即DataFrame中的一列,当然,group key只要长度正确,可以是任意的数组:

states = np.array(['Ohio', 'California', 'California', 'Ohio', 'Ohio'])
years = np.array([2005, 2005, 2006, 2005, 2006])
df['data1'].groupby([states, years]).mean()
California  2005    1.3533682006    0.253311
Ohio        2005   -0.0744562006   -0.920317
Name: data1, dtype: float64
df['data1'].groupby([states, years])
<pandas.core.groupby.SeriesGroupBy object at 0x112530e48>
df['data1']
0    1.364533
1    1.353368
2    0.253311
3   -1.513444
4   -0.920317
Name: data1, dtype: float64
df
data1data2key1key2
01.3645330.633262aone
11.3533680.361008atwo
20.253311-1.107940bone
3-1.513444-1.038035btwo
4-0.9203172.037712aone

其中分组信息经常就在我们处理的DataFrame中,在这种情况下,我们可以传入列名(可以是字符串,数字,或其他python对象)作为group keys

df.groupby('key1').mean()
data1data2
key1
a0.5991941.010661
b-0.630067-1.072987
df.groupby(['key1', 'key2']).mean()
data1data2
key1key2
aone0.2221081.335487
two1.3533680.361008
bone0.253311-1.107940
two-1.513444-1.038035

我们注意到第一个例子里,df.groupby('key1').mean()的结果里并没有key2这一列。因为df['key2']这一列不是数值型数据,我们称这种列为nuisance column(有碍列),这种列不会出现在结果中。默认,所有的数值型列都会被汇总计算,但是出现有碍列的情况的话,就会过滤掉这种列。

一个很有用的GroupBy方法是size,会返回一个包含group size(组大小)的series

df.groupby(['key1', 'key2']).size()
key1  key2
a     one     2two     1
b     one     1two     1
dtype: int64

另外一点需要注意的是,如果作为group key的列中有缺失值的话,也不会出现在结果中。

1 Iterating Over Groups(对组进行迭代)

GroupBy对象支持迭代,能产生一个2-tuple(二元元组),包含组名和对应的数据块。考虑下面的情况:

for name, group in df.groupby('key1'):print(name)print(group)
adata1     data2 key1 key2
0  1.364533  0.633262    a  one
1  1.353368  0.361008    a  two
4 -0.920317  2.037712    a  one
bdata1     data2 key1 key2
2  0.253311 -1.107940    b  one
3 -1.513444 -1.038035    b  two

对于有多个key的情况,元组中的第一个元素会被作为另一个元组的key

for (k1, k2), group in df.groupby(['key1', 'key2']):print((k1, k2))print(group)
('a', 'one')data1     data2 key1 key2
0  1.364533  0.633262    a  one
4 -0.920317  2.037712    a  one
('a', 'two')data1     data2 key1 key2
1  1.353368  0.361008    a  two
('b', 'one')data1    data2 key1 key2
2  0.253311 -1.10794    b  one
('b', 'two')data1     data2 key1 key2
3 -1.513444 -1.038035    b  two

当然,也可以对数据的一部分进行各种操作。一个便利的用法是,用一个含有数据片段(data pieces)的dict来作为单行指令(one-liner)

pieces = dict(list(df.groupby('key1')))
pieces
{'a':       data1     data2 key1 key20  1.364533  0.633262    a  one1  1.353368  0.361008    a  two4 -0.920317  2.037712    a  one, 'b':       data1     data2 key1 key22  0.253311 -1.107940    b  one3 -1.513444 -1.038035    b  two}
pieces['b']
data1data2key1key2
20.253311-1.107940bone
3-1.513444-1.038035btwo

groupby默认作用于axis=0,但是我们可以指定任意的轴。例如,我们可以按dtype来对列进行分组:

df.dtypes
data1    float64
data2    float64
key1      object
key2      object
dtype: object
grouped = df.groupby(df.dtypes, axis=1)
for dtype, group in grouped:print(dtype)print(group)
float64data1     data2
0  1.364533  0.633262
1  1.353368  0.361008
2  0.253311 -1.107940
3 -1.513444 -1.038035
4 -0.920317  2.037712
objectkey1 key2
0    a  one
1    a  two
2    b  one
3    b  two
4    a  one

2 Selecting a Column or Subset of Columns (选中一列,或列的子集)

如果一个GroupBy对象是由DataFrame创建来的,那么通过列名或一个包含列名的数组来对GroupBy对象进行索引的话,就相当于对列取子集做聚合(column subsetting for aggregation)。这句话的意思是:

df.groupby('key1')['data1'] 
df.groupby('key1')[['data2']]

上面的代码其实就是下面的语法糖(Syntactic sugar):

df['data1'].groupby(df['key1']) 
df[['data2']].groupby(df['key1'])

语法糖(Syntactic sugar),是由Peter J. Landin(和图灵一样的天才人物,是他最先发现了Lambda演算,由此而创立了函数式编程)创造的一个词语,它意指那些没有给计算机语言添加新功能,而只是对人类来说更“甜蜜”的语法。语法糖往往给程序员提供了更实用的编码方式,有益于更好的编码风格,更易读。不过其并没有给语言添加什么新东西。

尤其是对于一些很大的数据集,这种用法可以聚集一部分列。例如,在处理一个数据集的时候,想要只计算data2列的平均值,并将结果返还为一个DataFrame,我们可以这样写:

df
data1data2key1key2
01.3645330.633262aone
11.3533680.361008atwo
20.253311-1.107940bone
3-1.513444-1.038035btwo
4-0.9203172.037712aone
df.groupby(['key1', 'key2'])[['data2']].mean()
data2
key1key2
aone1.335487
two0.361008
bone-1.107940
two-1.038035

如果一个list或一个数组被传入,返回的对象是一个分组后的DataFrame,如果传入的只是单独一个列名,那么返回的是一个分组后的grouped

s_grouped = df.groupby(['key1', 'key2'])['data2']
s_grouped
<pandas.core.groupby.SeriesGroupBy object at 0x1125309e8>
s_grouped.mean()
key1  key2
a     one     1.335487two     0.361008
b     one    -1.107940two    -1.038035
Name: data2, dtype: float64

3 Grouping with Dicts and Series(用Dicts与Series进行分组)

分组信息可以不是数组的形式。考虑下面的例子:

people = pd.DataFrame(np.random.randn(5, 5),columns=['a', 'b', 'c', 'd', 'e'],index=['Joe', 'Steve', 'Wes', 'Jim', 'Travis'])
people.iloc[2:3, [1, 2]] = np.nan # Add a few NA values
people
abcde
Joe1.358054-0.1243780.159913-0.006129-1.116065
Steve0.926572-0.281652-0.586583-0.266538-0.216959
Wes0.277803NaNNaN0.820144-0.002076
Jim1.6232140.1094142.9676030.0756611.085864
Travis-0.5787501.2526050.7574120.352343-1.342396

假设我们有一个组,对应多个列,而且我们想要按组把这些列的和计算出来:

mapping = {'a': 'red', 'b': 'red', 'c': 'blue','d': 'blue', 'e': 'red', 'f': 'orange'}

现在,我们可以通过这个dict构建一个数组,然后传递给groupby,但其实我们可以直接传入dict(可以注意到key里有一个'f',这说明即使有,没有被用到的group key,也是ok的):

by_column = people.groupby(mapping, axis=1)
by_column.sum()
bluered
Joe0.1537840.117611
Steve-0.8531210.427961
Wes0.8201440.275727
Jim3.0432642.818492
Travis1.109754-0.668541

这种用法同样适用于series,这种情况可以看作是固定大小的映射(fixed-size mapping):

map_series = pd.Series(mapping)
map_series
a       red
b       red
c      blue
d      blue
e       red
f    orange
dtype: object
people.groupby(map_series, axis=1).count()
bluered
Joe23
Steve23
Wes12
Jim23
Travis23

4 Grouping with Functions(用函数进行分组)

比起用dictseries定义映射关系,使用python的函数是更通用的方法。任何一个作为group key的函数,在每一个index value(索引值)上都会被调用一次,函数计算的结果在返回的结果中会被用做group name。更具体一点,考虑前一个部分的DataFrame,用人的名字作为索引值。假设我们想要按照名字的长度来分组;同时我们要计算字符串的长度,使用len函数会变得非常简单:

people.groupby(len).sum() # len函数在每一个index(即名字)上被调用了
abcde
33.259071-0.0149643.1275160.889676-0.032277
50.926572-0.281652-0.586583-0.266538-0.216959
6-0.5787501.2526050.7574120.352343-1.342396

混合不同的函数、数组,字典或series都不成问题,因为所有对象都会被转换为数组:

key_list = ['one', 'one', 'one', 'two', 'two']
people.groupby([len, key_list]).min()
abcde
3one0.277803-0.1243780.159913-0.006129-1.116065
two1.6232140.1094142.9676030.0756611.085864
5one0.926572-0.281652-0.586583-0.266538-0.216959
6two-0.5787501.2526050.7574120.352343-1.342396

5 Grouping by Index Levels (按索引层级来分组)

最后关于多层级索引数据集(hierarchically indexed dataset),一个很方便的用时是在聚集(aggregate)的时候,使用轴索引的层级(One of the levels of an axis index)。看下面的例子:

columns = pd.MultiIndex.from_arrays([['US', 'US', 'US', 'JP', 'JP'], [1, 3, 5, 1, 3]], names=['cty', 'tenor'])
columns
MultiIndex(levels=[['JP', 'US'], [1, 3, 5]],labels=[[1, 1, 1, 0, 0], [0, 1, 2, 0, 1]],names=['cty', 'tenor'])
hier_df = pd.DataFrame(np.random.randn(4, 5), columns=columns)
hier_df
ctyUSJP
tenor13513
0-0.8980730.156686-0.1510110.4238810.336215
10.7363010.9015150.0816550.450248-0.031245
2-1.619125-1.0417750.1294221.222881-0.717410
30.998536-1.3734551.724266-2.0845290.535651

要想按层级分组,传入层级的数字或者名字,通过使用level关键字:

hier_df.groupby(level='cty', axis=1).count()
ctyJPUS
023
123
223
323

相关文章:

pandas教程:GroupBy Mechanics 分组机制

文章目录 Chapter 10 Data Aggregation and Group Operations&#xff08;数据汇总和组操作&#xff09;10.1 GroupBy Mechanics&#xff08;分组机制&#xff09;1 Iterating Over Groups&#xff08;对组进行迭代&#xff09;2 Selecting a Column or Subset of Columns (选中…...

通过右键用WebStorm、Idea打开某个文件夹或者在某一文件夹下右键打开当前文件夹用上述两个应用

通过右键用WebStorm、Idea打开某个文件夹或者在某一文件夹下右键打开当前文件夹用上述两个应用 通过右键点击某个文件夹用Idea打开 首先打开注册表 win R 输入 regedit 然后找到HKEY_CLASSES_ROOT\Directory\shell 然后右键shell 新建一个项名字就叫 Idea 第一步&#xf…...

Android 10.0 framework层设置后台运行app进程最大数功能实现

1. 前言 在10.0的定制开发中,在系统中,对于后台运行的app过多的时候,会比较耗内存,导致系统运行有可能会卡顿,所以在系统优化的 过程中,会限制后台app进程运行的数量,来保证系统流畅不影响体验,所以需要分析下系统中关于限制app进程的相关源码来实现 功能 2.framewo…...

如何快速找到华为手机中下载的文档

手机的目录设置比较繁杂&#xff0c;尤其是查找刚刚下载的文件&#xff0c;有时候需要捣鼓半天&#xff0c;如何快速找到这些文件呢&#xff1f;以下提供了几种方法&#xff1a; 方法一&#xff1a; 文件管理-》搜索文档 方法二&#xff1a; 文件管理-》最近 方法三&#xf…...

iceoryx(冰羚)-Architecture

Architecture 本文概述了Eclipseiceoryx体系结构&#xff0c;并解释了它的基本原理。 Software layers Eclipse iceoryx所包含的主要包如下所示。 接下来的部分将逐一简要介绍组件及其库。 Components and libraries 下面描述了不同的库及其名称空间。 ### iceoryx hoofs …...

LeetCode2-两数相加

大佬解法 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val x; }* }*/ class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode pre new ListNode(0);ListNo…...

css 灰质彩色的边框

border: 4px solid transparent; background-color:#fff; background-clip: padding-box,border-box; background-origin:padding-box, border-box; background-image: linear-gradient(90deg,#F5F6FA,#F5F6FA 42%,#F5F6FA),linear-gradient(151deg,#33e9bf,#c7e58a,#b1e8cc);...

OpenCV实现手势音量控制

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下如何使用OpenCV实现手势音量控制&#xff0c;欢迎大家一起前来探讨学习~ 一、需要的库及功能介绍 本次实验需要使用OpenCV和mediapipe库进行手势识别&#xff0c;并利用手势距离控制电脑音量。 导入库&am…...

pytorch 深度学习之余弦相似度

文章目录 用处定理代码F.normalize() 和 F.norm() 的区别 用处 此方法特别重要&#xff0c;经常可以用来修改论文&#xff0c;提出创新点. 定理 余弦相似度是通过计算两个向量之间的夹角余弦值来衡量它们的相似性。给定两个非零向量 x 和 y&#xff0c;它们之间的余弦相似度…...

Postman的常规断言/动态参数断言/全局断言

近期在复习Postman的基础知识&#xff0c;在小破站上跟着百里老师系统复习了一遍&#xff0c;也做了一些笔记&#xff0c;希望可以给大家一点点启发。 断言&#xff0c;包括状态码断言和业务断言&#xff0c;状态码断言有一个&#xff0c;业务断言有多个。 一&#xff09;常规的…...

ruoyi若依前端请求接口超时,增加响应时长

问题&#xff1a; 前端查询请求超时 解决&#xff1a; 找到request.js的timeout属性由10秒改成了20秒&#xff0c;因为默认是10秒&#xff0c;请求肯定是超出了10秒 祝您万事顺心&#xff0c;没事点个赞呗&#xff0c;关注一下也行啊&#xff0c;有啥要求您评论哈...

贪吃蛇小游戏

一. 准备工作 首先获取贪吃蛇小游戏所需要的头部、身体、食物以及贪吃蛇标题等图片。、 然后&#xff0c;创建贪吃蛇游戏的Java项目命名为snake_game&#xff0c;并在这个项目里创建一个文件夹命名为images&#xff0c;将图片素材导入文件夹。 再在src文件下创建两个包&#…...

cocos----1

1 前言 刚体&#xff08;Rigidbody&#xff09;是运动学&#xff08;Kinematic&#xff09;中的一个概念&#xff0c;指在运动中和受力作用后&#xff0c;形状和大小不变&#xff0c;而且内部各点的相对位置不变的物体。在 Unity3D 中&#xff0c;刚体组件赋予了游戏对…...

第十九章绘图

Java绘图类 Graphics 类 Grapics 类是所有图形上下文的抽象基类&#xff0c;它允许应用程序在组件以及闭屏图像上进行绘制。Graphics 类封装了Java 支持的基本绘图操作所需的状态信息&#xff0c;主要包括颜色、字体、画笔、文本、图像等。 Graphics 类提供了绘图常用的…...

rpmbuild 包名 version 操作系统信息部分来源 /etc/rpm/macros.dist

/etc/rpm/macros.dist openeuler bclinux src.rpm openssl-1.1.1f-13.oe1.src.rpm 打包名称结果 openeuler openssl-1.1.1f-13.aarch64.rpm bclinux openssl-1.1.1f-13.oe1.bclinux.aarch64.rpm 验证 修改openeuler配置文件macros.dist 重新在openeuler上执行rpmbuild…...

【Linux专题】SFTP 用户配置 ChrootDirectory

【赠送】IT技术视频教程&#xff0c;白拿不谢&#xff01;思科、华为、红帽、数据库、云计算等等https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502 红帽认证 认证课程介绍&#xff1a;红帽RHCE9.0学什么内容&#xff0c;新版有什么变化-CSDN…...

openssl+ DES开发实例(Linux)

文章目录 一、DES介绍二、DES原理三、DES C实现源码 一、DES介绍 DES&#xff08;Data Encryption Standard&#xff09;是一种对称密钥加密算法&#xff0c;最初由 IBM 设计&#xff0c;于1977年成为美国国家标准&#xff0c;用于加密非机密但敏感的政府数据。DES 使用相同的…...

结构体几种实用的用法

结构体的初始化 结构体的初始化是指在声明结构体变量时&#xff0c;为其成员变量赋初值。结构体的初始化可以通过以下几种方式实现&#xff1a; 1. 在声明结构体变量的同时进行初始化&#xff1a; struct Student { char name[20]; int age; float score; } student {…...

React Native 源码分析(四)—— TurboModules JSI通信机制

本文会详细分析React Native 基于JSI的通信方式,除不会涉及Hemers引擎部分,其余代码都会详细分析,但比较简单的,不会很啰嗦,可以说是网上最完整详细的分析文章,代码通过断点截图,可以更方便查看运行的过程 1、React Native 源码分析(一)—— 启动流程 2、React Nativ…...

【C#学习】ToString() 格式化数值

格式字符串采用以下形式&#xff1a;Axx&#xff0c;其中 A 为格式说明符&#xff0c;指定格式化类型&#xff0c;xx 为精度说明符&#xff0c;控制格式化输出的有效位数或小数位数。 格式说明符 说明 示例 输出 C 货币 2.5.ToString(“C”) &#xffe5;2.50 D 十进制数 25.…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...