Использование вращающегося объекта pandas для создания скользящего окна списков

Этот выдающийся пост довольно ясно иллюстрирует, как использовать панд cumsum() Метод DataFrame для создания трехмерного тензора, содержащего столбец со списками списков, размеры которых делают их пригодными для использования в качестве ввода временных рядов в LSTM. Я хотел бы сделать что-то очень похожее, но с постоянно меняющимся списком списков вместо совокупного объединения списков.

Например. Скажем, у вас был DataFrame с 3 временными рядами, таким образом:

 A   B   C
 1   2   3
 4   5   6
 7   8   9
10  11  12

В статье, на которую я ссылался выше, показано, как использовать панд cumsum() построить столбец DataFrame из вложенных списков, которые выглядят так:

[[1, 2, 3]]
[[1, 2, 3], [4, 5, 6]]
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Ключевые строки кода Python, которые выполняют это, следующие:

input_cols =  list(df.columns)
df['single_list'] = df[input_cols].apply(
                       tuple, axis=1).apply(list)
df['double_encapsulated'] = df.single_list.apply(
                                      lambda x: [list(x)])

Но я хочу скользящее окно списков, а не совокупную сумму списков. Это должно выглядеть так:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[[4, 5, 6], [7, 8, 9], [10, 11, 12]]
[[7, 8, 9], [10, 11, 12], [13, 14, 15]]

Можно ли это сделать с помощью объекта Rolling?

2 ответа

Вот несколько приемов для достижения желаемых результатов:

import pandas as pd
dd = {'A': {0: 1, 1: 4, 2: 7, 3: 10, 4: 13},
 'B': {0: 2, 1: 5, 2: 8, 3: 11, 4: 14},
 'C': {0: 3, 1: 6, 2: 9, 3: 12, 4: 15}}
df = pd.DataFrame(dd)

list_of_indexes=[]
df.index.to_series().rolling(3).apply((lambda x: list_of_indexes.append(x.tolist()) or 0), raw=False)
list_of_indexes

d1 = df.apply(tuple,axis=1).apply(list)
[[d1[ix] for ix in x] for x in list_of_indexes]

Выход:

[[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
 [[4, 5, 6], [7, 8, 9], [10, 11, 12]],
 [[7, 8, 9], [10, 11, 12], [13, 14, 15]]]

Подробности:

Создайте пустой список. Используйте прокрутку и примените с хитростью функции, которая возвращает None, и оператор "или" с нулем, чтобы прокрутить применить, чтобы вернуть 0 (число). Однако то, что мы действительно ищем, это результаты функции, в этом случае "добавляемой". Мы используем индекс dataframe в качестве входных данных для нашей скользящей функции, поэтому list_of_indexes - это скользящий список индексов исходного dataframe, df. Теперь давайте изменим фрейм данных, чтобы преобразовать строки в список d1, используя "apply tuple" и "apply list".

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

Так как панды 1.1вращающиеся объекты являются итерируемыми, и вы можете сделать:

      [win.values.tolist() for win in df.rolling(3, axis=1) if win.shape[0] == 3]

С помощью if мы получаем только полные окна.

Другие вопросы по тегам