锚定滑动窗口(Anchored sliding window)开发需求技术问询
嘿,这个需求我很熟悉!固定起始点、动态扩展终点的滑动窗口逻辑,用Python的pandas就能轻松实现。我给你整理了具体的思路和代码示例,你可以直接套用或者根据自己的需求修改:
核心实现思路
- 先定位固定的窗口起始点(比如你说的0.10),找到它在数据框中的位置
- 从起始点开始,每次以1个单位的增量扩展窗口终点(不管是按行索引还是数值范围,都能灵活处理)
- 对每个窗口内的
Speed列执行你指定的条件函数 - 一旦满足条件,就在
Out列对应的位置生成输出;如果没满足,就继续扩展窗口
代码示例(按行索引扩展窗口)
这是最常用的按行扩展的场景,假设你的数据框包含位置列和Speed列:
import pandas as pd import numpy as np # 先构造一个示例数据框,你可以替换成自己的真实数据 df = pd.DataFrame({ 'Position': [0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.35], 'Speed': [12, 15, 18, 22, 19, 25, 21] }) # 固定窗口起始点的Position值 start_pos = 0.10 # 找到起始点对应的行索引 start_idx = df[df['Position'] == start_pos].index[0] # 初始化Out列,默认填充NaN df['Out'] = np.nan # ---------------------- # 这里替换成你自己的指定函数! # 示例:判断窗口内Speed的平均值是否大于20 def check_condition(speed_series): return speed_series.mean() > 20 # ---------------------- # 从起始点开始,依次扩展窗口终点(每次多包含一行) for end_idx in range(start_idx, len(df)): # 提取当前窗口的Speed数据 window_speed = df.loc[start_idx:end_idx, 'Speed'] # 检查条件是否满足 if check_condition(window_speed): # 满足条件的话,在Out列的终点行写入结果(这里写的是窗口平均值,你可以改) df.loc[end_idx, 'Out'] = round(window_speed.mean(), 2) # 如果只需要第一个满足条件的窗口,就加个break终止循环 # break # 查看结果 print(df)
按数值范围扩展窗口(如果你的终点是按Position数值增量调整)
如果你的窗口终点是按Position的数值(比如从0.10到0.15,再到0.20这种增量)来扩展,代码可以这么改:
import pandas as pd import numpy as np df = pd.DataFrame({ 'Position': [0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.35], 'Speed': [12, 15, 18, 22, 19, 25, 21] }) start_pos = 0.10 # 获取所有大于等于起始点的Position值,按顺序排列 possible_end_pos = df[df['Position'] >= start_pos]['Position'].sort_values().tolist() df['Out'] = np.nan # 替换成你自己的条件函数,示例:窗口内Speed的最大值是否大于22 def check_condition(speed_series): return speed_series.max() > 22 for end_pos in possible_end_pos: # 提取当前数值范围内的Speed数据 window_speed = df[(df['Position'] >= start_pos) & (df['Position'] <= end_pos)]['Speed'] if check_condition(window_speed): # 在对应终点Position的行写入结果(这里写的是窗口最大值) df.loc[df['Position'] == end_pos, 'Out'] = window_speed.max() # 可选:如果只需要第一个满足条件的结果,取消下面的注释 # break print(df)
自定义调整说明
- 修改起始点:把
start_pos改成你实际需要的固定值(比如0.10) - 替换条件函数:完全重写
check_condition函数,比如改成判断求和是否大于100,或者所有值都大于15等等 - 调整输出内容:在满足条件时,你可以把
Out列的内容改成任意你需要的输出(比如窗口的统计值、自定义标记等) - 终止逻辑:如果只需要第一个满足条件的窗口,就在满足条件时加上
break语句,停止后续扩展
内容的提问来源于stack exchange,提问作者PharmR
相关产品推荐
相关产品推荐

