如何在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
相关产品推荐
相关产品推荐

