如何找到具有一定数量大于阈值的值的窗口的索引?

Posted

技术标签:

【中文标题】如何找到具有一定数量大于阈值的值的窗口的索引?【英文标题】:How to find index of the window which has certain number of values greater than threshold? 【发布时间】:2019-12-20 00:37:08 【问题描述】:

我刚刚开始学习 python 并在这段代码中苦苦挣扎。我有一个数据框,如图所示。

我想在数据框中找到第一次出现的窗口,它有一定数量的大于阈值的值。

例如:

假设数据框的维度为 1000000 个值。我想将其划分为 1000 的滑动窗口,并且需要知道这 1000 个值是否至少有 10 个大于某个阈值的值。如果第一个窗口(点 0-999)没有至少 10 个大于某个阈值的值,则窗口将滑动并考虑值 1-1000。我必须找到第一次出现的窗口的索引,它至少有 10 个值大于阈值。

由于我在这里处理流数据,当数据帧中出现此类窗口时,我需要停止搜索。

我尝试了这段代码,但遇到关键错误,无法解决问题。

for i in np.arange(0,len(data)-999):
    for j in np.arange(0,1000):
        if data[i+j]>threshold:
            var_count=var_count+1
        if var_count>10:
            print("Anomaly has occurred")

示例数据如下所示,大约有 180 万行。

示例数据可能如下所示

data_sample=[1,1,0,0,0,2,1,1,1,1,1,2,1,1,1,1,1,1,2,1,2,2,1,0,0,2,2,2,2,1,1,1]            
data_sample=pd.DataFrame(data_sample)

threshold=1
window=5

因为我需要至少 2 个大于 1 的值,这将返回索引 18,因为在该索引处,我的长度为 5 的窗口至少有 2 个大于 1 的值。

【问题讨论】:

你怎么到 11?通过索引 8,您有 2 个高于 1 的值。在索引 12 处您只能得到 3 个高于 1 的值... 我更新了错误的样本数据,我再次用正确的数据更新了问题。 【参考方案1】:

你可以用卷积来做到这一点:

threshold = 10
window_size = 5
count_threshold = 3

kernel = np.ones(window_size)
over_threshold = (data['relevant_column'] > threshold).values
running_count = np.convolve(kernel, over_threshold)
np.nonzero(running_count >= count_threshold)[0]

或者使用 pandas 的类似想法rolling:

np.where(((data['relevant_column'] > threshold).rolling(window_size).sum() >= count_threshold))

【讨论】:

感谢您的回答。我有一个后续问题。 over_threshold = (data['relevant_column'] > threshold).values 这行代码不需要考虑整个数据帧吗?还是我误会了? 这取决于你的 DataFrame。您没有提供任何示例数据,因此无法知道。听起来你只是在看一个专栏。也许添加一些带有您预期输出的简单示例数据。保持较小,约 10 个值。 我已经添加了示例数据。我的示例数据只是一列数据框,大约有 180 万行。为此,我收到此错误> ValueError: object too deep for desired array @Bhakti 请制作您的示例数据代码,而不是图像。像pd.DataFrame([...], columns=[...]) 这样的代码,还包括预期输出。你不必使用真实的价值观,使用能够证明原则的价值观。使用像 4 而不是 1000 等的小滚动窗口。 至于你的错误 - ***.com/questions/15923081/…

以上是关于如何找到具有一定数量大于阈值的值的窗口的索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何找到给定范围内除以给定数字时具有一定余数的值的数量?

如何截断大于指定值的值的numpy数组?

如何找到具有值的数组索引?

如何找到字典中每个键的最小值/最大值?以及如何找到每个键的值的数量?

如何将地图中的值与阈值进行比较并将大于最小阈值的值放入集合中

如何使用 R 在向量中找到第二个非连续出现的值的索引?