具有开始和结束条件 Python 的序列的长度(计数)

Jak*_*ake 7 python conditional-statements python-3.x

我有一些加速度数据,我试图计算给定一组条件的序列长度。在这种情况下,我想计算一个序列的长度,当加速度moves > 2.78然后回落到0.

一个例子是

[-1.1, -1, 0, 1.2, 1.8, 2, 2.88, 2.86, 2.53, 1.98, 1.21, 0.89, 0.11, -0.21]
Run Code Online (Sandbox Code Playgroud)

这里的返回结果将是 7 (2.88, 2.86, 2.53, 1.98, 1.21, 0.89, 0.11)

我以前这样做是为了使用以下代码确定严格> 2.78 的序列长度。我需要以此为基础来提供使用 0 作为端点的长度。

def get_Accel_lengths( array ) :
    s = ''.join( ['0' if i < 2.78 else '1' for i in resultsQ4['AccelInt']] )
    parts = s.split('0')
    return [len(p) for p in parts if len(p) > 0]
Q4Accel = get_Accel_lengths(resultsQ4['AccelInt'])
Q4Accel = pd.DataFrame(Q4Accel)
Q4Accel 
Run Code Online (Sandbox Code Playgroud)

使用上面的示例,此代码的结果将是2( 2.88, 2.86)

cdl*_*ane 2

如果数据集中多次出现这种情况,这会起作用吗?我想辨认出每一个。

让我们使用全局布尔标志来切换来识别多个序列takewhile。我只是将您的数据连接到自身上以模拟两个序列:dropwhilegroupby

from itertools import groupby

def keyfunc(datum):
    global in_sequence

    if datum < 0:
        in_sequence = False
    elif datum > 2.78:
        in_sequence = True

    return in_sequence

data = [
    -1.1, -1, 0, 1.2, 1.8, 2, 2.88, 2.86,
    2.53, 1.98, 1.21, 0.89, 0.11, -0.21,
    -1.1, -1, 0, 1.2, 1.8, 2, 2.88, 2.86,
    2.53, 1.98, 1.21, 0.89, 0.11, -0.21,
]

sequences = []
in_sequence = False

for valid, sequence in groupby(data, keyfunc):
    if valid:
        sequences.append(list(sequence))

print(*sequences, sep='\n')
print(*map(len, sequences), sep='\n')
Run Code Online (Sandbox Code Playgroud)

输出

> python3 test.py
[2.88, 2.86, 2.53, 1.98, 1.21, 0.89, 0.11]
[2.88, 2.86, 2.53, 1.98, 1.21, 0.89, 0.11]
7
7
> 
Run Code Online (Sandbox Code Playgroud)

是否可以将其收紧,只提供我想要的 len 数字,然后转换为 df 并导出为 csv?

也许是这样的:

from itertools import groupby

data = [
    -1.1, -1, 0, 1.2, 1.8, 2, 2.88, 2.86,
    2.53, 1.98, 1.21, 0.89, 0.11, -0.21,
    -1.1, -1, 0, 1.2, 1.8, 2, 2.88, 2.86,
    2.53, 1.98, 1.21, 0.89, 0.11, -0.21,
]

def sequence_lengths(data):
    in_sequence = False

    def keyfunc(datum):
        nonlocal in_sequence

        if datum < 0:
            in_sequence = False
        elif datum > 2.78:
            in_sequence = True

        return in_sequence

    lengths = []

    for valid, sequence in groupby(data, keyfunc):
        if valid:
                lengths.append(len(list(sequence)))

    return lengths

print(sequence_lengths(data))
Run Code Online (Sandbox Code Playgroud)