будет ли это работать, если в наборе данных такое повторяется несколько раз? Я хочу идентифицировать каждый из них.
Давайте переключимся с 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))