Python数据分析NumPy和pandas(三十二、数据拆分-应用-合并)

最常用的 GroupBy 方法是 apply,apply 将正在操作的对象拆分为多个片段,在每个片段上调用传递给它函数,然后尝试连接这些片段。

还是用前面的小费数据集tips.csv,它的内容如下图:

假设我们想按smoker进行分组并选择前五个tip_pct值:

import numpy as np
import pandas as pdtips = pd.read_csv("examples/tips.csv")
tips["tip_pct"] = tips["tip"] / tips["total_bill"]# 自定义函数top,根据选择列tip_pct值最大的前n行
def top(df, n=5, column="tip_pct"):return df.sort_values(column, ascending=False)[:n]# 然后按 smoker 进行分组,并使用top函数调用 apply:
result = tips.groupby("smoker").apply(top)
print(result)

输出结果:

total_billtipsmokerdaytimesizetip_pct
smoker
No23211.613.39NoSatDinner20.291990
1497.512.00NoThurLunch20.266312
5110.292.60NoSunDinner20.252672
18520.695.00NoSunDinner50.241663
8824.715.85NoThurLunch20.236746
Yes1727.255.15YesSunDinner20.710345
1789.604.00YesSunDinner20.416667
673.071.00YesSatDinner10.325733
18323.176.50YesSunDinner40.280535
10914.314.00YesSatDinner20.279525

这里发生了什么?首先,根据 smoker 的值将 tips DataFrame 分成几组。然后,在每个组上调用 top 函数,并使用 pandas.concat 将每个调用的结果粘合在一起,也同时使用组名称标记各个部分。因此,结果具有一个分层索引,其内部级别包含来自原始 DataFrame 的索引值。

除了向apply方法传递函数名外,还可以在后面传递其他参数:

import numpy as np
import pandas as pdtips = pd.read_csv("examples/tips.csv")
tips["tip_pct"] = tips["tip"] / tips["total_bill"]# 自定义函数top,根据选择列tip_pct值最大的前n行
def top(df, n=5, column="tip_pct"):return df.sort_values(column, ascending=False)[:n]# 然后按 smoker 进行分组,并使用top函数调用 apply:
#result = tips.groupby("smoker").apply(top)
result = tips.groupby(["smoker", "day"]).apply(top, n=1, column="total_bill")
print(result)

执行上述代码会产生一个警告:DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  result = tips.groupby(["smoker", "day"]).apply(top, n=1, column="total_bill")

那我们按照提示修改下代码:

import numpy as np
import pandas as pdtips = pd.read_csv("examples/tips.csv")
tips["tip_pct"] = tips["tip"] / tips["total_bill"]# 自定义函数top,根据选择列tip_pct值最大的前n行
def top(df, n=5, column="tip_pct"):return df.sort_values(column, ascending=False)[:n]# 然后按 smoker 进行分组,并使用top函数调用 apply:
#result = tips.groupby("smoker").apply(top)
result = tips.groupby(["smoker", "day"]).apply(top, n=1, column="total_bill", include_groups=False)
print(result)

输出结果如下:

total_billtiptimesizetip_pct
smokerday
NoFri9422.753.25Dinner20.142857
Sat21248.339.00Dinner40.186220
Sun15648.175.00Dinner60.103799
Thur14241.195.00Lunch50.121389
YesFri9540.174.73Dinner40.117750
Sat17050.8110.00Dinner30.196812
Sun18245.353.50Dinner30.077178
Thur19743.115.00Lunch40.115982

除了这些基本的使用功能之外,要充分利用 apply 需要一些创造力。传递给apply的函数内部实现什么功能由我们自己决定,但它必须返回 pandas 对象或标量值。下面主要是通过代码示例展示如何使用 groupby 解决各种问题。 

例如:对 GroupBy 对象调用了描述性统计函数 describe():

import numpy as np
import pandas as pdtips = pd.read_csv("examples/tips.csv")
tips["tip_pct"] = tips["tip"] / tips["total_bill"]result = tips.groupby("smoker")["tip_pct"].describe()print(result)
print(result.unstack("smoker"))

以上代码对tips按smoker进行分组,然后用describe()方法对tip_pct列进行统计分析,输出该列的均值、最大值、最小值等描述统计标量,输出结果如下:

countmeanstdmin25%50%75%max
smoker
No151.00.1593280.0399100.0567970.1369060.1556250.1850140.291990
Yes93.00.1631960.0851190.0356380.1067710.1538460.1950590.710345

 然后调用result.unstack("smoker")输出:

