06-机器学习-数据预处理
数据清洗
数据清洗是数据预处理的核心步骤,旨在修正或移除数据集中的错误、不完整、重复或不一致的部分,为后续分析和建模提供可靠基础。以下是数据清洗的详细流程、方法和实战示例:
一、数据清洗的核心任务
| 问题类型 | 表现示例 | 影响 |
|---|---|---|
| 缺失值 | 数值型字段为空(NaN) | 模型无法处理缺失值,导致训练中断或偏差 |
| 异常值 | 年龄=200岁,房价=-100万 | 扭曲统计指标(如均值),降低模型泛化性 |
| 重复数据 | 两行记录完全相同 | 导致模型过拟合,降低数据代表性 |
| 不一致数据 | 日期格式混乱(2023-09-01 vs 01/09/23) | 解析错误,特征提取失败 |
二、数据清洗流程与工具
1. 缺失值处理
-
检测缺失值:
# 统计每列缺失比例 missing_ratio = data.isnull().mean() * 100 print(missing_ratio.sort_values(ascending=False)) -
处理方法:
方法 适用场景 代码示例 直接删除 缺失比例高(>80%)或无关字段 data.dropna(axis=1, thresh=len(data)*0.2)均值/中位数填充 数值型字段,缺失随机分布 data['age'].fillna(data['age'].median(), inplace=True)众数填充 类别型字段 data['gender'].fillna(data['gender'].mode()[0], inplace=True)插值法 时间序列数据(如温度记录) data['temperature'].interpolate(method='time', inplace=True)模型预测填充 复杂场景(如多变量关联缺失) 使用KNN或随机森林预测缺失值(见下方代码) KNN填充示例:
from sklearn.impute import KNNImputer imputer = KNNImputer(n_neighbors=5) data_filled = pd.DataFrame(imputer.fit_transform(data), columns=data.columns)
2. 异常值处理
-
检测方法:
- 描述性统计:检查最小/最大值是否合理
print(data.describe()) - 箱线图(Boxplot):
plt.figure(figsize=(8,4)) sns.boxplot(x=data['income']) plt.title("Income Distribution") plt.show() - Z-Score法(正态分布数据):
z_scores = (data['value'] - data['value'].mean()) / data['value'].std() outliers = data[abs(z_scores) > 3] # Z>3为异常 - IQR法(非正态分布数据):
Q1 = data['age'].quantile(0.25) Q3 = data['age'].quantile(0.75) IQR = Q3 - Q1 lower_bound = Q1 - 1.5 * IQR upper_bound = Q3 + 1.5 * IQR
- 描述性统计:检查最小/最大值是否合理
-
处理方法:
方法 代码示例 删除异常值 data = data[(data['age'] >= 0) & (data['age'] <= 100)]截断(Winsorize) from scipy.stats.mstats import winsorize<br>data['income'] = winsorize(data['income'], limits=[0.05, 0.05])分箱(Binning) data['age_bin'] = pd.cut(data['age'], bins=[0,18,35,60,100])
3. 重复数据处理
-
检测与删除:
# 检测完全重复的行 duplicates = data.duplicated() print(f"重复行数量: {duplicates.sum()}")# 删除重复行(保留第一个出现值) data.drop_duplicates(keep='first', inplace=True) -
部分重复处理(如用户ID重复但信息不同):
# 按关键字段去重(如用户ID) data.drop_duplicates(subset=['user_id'], keep='last', inplace=True)
4. 不一致数据修正
-
格式统一:
# 日期格式标准化 data['date'] = pd.to_datetime(data['date'], format='mixed')# 文本大小写统一 data['category'] = data['category'].str.lower()# 单位统一(如货币转换) data['price'] = data['price'].apply(lambda x: x * 6.5 if 'USD' in x else x ) -
逻辑校验:
# 检查年龄与出生日期是否一致 current_year = pd.Timestamp.now().year data['calculated_age'] = current_year - data['birth_year'] invalid_age = data[abs(data['age'] - data['calculated_age']) > 1]
三、实战案例:电商订单数据清洗
原始数据问题
import pandas as pd
data = pd.DataFrame({'order_id': [101, 102, 103, 104, 105, 106],'user_id': [1, 2, 2, 3, 4, None],'price': [29.9, 199.0, 199.0, -50.0, 89.9, 120.0],'order_date': ['2023-09-01', '01/09/2023', '2023-09-01', '2023-10-32', None, '2023-09-05']
})
清洗步骤
-
处理缺失值:
# 填充user_id缺失值(假设新用户ID为999) data['user_id'].fillna(999, inplace=True)# 删除order_date缺失的行 data.dropna(subset=['order_date'], inplace=True) -
修正异常价格:
# 删除价格为负的订单 data = data[data['price'] > 0]# 截断价格超过200的订单(假设业务上限为200) data['price'] = data['price'].clip(upper=200) -
标准化日期格式:
# 转换日期并过滤无效日期(如2023-10-32) data['order_date'] = pd.to_datetime(data['order_date'], errors='coerce') data.dropna(subset=['order_date'], inplace=True) -
去重:
# 按user_id和order_date去重(保留最后一条) data.drop_duplicates(subset=['user_id', 'order_date'], keep='last', inplace=True)
清洗后数据
| order_id | user_id | price | order_date |
|---|---|---|---|
| 101 | 1 | 29.9 | 2023-09-01 |
| 102 | 2 | 199.0 | 2023-09-01 |
| 105 | 4 | 89.9 | NaT(已删除) |
| 106 | 999 | 120.0 | 2023-09-05 |
四、注意事项
- 避免过度清洗:保留合理的数据多样性(如正常的价格波动)。
- 记录清洗日志:跟踪每一步操作的影响(如删除了多少行数据)。
- 业务规则优先:与领域专家确认异常定义(如“用户年龄>100是否合理”)。
- 自动化流水线:对持续更新的数据,使用Pipeline封装清洗步骤:
from sklearn.pipeline import Pipelineclean_pipeline = Pipeline([('fill_na', SimpleImputer(strategy='constant', fill_value=999)),('remove_duplicates', DropDuplicates(subset=['user_id'])),('clip_outliers', ColumnTransformer([('clip', FunctionTransformer(lambda x: x.clip(0, 200)), ['price'])])), ])
数据变换
以下是对数据变换的更紧凑、更细节化的总结,突出核心要点与实用技巧:
一、标准化/归一化:核心差异
| 方法 | 公式 | 适用场景 | 异常值敏感度 | Scikit-learn工具 |
|---|---|---|---|---|
| Z-score | z = x − μ σ z = \frac{x - \mu}{\sigma} z=σx−μ | 数据近似正态分布,线性模型(SVM、回归) | 高 | StandardScaler |
| Min-Max | x ′ = x − x min x max − x min x' = \frac{x - x_{\min}}{x_{\max} - x_{\min}} x′=xmax−xminx−xmin | 图像像素、神经网络输入层 | 高 | MinMaxScaler |
| Robust | x ′ = x − median I Q R x' = \frac{x - \text{median}}{IQR} x′=IQRx−median | 存在异常值,非正态分布 | 低 | RobustScaler |
关键技巧:
- 树模型(如随机森林、XGBoost)无需标准化,但对特征组合敏感的模型(FM、NN)需要。
- 归一化到[-1,1]可能对某些激活函数(如tanh)更友好。
二、非线性变换:快速选择
- 对数变换:右偏数据(如收入),用
np.log1p避免零值。 - Box-Cox变换:需数据严格为正,自动优化λ值(
scipy.stats.boxcox)。 - 分位数变换:强制数据服从均匀/正态分布(
QuantileTransformer)。
示例代码:
from sklearn.preprocessing import PowerTransformer
pt = PowerTransformer(method='yeo-johnson') # 兼容零/负值
X_transformed = pt.fit_transform(X)
三、分类变量编码:场景化方案
| 方法 | 优点 | 缺点 | 适用模型 |
|---|---|---|---|
| One-Hot | 无顺序假设,兼容所有模型 | 高维稀疏,需处理共线性 | 线性模型、神经网络 |
| Target编码 | 保留类别与目标的关系 | 需防过拟合(如交叉验证) | 树模型、高基数类别 |
| Embedding | 低维稠密,捕捉语义相似性 | 需预训练或端到端学习 | 深度学习(NLP/推荐系统) |
关键点:
- 高基数类别优先用
Target Encoding或CatBoost内置处理。 - 树模型可尝试
Label Encoding,但需验证类别顺序是否合理。
四、特征工程:高效操作
- 数值特征:
- 交叉特征:加减乘除(如电商中“单价×购买量=总金额”)。
- 分箱:等频分箱(
pd.qcut)或等宽分箱(pd.cut),捕捉非线性。
- 时间特征:
- 提取周期性(星期、月份),滑动窗口统计(均值、标准差)。
- 文本特征:
- 短文本用
TF-IDF,长文本用BERT嵌入,高维稀疏时用TruncatedSVD降维。
- 短文本用
代码示例:
# 时间特征处理
df['hour'] = df['timestamp'].dt.hour
df['is_weekend'] = df['timestamp'].dt.weekday >= 5
五、降维:选择策略
| 方法 | 核心思想 | 适用场景 | 注意事项 |
|---|---|---|---|
| PCA | 线性投影最大化方差 | 高维数据可视化/去噪 | 需先标准化,可能丢失非线性信息 |
| t-SNE | 非线性保留局部结构 | 可视化高维聚类 | 计算代价高,不用于特征输入 |
| UMAP | 平衡速度与局部/全局结构 | 大规模数据可视化/预处理 | 参数敏感,需调参 |
经验:
- 输入特征>50时优先用PCA,保留95%方差(
n_components=0.95)。 - 避免对树模型使用降维,可能破坏特征重要性。
六、避坑指南
- 数据泄露:
- 所有变换必须仅用训练集统计量!用
Pipeline确保流程:from sklearn.pipeline import make_pipeline pipe = make_pipeline(StandardScaler(), SVM()) pipe.fit(X_train, y_train)
- 所有变换必须仅用训练集统计量!用
- 异常值处理:
- 缩尾处理(
np.clip)或中位数填充,避免破坏分布。
- 缩尾处理(
- 评估验证:
- 对KNN、SVM等敏感模型,对比不同缩放方法的分类边界(如决策边界图)。
七、端到端流程
- 输入检查:分布(直方图/Q-Q图)、缺失值、异常值。
- 数值特征:缩放→非线性变换→分箱。
- 分类特征:编码→嵌入(可选)。
- 特征构造:领域知识驱动交叉/聚合。
- 输出验证:模型在验证集的表现波动是否<5%。
总结:数据变换需与模型特性深度耦合,通过实验迭代优化。记住:“Garbage in, garbage out”——宁可花80%时间在数据准备,而非调参!
特征工程
特征工程:从原始数据到模型燃料的核心技术
特征工程是机器学习的“炼金术”,旨在将原始数据转化为模型可理解的强特征,直接影响模型性能上限。以下是结构化拆解:
一、核心目标与价值
- 目标:构造高信息量、低冗余、适配模型的特征。
- 价值:
- 提升模型准确率(如添加用户历史行为统计特征)
- 降低计算成本(通过降维/特征选择)
- 增强可解释性(如分箱后的年龄组代替原始值)
二、特征构造:从原始数据中“挖掘金子”
-
时间特征
- 基础字段:年、月、日、小时、星期几、是否节假日
- 衍生特征:时间间隔(如上次购买距今的天数)、滑动窗口统计(过去7天均值)
df['purchase_hour'] = df['timestamp'].dt.hour df['days_since_last_purchase'] = (current_date - df['last_purchase_date']).dt.days -
交互特征(组合特征)
- 数值交互:加减乘除(如“单价×数量=总价”)
- 类别交叉:笛卡尔积(如“地区×产品类型”生成组合标签)
df['price_per_sqmeter'] = df['total_price'] / df['area'] -
统计聚合特征
- 单维度统计:用户历史购买金额的均值、最大值、方差
- 跨表关联:订单表按用户ID聚合的订单数、退货率
user_stats = orders.groupby('user_id')['amount'].agg(['mean', 'max']) -
文本/图像特征
- 文本:TF-IDF关键词权重、BERT句向量、情感分析得分
- 图像:边缘特征、颜色直方图、预训练CNN提取的特征图
三、特征变换:提升模型适配性
-
分箱(Binning)
- 等宽分箱:固定区间宽度(如年龄每10年一档)
- 等频分箱:保证每箱样本量均衡
- 模型分箱:使用决策树寻找最优分割点
df['age_bin'] = pd.cut(df['age'], bins=[0,18,35,60,100], labels=['child', 'young', 'adult', 'senior']) -
非线性变换
- 对数变换:处理右偏分布(
np.log1p避免零值) - Box-Cox变换:自动优化正态性(仅适用于正值)
- 分位数变换:强制服从指定分布(如正态、均匀)
- 对数变换:处理右偏分布(
-
高基数类别处理
- 目标编码(Target Encoding):用目标变量的统计量(如均值)代替类别
- 频率编码:使用类别出现频率作为特征值
- 嵌入编码(Embedding):通过神经网络学习低维表示(如Word2Vec)
四、特征选择:剔除噪声与冗余
| 方法 | 原理 | 适用场景 |
|---|---|---|
| 过滤法 | 基于统计指标(如方差、卡方检验) | 快速初筛,计算成本低 |
| 包裹法 | 通过模型性能迭代选择特征子集 | 精确但计算代价高(递归特征消除) |
| 嵌入法 | 模型训练中自动选择(如L1正则化) | 与模型耦合,高效 |
实用技巧:
- 对树模型,直接使用
feature_importances_筛选重要性>阈值特征 - 对线性模型,结合Lasso回归的系数稀疏性做特征剔除
五、自动化特征工程工具
- FeatureTools:自动生成跨表聚合特征(如“用户最近3次登录时间标准差”)
- TSFresh:针对时间序列自动提取数百种统计特征(如自相关性、傅里叶变换系数)
- AutoFeat:自动构造多项式特征并进行显著性筛选
# FeatureTools示例
import featuretools as ft
es = ft.EntitySet()
es = es.entity_from_dataframe(entity_id='users', dataframe=users_df, index='user_id')
features, feature_defs = ft.dfs(entityset=es, target_entity='users')
六、避坑指南与最佳实践
-
避免数据泄露:
- 所有统计量(如Target Encoding的均值)必须仅从训练集计算!
- 使用
Pipeline封装预处理与模型训练:from sklearn.pipeline import Pipeline pipe = Pipeline([('encoder', TargetEncoder()), ('model', RandomForest())])
-
领域知识驱动:
- 在电商场景中,构造“商品价格与类目平均价格的比值”可能比单纯价格更有效
- 在风控场景中,组合“申请时间与工作时段的重叠度”作为特征
-
迭代验证:
- 通过AB测试对比不同特征组合的模型性能
- 监控特征稳定性(如PSI指标)防止线上数据分布偏移
七、终极心法
- “Less is More”:优先构造10个强特征,而非100个弱特征。
- “Think Like a Model”:理解模型如何利用特征(如线性模型依赖线性可分性,NN偏好稠密低维输入)。
- “Data First, Algorithm Second”:特征工程提升的上限远高于调参!
总结:特征工程是融合领域知识、数据直觉与工程技巧的艺术。掌握核心方法后,需在业务场景中反复迭代,才能炼出“模型友好”的金牌特征。
相关文章:
06-机器学习-数据预处理
数据清洗 数据清洗是数据预处理的核心步骤,旨在修正或移除数据集中的错误、不完整、重复或不一致的部分,为后续分析和建模提供可靠基础。以下是数据清洗的详细流程、方法和实战示例: 一、数据清洗的核心任务 问题类型表现示例影响缺失值数值…...
01学习预热篇(D6_正式踏入JVM深入学习前的铺垫)
目录 学习前言 一、虚拟机的结构 1. Java虚拟机参数设置 2. java 堆 3. 出入栈 4. 局部变量表 1> 局部变量的剖析 2> 局部变量的回收 5. 操作数栈 1> 常量入栈指令 2> 局部变量值转载到栈中指令 3> 将栈顶值保存到局部变量中指令 6. 帧数据区 7. 栈…...
【漫话机器学习系列】068.网格搜索(GridSearch)
网格搜索(Grid Search) 网格搜索(Grid Search)是一种用于优化机器学习模型超参数的技术。它通过系统地遍历给定的参数组合,找出使模型性能达到最优的参数配置。 网格搜索的核心思想 定义参数网格 创建一个包含超参数值…...
https数字签名手动验签
以bing.com 为例 1. CA 层级的基本概念 CA 层级是一种树状结构,由多个层级的 CA 组成。每个 CA 负责为其下一层级的实体(如子 CA 或终端实体)颁发证书。层级结构的顶端是 根 CA(Root CA),它是整个 PKI 体…...
【股票数据API接口36】如何获取股票当天逐笔大单交易数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据
如今,量化分析在股市领域风靡一时,其核心要素在于数据,获取股票数据,是踏上量化分析之路的第一步。你可以选择亲手编写爬虫来抓取,但更便捷的方式,莫过于利用专业的股票数据API接口。自编爬虫虽零成本&a…...
RocketMQ 中如何实现消息的可靠传递?
引言 作为头部消息队列开源中间件,学习其中的技术方案并且总结可靠性和健壮性,提升我们的架构思维和解决问题的能力 。 在 RocketMQ 中实现消息的可靠传递可以从多个方面入手,涵盖生产者、Broker 以及消费者等不同环节。 生产者端 1. 同步…...
Elasticsearch+kibana安装(简单易上手)
下载ES( Download Elasticsearch | Elastic ) 将ES安装包解压缩 解压后目录如下: 修改ES服务端口(可以不修改) 启动ES 记住这些内容 验证ES是否启动成功 下载kibana( Download Kibana Free | Get Started Now | Elastic ) 解压后的kibana目…...
视频多模态模型——视频版ViT
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细解读多模态论文《ViViT: A Video Vision Transformer》,2021由google 提出用于视频处理的视觉 Transformer 模型,在视频多模态领域有…...
单机伪分布Hadoop详细配置
目录 1. 引言2. 配置单机Hadoop2.1 下载并解压JDK1.8、Hadoop3.3.62.2 配置环境变量2.3 验证JDK、Hadoop配置 3. 伪分布Hadoop3.1 配置ssh免密码登录3.2 配置伪分布Hadoop3.2.1 修改hadoop-env.sh3.2.2 修改core-site.xml3.2.3 修改hdfs-site.xml3.2.4 修改yarn-site.xml3.2.5 …...
Ollama windows安装
Ollama 是一个开源项目,专注于帮助用户本地化运行大型语言模型(LLMs)。它提供了一个简单易用的框架,让开发者和个人用户能够在自己的设备上部署和运行 LLMs,而无需依赖云服务或外部 API。这对于需要数据隐私、离线使用…...
鸿蒙next 自定义日历组件
效果图预览 20250124-113957 使用说明 1.选择日期左右箭头,实现每月日历切换,示例中超出当前月份,禁止进入下一月,可在代码更改 2.日历中显示当前选择的日期,选中的日期颜色可自定义 3.日历中可展示历史记录作为数据…...
Nginx 开发总结
文章目录 1. Nginx 基础概念1-1、什么是 Nginx1-2、Nginx 的工作原理1-3、Nginx 的核心特点1-4、Nginx 的常见应用场景1-5、Nginx 与 Apache 的区别1-6、 Nginx 配置的基本结构1-7、Nginx 常见指令 2. Nginx 配置基础2-1、Nginx 配置文件结构2-2、全局配置 (Global Block)2-3、…...
Van-Nav:新年,将自己学习的项目地址统一整理搭建自己的私人导航站,供自己后续查阅使用,做技术的同学应该都有一个自己网站的梦想
嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 Van-Nav是一个基于Vue.js开发的导航组件库,它提供了多种预设的样式和灵活的配置选项,使得开发者可以轻松地定制出符合项目需求…...
层次聚类构建层次结构的簇
层次聚类(Hierarchical Clustering)可以通过自定义函数来完成。层次聚类可以分为两种方法:凝聚型(Agglomerative)和分裂型(Divisive)。这里主要介绍一种常用的凝聚型方法,它是自底向…...
计算机网络__基础知识问答
Question: 1)在计算机网络的5层结构中,每一层的功能大概是什么? 2)交换机的功能?https://www.bilibili.com/video/BV1na4y1L7Ev 3)路由器的功能?https://www.bilibili.com/video/BV1hv411k7n…...
网易云音乐歌名可视化:词云生成与GitHub-Pages部署实践
引言 本文将基于前一篇爬取的网易云音乐数据, 利用Python的wordcloud、matplotlib等库, 对歌名数据进行深入的词云可视化分析. 我们将探索不同random_state对词云布局的影响, 并详细介绍如何将生成的词云图部署到GitHub Pages, 实现数据可视化的在线展示. 介绍了如何从原始数据…...
PHP根据IP地址获取地理位置城市和经纬度信息
/** 根据IP地址 获取地理位置*/ function getLocationByIP($ip) {$url "http://ip-api.com/json/{$ip}?langzh-CN&fieldsstatus,message,country,countryCode,region,regionName,city,lat,lon,timezone,isp,org,as";$response file_get_contents($url);$data …...
渲染流程概述
渲染流程包括 CPU应用程序端渲染逻辑 和 GPU渲染管线 一、CPU应用程序端渲染逻辑 剔除操作对物体进行渲染排序打包数据调用Shader SetPassCall 和 Drawcall 1.剔除操作 视椎体剔除 (给物体一个包围盒,利用包围盒和摄像机的视椎体进行碰撞检测…...
【单细胞-第三节 多样本数据分析】
文件在单细胞\5_GC_py\1_single_cell\1.GSE183904.Rmd GSE183904 数据原文 1.获取临床信息 筛选样本可以参考临床信息 rm(list ls()) library(tinyarray) a geo_download("GSE183904")$pd head(a) table(a$Characteristics_ch1) #统计各样本有多少2.批量读取 学…...
libOnvif通过组播不能发现相机
使用libOnvif库OnvifDiscoveryClient类, auto discovery new OnvifDiscoveryClient(QUrl(“soap.udp://239.255.255.250:3702”), cb.Build()); 会有错误: end of file or no input: message transfer interrupted or timed out(30 sec max recv delay)…...
项目集成GateWay
文章目录 1.环境搭建1.创建sunrays-common-cloud-gateway-starter模块2.目录结构3.自动配置1.GateWayAutoConfiguration.java2.spring.factories 3.pom.xml4.注意:GateWay不能跟Web一起引入! 1.环境搭建 1.创建sunrays-common-cloud-gateway-starter模块…...
2025年01月28日Github流行趋势
项目名称:maybe 项目地址url:https://github.com/maybe-finance/maybe项目语言:Ruby历史star数:37540今日star数:1004项目维护者:zachgoll, apps/dependabot, tmyracle, Shpigford, crnsh项目简介ÿ…...
使用Ollama本地部署DeepSeek R1
前言 DeepSeek是一款开源的智能搜索引擎,能够通过深度学习技术提高搜索的智能化水平。如果你正在寻找一种方式来将DeepSeek部署在本地环境中,Ollama是一个非常方便的工具,它允许你在本地快速部署并管理各种基于AI的模型。 在本篇博客中&…...
doris:异常数据处理
在导入过程中,源数据列与目标列的数据类型可能存在不一致的情况。导入过程会对这些类型不一致的数据进行转换,但在转换过程中可能会出现字段类型不匹配、字段超长、精度不匹配等问题,从而导致转换失败。 为了处理这些异常情况,Do…...
chrome源码剖析—UI架构消息机制
Chrome 浏览器的 UI 架构是高度模块化且基于现代图形技术和用户界面设计理念构建的。它的 UI 架构涵盖了窗口、标签页、控件、通知、菜单等组件的管理和交互。Chrome 的 UI 基本上是通过 views 框架和 Aura(Chrome 自己的 UI 层)构建的,后者又…...
.NET 9.0 的 Blazor Web App 项目、Bootstrap Blazor 组件库、自定义日志 TLog 使用备忘
一、设计目标:通用、容易修改、使用简单,所有代码保存在一个文件中,方便移植到其他项目使用。 注:示例使用 Bootstrap Blazor 组件库和 EF Core 、Sqlite,需要先使用 Nuget包管理器 添加对应的包。 namespace Blazor…...
单片机基础模块学习——超声波传感器
一、超声波原理 左边发射超声波信号,右边接收超声波信号 左边的芯片用来处理超声波发射信号,中间的芯片用来处理接收的超声波信号 二、超声波原理图 T——transmit 发送R——Recieve 接收 U18芯片对输入的N_A1信号进行放大,然后输入给超声…...
java 正则表达式匹配Matcher 类
Matcher 类 用法 在 Java 中,Matcher 类是用于匹配正则表达式的工具,而 group() 方法是 Matcher 类中的一个重要方法,用于提取匹配结果中的捕获组(captured groups)。以下是对 group() 方法的详细解释: 1.…...
使用 OpenResty 构建高效的动态图片水印代理服务20250127
使用 OpenResty 构建高效的动态图片水印代理服务 在当今数字化的时代,图片在各种业务场景中广泛应用。为了保护版权、统一品牌形象,动态图片水印功能显得尤为重要。然而,直接在后端服务中集成水印功能,往往会带来代码复杂度增加、…...
Elastic Agent 对 Kafka 的新输出:数据收集和流式传输的无限可能性
作者:来 Elastic Valerio Arvizzigno, Geetha Anne 及 Jeremy Hogan 介绍 Elastic Agent 的新功能:原生输出到 Kafka。借助这一最新功能,Elastic 用户现在可以轻松地将数据路由到 Kafka 集群,从而实现数据流和处理中无与伦比的可扩…...
