寻找累积计数急剧增长的x值起止位置的技术实现问题
定位累积计数急剧增长的区间(兼容短暂停顿)
EDIT: 补充了更多数据。
x = [0, 5, 6,15, 20, 40, 73, 100,101,102,103,104,105,106,108,111,115, 116,117,118,119,120,123,124,125,126,127, 128,129,130,131, 150,161,170, 183, 194, 210, 234, 257, 271,272,273,274, 275,276, 277,278,279,280,281,282,283,284,285,287, 288,291,292,293,294,295,296,297,298,300,301, 302,303,304,305,306,307,308,309,310,311, 340, 351, 358, 360, 380, 390, 400,401, 402,403, 404, 405, 408, 409, 413, 420, 425,426,427,428,429,430,431,432,433,434,435, 436, 440, 450, 455] y = np.arange(1, len(x)+1)
数据可视化后能看到多段累积计数急剧增长的区间,其中最后一段增长存在短暂停顿,但需要将其视为单一区间。
需求:定位每段累积计数急剧增长对应的x值起止索引,要求采用向量化方法提升处理效率。
此前基于Pandas的方法步骤繁琐且性能不佳,步骤如下:
- 偏移x数据并计算差值
- 判断连续差值是否低于阈值生成逻辑数组
- 对逻辑数组做滚动求和
- 定位滚动求和超过阈值的位置
- 对比前值确定起止时间
- 将时间加入索引列表
Riley提供了简洁的初始实现代码:
rate_threshold = 0.25 min_consecutive = 8 above_rate = np.gradient(y,x) >= rate_threshold sequence_diff = np.diff(np.lib.stride_tricks.sliding_window_view(above_rate, window_shape=min_consecutive).all(axis=1).astype(int)) intervals = np.hstack([np.argwhere(sequence_diff==1) + 1, np.argwhere(sequence_diff==-1) + min_consecutive-1])
但该代码会将最后一段急剧增长区间拆分为两段,不符合需求。
考虑在滑动窗口中加入平均处理,以兼容梯度短暂下降的情况,避免区间被错误拆分。
内容的提问来源于stack exchange,提问作者Mitch Anthony
相关产品推荐
相关产品推荐