隐藏分组用的键

在前面的示例中,生成的对象具有由组键以及原始对象的每个部分的索引组成的分层索引。要隐藏分组的键,可以设置group_keys=False,例如:

import numpy as np
import pandas as pddef top(df, n=5, column="tip_pct"):return df.sort_values(column, ascending=False)[:n]tips = pd.read_csv("examples/tips.csv")
tips["tip_pct"] = tips["tip"] / tips["total_bill"]result = tips.groupby("smoker", group_keys=False).apply(top, include_groups=False)print(result)

输出结果:

total_billtipdaytimesizetip_pct
23211.613.39SatDinner20.291990
1497.512.00ThurLunch20.266312
5110.292.60SunDinner20.252672
18520.695.00SunDinner50.241663
8824.715.85ThurLunch20.236746
1727.255.15SunDinner20.710345
1789.604.00SunDinner20.416667
673.071.00SatDinner10.325733
18323.176.50SunDinner40.280535
10914.314.00SatDinner20.279525

分位数和存储桶分析(Quantile and Bucket Analysis)

之前的学习中,我们学习过 pandas.cut 和 pandas.qcut,使用选择的 bin 或样本分位数将数据切成桶。将这些函数与 groupby 结合使用,可以方便地对数据集执行存储桶或分位数分析。例如:

import numpy as np
import pandas as pdnp.random.seed(12345)
frame = pd.DataFrame({"data1": np.random.standard_normal(1000), "data2": np.random.standard_normal(1000)})
print(frame.head())quartiles = pd.cut(frame["data1"], 4)
print(quartiles.head(10))def get_stats(group):return pd.DataFrame({"min": group.min(), "max": group.max(), "count": group.count(), "mean": group.mean()})grouped = frame.groupby(quartiles, observed=False)
print(grouped.apply(get_stats))

frame.head()输出前5行:

data1data2
0-0.5788280.517431
11.847446-0.756552
20.4537391.171381
3-0.302450-1.212491
41.402558-0.399609

quartiles.head(10)输出按4个bin划分后的前10行:

从上面的输出可以看出4个bin分组分别是:[(-2.956, -1.23] < (-1.23, 0.489] < (0.489, 2.208] <
                                           (2.208, 3.928]]

cut 返回的 Categorical 对象可以直接传递给 groupby。因此,我们可以计算四分位数的一组组统计数据,如下所示,grouped.apply(get_stats)输出:

minmaxcountmean
data1
(-2.956, -1.23]data1-2.2617612.505056950.100124
data2-2.1863012.615416950.173283
(-1.23, 0.489]data1-3.4282542.6536565950.023041
data2-2.9093732.4922245950.004728
(0.489, 2.208]data1-3.1843772.423712299-0.043678
data2-3.5488243.366626299-0.061474
(2.208, 3.928]data1-1.4712482.03698111-0.172572
data2-1.0931121.776327110.082027

其实,要输出相同结果还可以使用grouped.agg(["min", "max", "count", "mean"]),这种方法更简便:

import numpy as np
import pandas as pdnp.random.seed(12345)
frame = pd.DataFrame({"data1": np.random.standard_normal(1000), "data2": np.random.standard_normal(1000)})
print(frame.head())quartiles = pd.cut(frame["data1"], 4)
print(quartiles.head(10))#def get_stats(group):
#    return pd.DataFrame({"min": group.min(), "max": group.max(), 
#                         "count": group.count(), "mean": group.mean()})grouped = frame.groupby(quartiles, observed=False)
result = grouped.agg(["min", "max", "count", "mean"])
print(result)

输出:

data1data2
minmaxcountmeanminmaxcountmean
data1
(-2.956, -1.23]-2.2617612.505056950.100124-2.1863012.615416950.173283
(-1.23, 0.489]-3.4282542.6536565950.023041-2.9093732.4922245950.004728
(0.489, 2.208]-3.1843772.423712299-0.043678-3.5488243.366626299-0.061474
(2.208, 3.928]-1.4712482.03698111-0.172572-1.0931121.776327110.082027

注意:这些是等长的桶(bin)。要根据样本分位数计算等长的存储桶,可以使用 pandas.qcut。我们可以传递 4 作为存储桶计算样本四分位数,并传递 labels=False 仅获取四分位数索引而不是区间: 

