pandas 如何在Polars DataFrame中应用scipy过滤器

4sup72z8  于 2023-01-11  发布在  其他
关注(0)|答案(1)|浏览(129)

我目前在DataFrame中使用savgol filter,它有3列x、y、z,其中包含来自微控制器的信号的浮点值
在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)

如何在polar df中实现相同功能
我试过用这种方法

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

上面的代码返回属性错误。“numpy.ndarray”对象没有属性“alias”
编辑:我的问题相当简单,在polars DataFrame中实现scipy过滤器的正确语法/方法是什么?

0s0u357o

0s0u357o1#

因此,在极坐标中使用自定义函数的一般方法取决于您是想在单个元素(apply)上还是在整个系列(map)上使用它们。在您的情况下,它将是整个系列。有关这两个选项的更详细说明,您可以查看用户指南here
因此,根据您希望更改整个DataFrame还是保留原始列,这里有两种解决方案:

数据

import polars as pl
from scipy.signal import savgol_filter
import numpy as np

n = 100
df = pl.DataFrame(
    {
        "x": np.random.randint(0, 100, n),
        "y": np.random.randint(0, 100, n),
        "z": np.random.randint(0, 100, n),
    }
)

溶液1

df.select(pl.all().map(lambda x: savgol_filter(x.to_numpy(), 51, 1)).explode())

溶液2

df.with_columns(
    [
        pl.all()
        .map(lambda x: savgol_filter(x.to_numpy(), 51, 1))
        .explode()
        .suffix("_savgol")
    ]
)

如果不想对所有列应用该函数,可以将pl.all()替换为pl.col("x")

相关问题