如何找到具有一定数量大于阈值的值的窗口的索引?
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/…以上是关于如何找到具有一定数量大于阈值的值的窗口的索引?的主要内容,如果未能解决你的问题,请参考以下文章
如何找到字典中每个键的最小值/最大值?以及如何找到每个键的值的数量?