Polars中filter()与pl.corr()结合使用时出现的异常值问题分析
2025-05-04 16:03:40作者:申梦珏Efrain
在使用Polars进行数据分析时,我们经常会遇到需要计算分组内两列相关系数的情况。本文将深入探讨一个特定场景下出现的异常值问题:当我们在计算相关系数时使用filter()过滤数据,并通过over()函数将结果广播到整个分组时,某些行会出现非预期的极小值。
问题现象
考虑以下示例数据:
import polars as pl
df = pl.DataFrame({
"a": [1, 2, 3, 1, 2, 3],
"b": [4, 3, 0, 1, 2, 0],
"c": ["first", "first", "first", "second", "second", "second"],
})
我们想要计算每个分组内列a和列b的相关系数,但只考虑b列大于0的行。使用group_by().agg()方法可以得到正确结果:
gt0 = pl.col("b") > 0
df_group = df.filter(gt0).group_by("c").agg(corr=pl.corr("a", "b"))
结果正确显示为:
first -1.0
second 1.0
然而,当我们尝试使用over()函数将结果广播回原始数据时:
df_window = df.with_columns(
corr=pl.corr(
pl.col("a").filter(gt0),
pl.col("b").filter(gt0),
).over("c"),
)
部分行出现了异常小的数值(如2.2510e-314),而不是预期的-1.0或1.0。
技术分析
预期行为
从逻辑上讲,我们期望:
- 在每个分组内,先过滤掉b列不大于0的行
- 计算剩余行的a列和b列的相关系数
- 将这个相关系数广播到分组内的所有行
实际行为
实际结果中,对于被过滤掉的行(b列不大于0的行),相关系数计算结果出现了异常小的浮点数,这些值实际上是浮点数的"非数"表示。
根本原因
根据Polars核心开发者的解释,这种表达式本应引发错误。因为在窗口函数中,除非是标量值,否则不允许返回比窗口大小更少的行数。然而在当前实现中,系统没有正确验证这一约束,导致了异常值的出现。
解决方案
目前推荐的替代方案是:
- 先使用filter()过滤数据
- 计算分组相关系数
- 使用join操作将结果合并回原始数据
例如:
corr_df = df.filter(gt0).group_by("c").agg(corr=pl.corr("a", "b"))
result = df.join(corr_df, on="c", how="left")
这种方法虽然多了一步操作,但能保证结果的正确性。
总结
Polars在处理窗口函数中的过滤操作时存在边界情况,特别是在计算统计量如相关系数时。开发者需要注意这种特殊情况,并采用更稳健的实现方式。该问题已被标记为bug,预计在未来的版本中会得到修复。在此之前,建议用户使用更明确的join操作来替代直接的窗口计算。
对于数据分析工作流来说,理解这类边界情况非常重要,特别是在处理真实世界数据时,过滤操作和分组计算都是常见需求。保持对计算结果合理性的验证习惯,可以帮助我们及早发现并规避这类问题。
登录后查看全文
热门项目推荐
相关项目推荐
kernelopenEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。C074
MiniMax-M2.1从多语言软件开发自动化到复杂多步骤办公流程执行,MiniMax-M2.1 助力开发者构建下一代自主应用——全程保持完全透明、可控且易于获取。Python00
kylin-wayland-compositorkylin-wayland-compositor或kylin-wlcom(以下简称kywc)是一个基于wlroots编写的wayland合成器。 目前积极开发中,并作为默认显示服务器随openKylin系统发布。 该项目使用开源协议GPL-1.0-or-later,项目中来源于其他开源项目的文件或代码片段遵守原开源协议要求。C01
PaddleOCR-VLPaddleOCR-VL 是一款顶尖且资源高效的文档解析专用模型。其核心组件为 PaddleOCR-VL-0.9B,这是一款精简却功能强大的视觉语言模型(VLM)。该模型融合了 NaViT 风格的动态分辨率视觉编码器与 ERNIE-4.5-0.3B 语言模型,可实现精准的元素识别。Python00
GLM-4.7GLM-4.7上线并开源。新版本面向Coding场景强化了编码能力、长程任务规划与工具协同,并在多项主流公开基准测试中取得开源模型中的领先表现。 目前,GLM-4.7已通过BigModel.cn提供API,并在z.ai全栈开发模式中上线Skills模块,支持多模态任务的统一规划与协作。Jinja00
agent-studioopenJiuwen agent-studio提供零码、低码可视化开发和工作流编排,模型、知识库、插件等各资源管理能力TSX0130
Spark-Formalizer-X1-7BSpark-Formalizer 是由科大讯飞团队开发的专用大型语言模型,专注于数学自动形式化任务。该模型擅长将自然语言数学问题转化为精确的 Lean4 形式化语句,在形式化语句生成方面达到了业界领先水平。Python00
最新内容推荐
32位ECC纠错Verilog代码:提升FPGA系统可靠性的关键技术方案 Adobe Acrobat XI Pro PDF拼版插件:提升排版效率的专业利器 Qt控件CSS样式实例大全 - 打造现代化GUI界面的终极指南 Python开发者的macOS终极指南:VSCode安装配置全攻略 深入解析Windows内核模式驱动管理器:系统驱动管理的终极利器 PADS元器件位号居中脚本:提升PCB设计效率的自动化利器 谷歌浏览器跨域插件Allow-Control-Allow-Origin:前端开发调试必备神器 单总线CPU设计实训代码:计算机组成原理最佳学习资源 电脑PC网易云音乐免安装皮肤插件使用指南:个性化音乐播放体验 SAP S4HANA物料管理资源全面解析:从入门到精通的完整指南
项目优选
收起
deepin linux kernel
C
27
11
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
462
3.44 K
暂无简介
Dart
713
170
Ascend Extension for PyTorch
Python
268
305
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
190
74
React Native鸿蒙化仓库
JavaScript
283
331
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
842
419
openJiuwen agent-studio提供零码、低码可视化开发和工作流编排,模型、知识库、插件等各资源管理能力
TSX
453
130
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
10
1
华为昇腾面向大规模分布式训练的多模态大模型套件,支撑多模态生成、多模态理解。
Python
105
119