如何在Polars中计算窗口与常量向量的点积?
在Polars Rolling窗口中计算与静态数组的点积
你的报错原因确实是第一个滚动窗口仅包含1个元素,而静态数组const长度为2,二者维度不匹配导致点积操作失败。以下是两种可行的实现方式:
通用解决方案(适配任意权重数组)
通过条件判断窗口内元素数量是否与静态数组长度一致,仅在满足条件时计算点积,否则返回None:
import polars as pl import numpy as np dummy_data = { "id_": [1, 2, 3, 4, 5, 6, 7, 8], "value": [1, 1, 2, 2, 3, 3, 4, 4] } const = np.array([.5, .5]) df_ = pl.DataFrame(dummy_data) df_ = df_.set_sorted("id_") result = df_.rolling("id_", period="2i").agg( pl.when(pl.col("value").arr.lengths() == len(const)) .then(pl.col("value").dot(pl.lit(const))) .otherwise(None) .alias("value") ) print(result)
执行后输出与你预期的expected结果完全一致。
特例优化(当权重为均匀分布时)
由于你的const是[0.5, 0.5],本质等价于计算窗口内元素的平均值,因此可以直接使用Polars内置的滚动均值方法简化代码:
result = df_.rolling("id_", period="2i").agg(pl.col("value").mean().alias("value"))
注意:该方法仅适用于权重均匀的场景,若后续const调整为非均匀权重(如[0.3, 0.7]),请使用通用解决方案。
内容的提问来源于stack exchange,提问作者Nelson Griffiths
相关产品推荐
相关产品推荐

