Python中解决rolling窗口apply返回多值及序列处理问题
解决方案
要实现滑动窗口内的元素批量更新,rolling.apply确实无法直接返回序列(要求返回标量),可以通过标记需要更新的索引范围的方式实现需求,具体步骤如下:
方法一:高效卷积标记(推荐大数据量)
import pandas as pd import numpy as np # 示例输入Series s = pd.Series([1, 0, 0, 1, 0, 1, 0, 0, 1]) window_size = 4 # 1. 标记所有符合条件的窗口结束位置:窗口首尾均为1 # shift(window_size-1) 获取当前位置对应的窗口起始元素 mask = (s.shift(window_size - 1) == 1) & (s == 1) # 2. 用卷积扩展标记,覆盖整个符合条件的窗口 # 卷积核为全1数组,将窗口结束位置的标记扩散到整个窗口范围 kernel = np.ones(window_size, dtype=int) to_update = np.convolve(mask.astype(int), kernel, mode='same').astype(bool) # 3. 更新序列:需要更新的位置设为1,其余保持原数值 result = s.where(~to_update, 1)
方法二:循环标记(直观易理解)
如果数据量不大,也可以直接遍历符合条件的窗口,标记对应的索引范围:
import pandas as pd import numpy as np s = pd.Series([1, 0, 0, 1, 0, 1, 0, 0, 1]) window_size = 4 mask = (s.shift(window_size - 1) == 1) & (s == 1) to_update = np.zeros(len(s), dtype=bool) # 遍历所有符合条件的窗口结束索引,标记窗口内的所有位置 for idx in s[mask].index: start_idx = idx - window_size + 1 to_update[start_idx:idx+1] = True result = s.where(~to_update, 1)
原方法问题说明
rolling.apply的设计是对每个窗口计算一个标量结果(比如均值、求和),并将这个标量作为窗口对应位置的输出值,因此无法返回修改后的整个窗口序列,也就无法实现批量更新窗口内元素的需求。
内容的提问来源于stack exchange,提问作者Priyanka sagwekar
相关产品推荐
相关产品推荐

