Извлечение информации из столбцов DF на основе фрагментов последовательности - PullRequest
0 голосов
/ 29 марта 2019

Возникла сложная проблема, которую я не мог осмыслить последние несколько дней.

Учитывая следующее DF,

enter image description here

Я хочу закончить с:

enter image description here

По сути, мы смотрим в столбец 'user_entry_note', чтобы увидеть, когда определенные фрагменты данной последовательности были успешно введены в порядок.

Чтобы получить фрагменты из последовательности, я использую следующую функцию:

def get_chunks_from_seq(seq_id):

    tidy = tidy_string(seq_id)
    'work out for all the possible chunks'

    # work out the chunks
    ord_chunks = [tidy[i:j] for i, j in itertools.combinations(range(len(tidy)+1), 2)]

    return(ord_chunks)

, который возвращает список всех возможных кусков по порядку.

Теперь я изо всех сил стараюсь достичь разных целей без использования большого количества информационных кадров. Я думаю, что я могу упустить трюк с самого начала процесса.

Здесь "seq" - исходная последовательность, "куски" - компоненты этой последовательности. Вся последовательность также становится частью второго этапа.

Для каждого «чанка» я хочу знать, что trial_ms был «завершен» (воспроизведен в порядке, переходящем вниз по столбцу «user_entry_note»), а также значения в элементе entry_error_no, userentries_plybs на этом этапе.

Мне удалось добиться этого с помощью:

# get a list of the possible chunks based on the sequence
    chunks = get_chunks_from_seq(df1['seq'][0])

    # create df of chunks and their completion indexes
    h = [find_idx(seq, df1, 'user_entry_note') for seq in chunks]

    # list of the chunks themselves
    h2 = [seq for seq in chunks]

    # column of chunk lens
    h3 = [len(seq) if isinstance(seq, list) is True else 1 for seq in chunks]

    # create strings of these
    h2_str = []
    for p in h2:
        if type(p) == list:
            p = list_to_string(p)
            h2_str.append(p)
        else: 
            h2_str.append(str(p))

    # make df to format them
    df1_2 = pd.DataFrame({'chunk_idx__completion_in_trial': h,'chunk': h2_str,'chunk_len': h3 })


    # sub df
    subdf1 = ['user_id','timecode','user_entries_error_no', 'user_entries_plybs']
    df1_3 = df1.iloc[h,:][subdf1].reset_index()

    #tie everything together
    keep = ['chunk','user_id','timecode','user_entries_error_no','user_entries_plybs']
    df2 = df1_2.join(df1_3)[keep]

Однако я думаю, что мне нужно отказаться от этого подхода, чтобы достичь своей второй цели, в которой я сбился с толку.

В дополнение к этому я хочу знать, когда каждая нота в чанке была пропущена (trial_ms) когда этот чанк был пропущен (но не тогда, когда эти заметки могли появляться раньше).

Другими словами, в следующем примере:

enter image description here

для фрагмента "40-30", n1 будет 7, n2 будет индексом 8, потому что блок был завершен в 8. Не имеет значения, что 40 появилось в индексе 2. Однако индекс 2 будет правильным индексом для n1 фрагмента "40", который также будет равен столбцу "chunk_completed" в этом случае (и для всех фрагментов, где n = 1)

Воспроизводимый DF:

    f = {'seq': {0: '60-40-30',
  1: '60-40-30',
  2: '60-40-30',
  3: '60-40-30',
  4: '60-40-30',
  5: '60-40-30',
  6: '60-40-30',
  7: '60-40-30',
  8: '60-40-30'},
 'seq_len': {0: 3, 1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3, 7: 3, 8: 3},
 'seq_list': {0: [60, 40, 30],
  1: [60, 40, 30],
  2: [60, 40, 30],
  3: [60, 40, 30],
  4: [60, 40, 30],
  5: [60, 40, 30],
  6: [60, 40, 30],
  7: [60, 40, 30],
  8: [60, 40, 30]},

 'trial_ms': {0: -9223372037,
  1: -18963961,
  2: 31992270,
  3: -13028311,
  4: -18963961,
  5: 31992270,
  6: -13028311,
  7: -18963961,
  8: 31992270},
 'user_entries_error_no': {0: 1,
  1: 2,
  2: 6,
  3: 2,
  4: 3,
  5: 3,
  6: 3,
  7: 2,
  8: 4},
 'user_entries_plybs': {0: 2, 1: 3, 2: 3, 3: 2, 4: 3, 5: 3, 6: 1, 7: 1, 8: 4},
 'user_entry_note': {0: 23,
  1: 60,
  2: 40,
  3: 30,
  4: 40,
  5: 3,
  6: 3,
  7: 2,
  8: 4},
 'user_id': {0: 'seb',
  1: 'seb',
  2: 'seb',
  3: 'seb',
  4: 'seb',
  5: 'seb',
  6: 'seb',
  7: 'seb',
  8: 'seb'}}



 df1 = pd.DataFrame().from_dict(f)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...