Какой самый быстрый способ вычисления функции прокатки с двумерным окном? - PullRequest
0 голосов
/ 05 января 2019

У меня есть пандас с двумя измерениями. Я хочу рассчитать стандартное отклонение прокатки вдоль оси 1, а также включить точки данных в строках выше и ниже.

Так скажи, у меня есть этот df:

data = {'A': [1, 2, 3, 4],
 'B': [5, 6, 7, 8],
 'C': [9, 10, 11, 12]}
df = pd.DataFrame(data)
print(df)  

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

Мне нужно прямоугольное окно высотой 3 строки и шириной 2 столбца, перемещающееся слева направо. Так, например,

std_df.loc[1, 'C'] 

будет равно

np.std([1, 5, 9, 2, 6, 10, 3, 7, 11])

Но не знаю, как этого добиться без очень медленной итерации

1 Ответ

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

Похоже, что вы хотите pd.shift

import pandas as pd
import numpy as np

data = {'A': [1,2,3,4], 'B': [5,6,7,8], 'C': [9,10,11,12]}
df = pd.DataFrame(data)

print(df)
   A  B   C
0  1  5   9
1  2  6  10
2  3  7  11
3  4  8  12

Смещение кадра данных, предоставленного вами на 1, приводит к строке выше

print(df.shift(1))
     A    B     C
0  NaN  NaN   NaN
1  1.0  5.0   9.0
2  2.0  6.0  10.0
3  3.0  7.0  11.0

Аналогично, смещение кадра данных, предоставленного вами на -1, приводит к строке ниже

print(df.shift(-1))
     A    B     C
0  2.0  6.0  10.0
1  3.0  7.0  11.0
2  4.0  8.0  12.0
3  NaN  NaN   NaN

поэтому приведенный ниже код должен делать то, что вы ищете (add_prefix ставит префиксы имен столбцов, чтобы сделать их уникальными)

above_df = df.shift(1).add_prefix('above_')
below_df = df.shift(-1).add_prefix('below_')
lagged = pd.concat([df, above_df, below_df], axis=1)
lagged['std'] = lagged.apply(np.std, axis=1)

print(lagged)
   A  B   C  above_A  above_B  above_C  below_A  below_B  below_C       std
0  1  5   9      NaN      NaN      NaN      2.0      6.0     10.0  3.304038
1  2  6  10      1.0      5.0      9.0      3.0      7.0     11.0  3.366502
2  3  7  11      2.0      6.0     10.0      4.0      8.0     12.0  3.366502
3  4  8  12      3.0      7.0     11.0      NaN      NaN      NaN  3.304038
...