import numpy as np
import pandas as pdnp.random.seed(12345)
frame = pd.DataFrame({"data1": np.random.standard_normal(1000), "data2": np.random.standard_normal(1000)})
print(frame.head())#quartiles = pd.cut(frame["data1"], 4)
quartiles_samp = pd.qcut(frame["data1"], 4, labels=False)
print(quartiles_samp.head())def get_stats(group):return pd.DataFrame({"min": group.min(), "max": group.max(), "count": group.count(), "mean": group.mean()})
grouped = frame.groupby(quartiles_samp)
print(grouped.apply(get_stats))

quartiles_samp.head() 输出:

grouped.apply(get_stats)输出:

minmaxcountmean
data1
0data1-3.428254-0.710197250-1.272969
data2-2.9093732.531127250-0.076649
1data1-0.7059600.014029250-0.338060
data2-3.5488242.419003250-0.007728
2data10.0165200.7151032500.360921
data2-2.6111243.3666262500.046946
3data10.7185572.6536562501.283159
data2-2.7486852.6154162500.044617

下面我们使用四个代码示例学习之前学过的内容。

Example 1:使用特定于组的值 填充 缺失值

在清理缺失数据时,可以使用 dropna 删除,但在其他情况下,我们希望使用固定值或从数据派生的某些值来填充空值 (NA)。那可以使用 Fillna 方法。这里我们用平均值填充 null 值:

import numpy as np
import pandas as pdnp.random.seed(12345)
s = pd.Series(np.random.standard_normal(6))
s[::2] = np.nan
print(s)
result = s.fillna(s.mean())
print(result)

填充前s输出:

用均值填充后输出:

假设我们需要 fill 的值因组而异。一种方法是对数据进行分组,并将 apply 与在每个数据块上调用 fillna 的函数一起使用:

import numpy as np
import pandas as pdnp.random.seed(12345)
states = ["Ohio", "New York", "Vermont", "Florida","Oregon", "Nevada", "California", "Idaho"]
group_key = ["East", "East", "East", "East","West", "West", "West", "West"]
data = pd.Series(np.random.standard_normal(8), index=states)
print(data)# 给data设置一些缺失值
data[["Vermont", "Nevada", "Idaho"]] = np.nan
print(data)# 按分组键列表中的键进行分组,返回每组的大小
data.groupby(group_key).size()# 按分组键列表中的键进行分组,返回每组的值的计数
data.groupby(group_key).count()# 按分组键列表中的键进行分组,返回每组的平均值
data.groupby(group_key).mean()# 使用组均值填充 NA 值,如下,先自定义一个填充函数:
def fill_mean(group):return group.fillna(group.mean())# 传递自定义函数fill_mean给apply,用每组的均值填充各组的缺失值
result = data.groupby(group_key).apply(fill_mean)
print(result)# 另一种情况:在代码中预定义每组的填充值,并用这些值填充每组的缺失值。
# 由于groups 内部有一个 name 属性,我们可以使用name属性,来指定为每组填充
fill_values = {"East": 0.5, "West": -1}
def fill_func(group):return group.fillna(fill_values[group.name])
result = data.groupby(group_key).apply(fill_func)
print(result)

data设置缺失值后输出:

用每组的平均值填充后输出:

用指定的每组填充值填充后输出:


Example 2 :随机采样和排列

假设我们想从大型数据集中随机抽取样本,那有多种方法可以执行;这里我们使用 Series 的 sample 方法。下面我们用代码来演示,代码中会构建一副扑克牌。

import numpy as np
import pandas as pd# Hearts, Spades, Clubs, Diamonds
# 红心、黑桃、梅花、方块
suits = ["H", "S", "C", "D"]  
card_val = (list(range(1, 11)) + [10] * 3) * 4
base_names = ["A"] + list(range(2, 11)) + ["J", "K", "Q"]
cards = []
for suit in suits:cards.extend(str(num) + suit for num in base_names)deck = pd.Series(card_val, index=cards)# 现在我们有一个长度为 52 的 Series,
# 其索引包含牌名,
# 值是二十一点和其他游戏中使用的值
print(deck.head(13))# 从牌堆中抽一手五张牌可以写成:
def draw(deck, n=5):return deck.sample(n)
print(draw(deck))# 假设要随机抽取每种花色的两张牌,
# 因为花色是每张牌名的最后一个字符,所以我们可以基于此进行分组并使用 apply:
# 自定义一个函数get_suit返回牌的花色
def get_suit(card):# 最后一个字母是花色return card[-1]# 随机抽每种花色的2张牌
result = deck.groupby(get_suit).apply(draw, n=2)
print(result)

