You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Polars DataFrame中应用Scipy的Savgol滤波器

在Polars DataFrame中应用Scipy Savitzky-Golay滤波器的正确方法

问题背景

我需要给存储微控制器浮点型信号数据的DataFrame(包含x、y、z三列)应用Savitzky-Golay滤波器。在Pandas中实现非常直接:

df["x"] = savgol_filter(df["x"], 51, 1)
df["y"] = savgol_filter(df["y"], 51, 1)
df["z"] = savgol_filter(df["z"], 51, 1)

但在Polars中尝试以下代码时出现报错:

df.with_columns(
    (savgol_filter(df["x"], 51, 1)).alias("x"),
    (savgol_filter(df["y"], 51, 1)).alias("y"),
    (savgol_filter(df["z"], 51, 1)).alias("z"),
)

报错信息:

AttributeError: 'numpy.ndarray' object has no attribute 'alias'

原因分析

报错核心是:savgol_filter处理Polars列后返回的是NumPy数组,而Polars的with_columns方法只接受Polars表达式或Series,NumPy数组没有Polars的alias()方法,因此触发报错。

正确实现方法

方法1:使用map_batches(推荐,适配Polars表达式风格)

通过map_batches将列作为Series传递给savgol_filter,返回的结果会自动转为Polars表达式,支持Polars的懒执行特性:

import polars as pl
from scipy.signal import savgol_filter

df = df.with_columns(
    pl.col("x").map_batches(lambda series: savgol_filter(series, 51, 1)).alias("x"),
    pl.col("y").map_batches(lambda series: savgol_filter(series, 51, 1)).alias("y"),
    pl.col("z").map_batches(lambda series: savgol_filter(series, 51, 1)).alias("z")
)

方法2:将NumPy数组转为Polars Series

直接把savgol_filter返回的数组包装成Polars Series,这样就能正常调用alias()指定列名:

import polars as pl
from scipy.signal import savgol_filter

df = df.with_columns(
    pl.Series(savgol_filter(df["x"], 51, 1)).alias("x"),
    pl.Series(savgol_filter(df["y"], 51, 1)).alias("y"),
    pl.Series(savgol_filter(df["z"], 51, 1)).alias("z")
)

内容的提问来源于stack exchange,提问作者Sujith Christopher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 08:22:50