Найти самую длинную подпоследовательность без значений NaN в наборе рядов - PullRequest
0 голосов
/ 07 января 2019

Здравствуйте. Я пытаюсь выяснить метод, который находит самую длинную общую непрерывную подпоследовательность (в данном случае временной интервал) без каких-либо пропущенных (Nan) значений из набора последовательностей. Это пример кадра данных.

   time  s_1  s_2  s_3
0  1     2    2    Nan
1  2     3    Nan  Nan
2  3     3    2    2
3  4     5    3    10
4  5     8    4    3
5  6     Nan  Nan  7
6  7     5    2    Nan
7  8     Nan  3    Nan

Для этого небольшого примера «лучший» временной интервал будет 3-5 или индекс 2-4. Реальный фрейм данных намного больше и содержит больше серий. Можно ли найти эффективное решение этой проблемы?

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Я обновил это с небольшим количеством настройки для рабочего примера:

import pandas as pd
import numpy as np

s1 = [2,3,3,5,8,np.NAN,5,np.NAN,1]
s2 = [2,np.NAN,2,3,4,np.NAN,2,3,1]
s3 = [np.NAN,np.NAN,2,10,3,7,np.NAN,np.NAN,1]
data = {'time':np.arange(1,9+1),'s_1':s1,'s_2':s2,'s_3':s3}

df =  pd.DataFrame(data)
print(df)

Это создаст фрейм данных, который вы разместили выше, но с дополнительной записью в конце, поэтому будут две зоны с непрерывными индексами.

Я думаю, что лучший способ отсюда - отбросить все строки, в которых отсутствуют данные, а затем подсчитать самую длинную последовательность в оставшемся индексе. Нечто подобное должно сработать:

sequence = np.array(df.dropna(how='any').index)    
longest_seq = max(np.split(sequence, np.where(np.diff(sequence) != 1)[0]+1), key=len)    
print(df.iloc[longest_seq])

Что даст вам:

   time  s_1  s_2   s_3
2     3  3.0  2.0   2.0
3     4  5.0  3.0  10.0
4     5  8.0  4.0   3.0
0 голосов
/ 07 января 2019

dropna сначала, затем мы используем cumsum с diff, чтобы построить ключ для различения другой группы по продолжению или нет (отличается на 1)

s=df.dropna()
idx=s.time.groupby(s.time.diff().ne(1).cumsum()).transform('count')
idx
0    1
2    3
3    3
4    3
Name: time, dtype: int64
yourmax=s[idx==idx.max()]
yourmax
   time  s_1  s_2   s_3
2     3  3.0  2.0   2.0
3     4  5.0  3.0  10.0
4     5  8.0  4.0   3.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...