代码中首先构建了一副扑克牌,deck.head(13)输出13张:

draw(deck)随机抽5张,输出:

最后按花色分组,每种花色抽两张输出:


Example 3 :组加权平均值和相关性

在 groupby 的 split-apply-combine 范式下,可以在 DataFrame 或两个 Series 中的列之间进行操作,例如求组加权平均。示例:

import numpy as np
import pandas as pdnp.random.seed(12345)df = pd.DataFrame({"category": ["a", "a", "a", "a", "b", "b", "b", "b"], "data": np.random.standard_normal(8), "weights": np.random.uniform(size=8)})
print(df)# 然后按类别(category)划分,求加权平均值
grouped = df.groupby("category")
# 自定义函数get_wavg求加权平均
def get_wavg(group):return np.average(group["data"], weights=group["weights"])
result = grouped.apply(get_wavg)
print(result)

df输出:

categorydataweights
0a0.0061510.149751
1a-0.5000040.240539
2a-1.3107660.630025
3a-0.8329100.763095
4b-0.0551740.918371
5b-1.4449440.054725
6b0.9440280.028265
7b0.0647200.572253

按类别分组求加权平均输出:

再举一个例子,用一个金融数据集来展示,其中包含一些股票的收盘价和标准普尔 500 指数(SPX 代码),部分内容如下截图:

import numpy as np
import pandas as pdclose_px = pd.read_csv("examples/stock_px.csv", parse_dates=True, index_col=0)# 输出数据集DataFrame对象close_px的相关概览信息
print(close_px.info())
# 输出数据集前4行看看
print(close_px.tail(4))# 下面我们设置一个任务:生成一个 DataFrame,该 DataFrame 由每日回报的年度相关性(根据百分比变化计算)与 SPX 组成。
# 为此,1.首先创建一个函数,用于计算每列与 “SPX” 列的成对相关性:
def spx_corr(group):return group.corrwith(group["SPX"])# 接下来,2.使用 pct_change() 计算close_px的百分比变化:
rets = close_px.pct_change().dropna()# 最后,按年份对这些百分比变化进行分组,
# 使用返回每个日期时间标签的 year 属性的单行函数从每个行标签中提取这些变化
def get_year(x):return x.year
by_year = rets.groupby(get_year)
result =  by_year.apply(spx_corr)# 输出结果
print(result)# 另一个任务:计算列间相关性。比如:计算 Apple 和 Microsoft 之间的年度相关性:
def corr_aapl_msft(group):return group["AAPL"].corr(group["MSFT"])
result2 = by_year.apply(corr_aapl_msft)
# 输出结果
print(result2)

数据集的概览信息输出:

数据集的后4行输出:

AAPLMSFTXOMSPX
2011-10-11400.2927.0076.271195.54
2011-10-12402.1926.9677.161207.25
2011-10-13408.4327.1876.371203.66
2011-10-14422.0027.2778.111224.58

第一个任务输出:

AAPLMSFTXOMSPX
20030.5411240.7451740.6612651.0
20040.3742830.5885310.5577421.0
20050.4675400.5623740.6310101.0
20060.4282670.4061260.5185141.0
20070.5081180.6587700.7862641.0
20080.6814340.8046260.8283031.0
20090.7071030.6549020.7979211.0
20100.7101050.7301180.8390571.0
20110.6919310.8009960.8599751.0

第二个任务输出:

 


Example4:分组线性回归(Group-Wise Linear Regression)

对于Example3中的数据集,还可以使用 groupby 执行更复杂的分组统计分析,只要该函数返回 pandas 对象或标量值即可。例如,我们使用 statsmodels 计量经济学库自定义一个回归函数,该函数对每个数据块执行普通最小二乘法 (OLS) 回归。先pip install statsmodels。

