Длина (количество) последовательностей с условием начала и конца Python - PullRequest
7 голосов
/ 10 июля 2020

У меня есть данные об ускорении, для которых я пытаюсь подсчитать длину последовательностей при заданном наборе условий. В этом случае я хочу подсчитать длину последовательности, когда ускорение 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]

Результат возврата здесь будет счетом 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 

Используя приведенный выше пример, результат для этого кода будет 2 (2.88, 2.86)

Ответы [ 2 ]

3 голосов
/ 10 июля 2020

Использование itertools.dropwhile и takewhile:

l = [-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]
list(takewhile(lambda x: x > 0, dropwhile(lambda x: x < 2.78, l)))

Вывод:

[2.88, 2.86, 2.53, 1.98, 1.21, 0.89, 0.11]

Или просто чтобы получить len:

sum(1 for _ in takewhile(lambda x: x > 0, dropwhile(lambda x: x < 2.78,  l)))
# 7
2 голосов
/ 10 июля 2020

будет ли это работать, если в наборе данных такое повторяется несколько раз? Я хочу идентифицировать каждый из них.

Давайте переключимся с takewhile и dropwhile на groupby с глобальным логическим флагом для идентификации нескольких последовательностей. Я просто собираюсь объединить ваши данные на себя, чтобы смоделировать две последовательности:

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')

OUTPUT

> 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
> 

Можно ли затянуть хотя, чтобы предоставить только номера 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...