Как извлечь n кусков из набора данных? - PullRequest
1 голос
/ 24 июня 2019

У меня есть набор данных с 100 000 образцов и 2 мишенями {Pass, Fail} Моя главная цель - извлечь 5 блоков (групп) по 5 последовательных выборок с целью «FAIL» случайным образом из набора данных.

Мой набор данных:

i           target             value
0            Fail               12
1            Fail               12
2            Fail               14
3            Fail               13
4            Fail               8 
5            Pass               40
6            Fail               12
7            Fail               7
8            Fail               9
9            Fail               11
10           Fail               19
11           Pass               44
12           Fail               16
13           Fail               4
.........................................
n

Для вышеуказанного набора данных,

List1 = [0,1,2,3,4]

List2 = [6,7,8,9,10]

могут быть правильные результаты; однако куски следует выбирать случайным образом из всего набора данных.

P.S: набор данных сохраняется в листе Excel и импортируется с использованием панд.

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Я бы сначала идентифицировал все куски приемлемого размера, а затем выбирал случайным образом из этого списка.Следующий код предполагает простой числовой индекс в форме RangeIndex (пронумерованный от 0 до len-1).Если индекс отличается, используйте reset_index, чтобы получить чистый RangeIndex.

s = pd.Series(np.where(df2.target=='Fail', 1, np.nan), index=df2.index)
ends = np.random.choice(s[s.rolling(5).count()==5].index.values, 5)

ends содержит завершающий индекс из 5 случайных последовательностей из 5 последовательных Fail строк в df.

0 голосов
/ 24 июня 2019

Вы можете определить функцию, которая случайным образом выбирает n кусков из 5 последовательных чисел в массиве Numpy, если таковой имеется.

def get_chunks(x, n):
    chunks = np.split(x, np.where(np.diff(x) != 1)[0]+1)  # split consecutives
    chunks = [c for c in chunks if len(c) >=5]  # get only chuncks with more than 5 elements
    if len(chunks) >= n:
        n_chunks = [chunks[i] for i in np.random.choice(range(len(chunks)), n, replace=False)]  # choose n chunks
        rs = [np.random.choice(np.arange(0, len(chunk) -4)) for chunk in chunks]  # get 5 elements from each chunk
        return [n_chunks[i][rs[i]: rs[i]+5] for i in range(len(n_chunks))]
    else:
        return None

А затем примените его к индексам вашего фрейма данных. На вашем примере мы получили бы следующее:

In [1]: indices = df.reset_index().groupby('target')['index'].apply(np.array)['Fail']
        get_chunk(indices, 2)        
Out[1]: [array([ 6,  7,  8,  9, 10]), array([0, 1, 2, 3, 4])]
...