Использование вращающегося объекта pandas для создания скользящего окна списков - PullRequest
0 голосов
/ 30 января 2019

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

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

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

В статье, на которую я ссылался выше, показано, как использовать pandas 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?

1 Ответ

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

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

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 на соответствующий список из исходного фрейма данныхиспользуя понимание списка.

...