用二维 window 计算滚动函数的最快方法是什么?
What is the fastest way to calculate a rolling function with a two dimensional window?
我有一个 pandas 二维数据框。我想计算沿轴 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
我想要一个矩形 window 高 3 行,横 2 列,从左到右移动。所以,例如,
std_df.loc[1, 'C']
等于
np.std([1, 5, 9, 2, 6, 10, 3, 7, 11])
但不知道如何在没有非常缓慢的迭代的情况下实现这一目标
看来你想要的是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
我有一个 pandas 二维数据框。我想计算沿轴 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
我想要一个矩形 window 高 3 行,横 2 列,从左到右移动。所以,例如,
std_df.loc[1, 'C']
等于
np.std([1, 5, 9, 2, 6, 10, 3, 7, 11])
但不知道如何在没有非常缓慢的迭代的情况下实现这一目标
看来你想要的是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