import numpy as np
import pandas as pd
import statsmodels.api as smclose_px = pd.read_csv("examples/stock_px.csv", parse_dates=True, index_col=0)# 下面我们设置一个任务:生成一个 DataFrame,该 DataFrame 由每日回报的年度相关性(根据百分比变化计算)与 SPX 组成。
# 为此,1.首先创建一个函数,用于计算每列与 “SPX” 列的成对相关性:
def spx_corr(group):return group.corrwith(group["SPX"])# 接下来,2.使用 pct_change() 计算close_px的百分比变化:
rets = close_px.pct_change().dropna()# 最后,按年份对这些百分比变化进行分组,
# 使用返回每个日期时间标签的 year 属性的单行函数从每个行标签中提取这些变化
def get_year(x):return x.year
by_year = rets.groupby(get_year)# 自定义 普通最小二乘法 (OLS) 回归
def regress(data, yvar=None, xvars=None):Y = data[yvar]X = data[xvars]X["intercept"] = 1.result = sm.OLS(Y, X).fit()return result.params# 计算APPL SPX回报的年度线性回归
result = by_year.apply(regress, yvar="AAPL", xvars=["SPX"])
print(result)

输出结果:

 

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

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

相关文章

【毫米波雷达(九)】前雷达软件开发遇到的问题汇总及解决方法

前雷达软件开发遇到的问题汇总及解决方法 一、CAN/CANFD通信1、雷达CAN未能正常发出数据2、雷达在车上接收不到车身信息3、程序下载失败4、DV试验发送数据偶发断连5、发送感知信息丢帧或者丢报文6、上电发出第一帧的报文时间长7、ZCANPRO有错误帧二、协议转换&#xff08;以太网…

linux 下调试 bmp280 气压传感器

供自己备忘&#xff1b; linux 下有自带的 bmp280 驱动&#xff0c;实际测试数据抖动不理想&#xff1b; 于是自己重写一个 bmp280 驱动&#xff0c;实际测试数据依旧抖动&#xff0c;不理想&#xff1b; 考虑使用 SPL06 来测试看看效果&#xff1b; 1. 参考资料&#xff1…

『VUE』26. props实现子组件传递数据给父组件(详细图文注释)

目录 本节内容示例代码总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 本节内容 父组件传子组件–props 子组件传父组件–自定义事件 本节讲子组件传父组件–通过props里的方法传递,就是父亲写了一个函数,给子组件调用,然后…

Linux编辑/etc/fstab文件不当,不使用快照;进入救援模式

目录 红帽镜像9救援模式 现象 解决 第一步&#xff1a;修改启动参数以进入救援模式 第二步&#xff1a;进入救援模式、获取root权限、编辑/etc/fstab文件 第三步&#xff1a;编辑好后在重启 下面是ai给的模板 红帽镜像9救援模式 编辑/etc/fstab不当时 17 /dev/nvme0n3p1…

异地情侣远程玩游戏?GameViewer远程串流轻松实现!

情侣之间偶尔想远程玩游戏增进感情却苦于找不到合适的软件&#xff1f;想要寻找一款低门槛好上手操作便捷的串流软件 &#xff1f; 在这里向你推荐 网易GameViewer远程 &#xff01; GameViewer是专为游戏玩家的设计远程控制软件&#xff0c;可以帮助异地情侣实现这一需求。它让…

1990-2020年中国人工林和天然林空间分布数据集

数据介绍 植树已被认为是减缓气候变化的潜在有效解决方案。自上世纪70年代以来&#xff0c;中国实施了世界上最大的造林和再造林工程&#xff0c;但中国人工林的高分辨率地图仍然无法获得。在这项研究中&#xff0c;我们探索了使用多源遥感图像和众包样本来制作第一张高分辨率…

