在限制范围内计算数据点,并将缓冲区应用于孤立点 [数据分析]

Counting data points within limits, and applying buffer to isolated points [data analysis]

我一直在尝试解决这个问题:

我有一组数据点,对应于一组时间值。即 values =[1,2,3,4,5,6,7,8,4] times = [0.1,0.2,0.3,0.4]... 等等,它是 10hz 的采样率。

我需要找出两个限制之间花费的时间。例如,如果我的限制是 3 和 5,那么 3、4、5、4 在我的限制范围内。

如果我计算时间为(points -1) /sample rate的个数,或者分组的开始时间和结束时间,我会漏掉孤立的数据点(第二个4)

我建议使用两侧一半采样率的假想缓冲区来模拟孤立事件。

但我无法在代码中实现它 (python) 我需要一种遍历点、计算点数的方法,以及能够执行(点数-1)/采样率的配对。以及如何拾取奇异点并将缓冲区值应用于点数。

我似乎找不到 ifwhile 语句的正确组合来执行此操作。

这是一个可以满足您要求的函数。在指定限制范围内运行多个数据点的时间值等于数据点数乘以采样周期(即采样频率的倒数),孤立的单个点的值是采样周期的一半。

#!/usr/bin/env python

''' Estimate time of data points falling within specified limits 
    From 
    Written 2015.04.03 by PM 2Ring,
    with help from Antti Haapala and Martijn Pieters 
'''

from itertools import groupby

def estimate_time(values, lo_lim, hi_lim, sample_rate):
    #Find values that are in range
    in_range = [lo_lim <= v <= hi_lim for v in values]

    #Find runs of in-range values
    runs = [sum(1 for _ in group) for v, group in groupby(in_range) if v]

    #Estimate total time spent in-range
    total_time = sum(v if v > 1 else 0.5 for v in runs)
    return total_time / sample_rate


values = [1, 2, 3, 4, 5, 6, 7, 8, 4]
sample_rate = 10.0  # in Hz

lo_lim = 3
hi_lim = 5

print estimate_time(values, lo_lim, hi_lim, sample_rate)

输出

0.35

要检查此代码是否确实按照您的要求执行,您可以将一些打印语句放入 estimate_time() 以显示 in_rangeruns.

的内容

减少内存需求的一件事是将列表推导式转换为生成器表达式。列表理解必须在内存中创建一个全新的列表(一旦超出范围就会被删除);生成器表达式有点慢,但它不需要构建列表 - 结果会在需要时生成。语法非常相似 - 只需将列表 comp 的方括号替换为圆括号即可将其转换为 gen exp。

所以改变

in_range = [lo_lim <= v <= hi_lim for v in values]

in_range = (lo_lim <= v <= hi_lim for v in values)

runs = [sum(1 for _ in group) for v, group in groupby(in_range) if v]

runs = (sum(1 for _ in group) for v, group in groupby(in_range) if v)