Pandas Rolling применяется функция для всего окна данных - PullRequest
1 голос
/ 05 мая 2019

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

import pandas as pd
data = [ [1,2], [3,4], [3,4], [6,6], [9,1], [11,2] ]
df = pd.DataFrame(columns=list('AB'), data=data)

Это df:

    A   B
0   1   2
1   3   4
2   3   4
3   6   6
4   9   1
5   11  2

Возьмите некоторую функцию, чтобы применить к всему окну:

df.rolling(3).apply(lambda x: x.shape)

В этом примере я хотел бы получить что-то вроде:

    some_name   
0   NA  
1   NA  
2   (3,2)   
3   (3,2)   
4   (3,2)   
5   (3,2)   

Конечно, форма используется в качестве примера, показывающего, что f рассматривает все окно как объект вычисления, а не только строку / столбец. Я попытался поиграть с ключевым словом axis для rolling, а также с ключевым словом raw для apply, но безуспешно. Другие методы (agg, transform), похоже, тоже не доставляют.

Конечно, я могу сделать это с пониманием списка. Просто подумал, что есть более простой / чистый способ сделать это.

1 Ответ

1 голос
/ 05 мая 2019

Не с pd.DataFrame.rolling .... эта функция применяется к столбцам итеративно, принимая последовательность чисел с плавающей запятой / NaN и возвращая последовательность чисел с плавающей запятой / NaN, одну за другой.Я думаю, вам повезет больше с вашей интуицией ....

def rolling_pipe(dataframe, window, fctn):
    return pd.Series([dataframe.iloc[i-window: i].pipe(fctn) 
                      if i >= window else None 
                      for i in range(1, len(dataframe)+1)],
                     index = dataframe.index) 

df.pipe(rolling_pipe, 3, lambda x: x.shape)
...