[Docker#10] network | 架构 | CRUD | 5种常见网络类型 (实验)

目录 1. Docker 为什么需要网络管理 2. Docker 网络架构简介 CNM&#xff08;Container Network Model&#xff09; Libnetwork 驱动 3. ⭕常见网络类型&#xff08;5 种&#xff09; 4. Docker 网络管理命令 一. bridge 网络 1. 操作案例&#xff1a;容器间网络通信 …

Spring Cloud Gateway快速入门Demo

1.什么是Spring Cloud Gateway&#xff1f; Spring Cloud Gateway 是一个基于 Spring Framework 和 Spring Boot 构建的 API 网关服务。它提供了一种简单而有效的方式来路由请求、提供跨领域的关注点&#xff08;如安全、监控/指标和弹性&#xff09;以及其他功能。Spring Clo…

【AI换脸整合包及教程】Rope:AI 换脸工具的功能、原理、应用

在人工智能技术迅猛发展的当下&#xff0c;AI 换脸技术无疑是近年来备受瞩目的焦点之一。其中&#xff0c;Rope 作为一款开源的 AI 换脸工具&#xff0c;因其出色的易用性和强大的功能而广受青睐。本文将对 Rope 的功能、技术原理、应用场景以及所面临的法律和伦理问题进行详细…

Yocto项目 - VIRTUAL-RUNTIME,它有什么用?

Yocto 项目是一个完整的 Linux 分布构建工具集&#xff0c;提供了构建完全自定义小型核心或完整应用的能力。在这样一个构建系统中&#xff0c;VIRTUAL-RUNTIME这个概念是应用构建和选择处理中的重要部分。这篇文章将从概念、优势、应用场景和实战案例几个方面&#xff0c;全面…

BB1-NHS ester被用于将各种生物活性分子与蛋白质或其他生物大分子进行共轭连接,2082771-52-4

CAS号&#xff1a;2082771-52-4 中文名&#xff1a;BB1-琥珀酰亚胺酯&#xff0c;BB1-活性酯 英文名&#xff1a;BB1-NHS ester&#xff0c;或BB1-Succinimidyl Ester 分子式&#xff1a;C32H32N6O4 分子量&#xff1a;564.63 纯度&#xff1a;≥95% 供应商&#xff1a;陕…

初级数据结构——栈

目录 前言一、栈的基本概念二、栈的实现方式三、栈的性能分析四、栈的应用场景五、栈的变体六、出栈入栈的动态图解七、代码模版八、总结结语 前言 数据结构栈&#xff08;Stack&#xff09;是一种线性的数据结构&#xff0c;它只允许在序列的一端&#xff08;称为栈顶&#x…

Jdbc学习笔记(四)--PreparedStatement对象、sql攻击(安全问题)

目录 &#xff08;一&#xff09;使用PreparedStatement对象的原因&#xff1a; 使用Statement对象编写sql语句会遇到的问题 ​编辑 &#xff08;二&#xff09;sql攻击 1.什么是sql攻击 2.演示sql攻击 &#xff08;三&#xff09;防止SQL攻击 1.PreparedStatement是什么 …

前端开发必备!2024年最全工具和框架资源大汇总

在前端开发的过程中&#xff0c;我们会使用各种工具、框架和库来提升开发效率和用户体验。随着技术的不断发展&#xff0c;前端生态系统逐渐丰富&#xff0c;开发者面临着越来越多的选择。本文将分享一些常见的前端资源&#xff0c;帮助开发者根据项目需求选择合适的工具。 1.…

备份可以起到什么作用?

在数字化时代&#xff0c;数据已经成为企业最宝贵的资产。然而&#xff0c;数据丢失和系统故障可能给企业带来巨大的损失。华为云备份服务作为一款全面的数据保护解决方案&#xff0c;致力于帮助企业保障数据安全&#xff0c;确保业务的连续性。九河云来给大家说一下华为云备份…

labview实现导出excel表格

有些项目数据读写在数据库里&#xff0c;有时客户会要求读写出来&#xff0c;这样就用到了labview把数据导出来&#xff0c;一般在测试程序界面&#xff0c;我们会把测试数据放在多列列表框里&#xff0c;这里我们需要对多列列表框进行操作。把多列列表框中的项名拆分出来。 接…

深度解读AI在数字档案馆中的创新应用:高效识别与智能档案管理

一、项目背景介绍 在信息化浪潮推动下&#xff0c;基于OCR技术的纸质档案电子化方案成为解决档案管理难题的有效途径。该方案通过先进的OCR技术&#xff0c;能够统一采集各类档案数据&#xff0c;无论是手写文件、打印文件、复古文档还是照片或扫描的历史资料&#xff0c;都能实…

vue3 vant4 NumberKeyboard 根据焦点输入

说明&#xff1a; 使用该组件时焦点在最后&#xff0c;客户要求可更改前面输错信息 实现逻辑 1.获取输入框焦点位置&#xff0c;此次采用的是ref&#xff0c;也可使用document相关 const inputElement numberKeyboardRef.value;if (inputElement) {cursorPosition.value i…

DHT22温湿度传感器(Espressif驱动)

DHT22&#xff1a; 温度范围&#xff1a;-40-80C温度精度&#xff1a;0.5C湿度范围&#xff1a;0-100%RH湿度精度&#xff1a;2-5%RH分辨率&#xff1a;0.1C / 0.1%RH #define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE#include <stdio.h> #include <freertos/FreeRTOS.h>…

数据结构——排序(续集)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…