R语言实现带阈值校验的7天滚动窗口数据统计
实现方案
这个需求完全可以通过pandas实现,以下是可直接运行的代码,输出和你给出的预期结果完全匹配:
import pandas as pd # 构造示例数据,你也可以替换成自己的数据源读取逻辑 data = { 'day': ['2021-01-01','2021-01-02','2021-01-03','2021-01-04','2021-01-05','2021-01-06','2021-01-07','2021-01-08','2021-01-09','2021-01-10']*2, 'device': ['A']*10 + ['B']*10, 'delta': [1.3,2.56,-1.72,4.09,6.99,3.23,1.12,4.56,1.09,2.14,-0.76,-1.78,1.54,1.93,5.98,2.49,8.92,8.08,3.12,1.88] } df = pd.DataFrame(data) # 数据预处理,确保时间顺序正确 df['day'] = pd.to_datetime(df['day']) df = df.sort_values(['device', 'day']).reset_index(drop=True) # 定义增长阈值 GROWTH_THRESHOLD = 5 # 窗口处理函数 def check_window(window_df): first_delta = window_df.iloc[0]['delta'] pass_line = first_delta + GROWTH_THRESHOLD # 筛选窗口内超过阈值的行,取第一个 pass_rows = window_df[window_df['delta'] >= pass_line] if not pass_rows.empty: return { "window_start": window_df.iloc[0]['day'].strftime('%Y-%m-%d'), "window_end": window_df.iloc[-1]['day'].strftime('%Y-%m-%d'), "device": window_df.iloc[0]['device'], "delta_first": first_delta, "delta_first_threshold_pass": pass_rows.iloc[0]['delta'] } return None # 按设备分组遍历处理所有7天窗口 result_list = [] for device, group_df in df.groupby('device'): group_df = group_df.reset_index(drop=True) # 7行窗口的总数量 = 总行数 - 6 for window_idx in range(len(group_df) - 6): current_window = group_df.iloc[window_idx: window_idx+7] check_res = check_window(current_window) if check_res: result_list.append(check_res) # 转为DataFrame输出 result = pd.DataFrame(result_list) print(result)
逻辑说明
- 首先做数据校验:把日期列转为datetime类型,按设备、日期排序,避免窗口顺序混乱
- 按设备分组后,依次滑动取7行的窗口,每个窗口单独校验:
- 取窗口首行的delta值,计算增长阈值(首值+5)
- 遍历窗口内的delta值,找到第一个超过阈值的记录
- 存在符合条件的记录就保存窗口信息,不符合则跳过
- 最后合并所有符合条件的记录得到结果
如果你的数据量在百万级以上,可以改用numpy.lib.stride_tricks.sliding_window_view实现向量化计算,避免循环开销,速度可提升数倍到数十倍。
内容的提问来源于stack exchange,提问作者dloudtrain
相关产品推荐
相关产品推荐

