用二维窗口计算滚动函数的最快方法是啥?

Posted

技术标签:

【中文标题】用二维窗口计算滚动函数的最快方法是啥?【英文标题】:What is the fastest way to calculate a rolling function with a two dimensional window?用二维窗口计算滚动函数的最快方法是什么? 【发布时间】:2019-05-31 14:25:52 【问题描述】:

我有一个二维的熊猫数据框。我想计算沿轴 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】:

看起来你想要的是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

【讨论】:

移动然后进行滚动计算的效果比预期的要好。谢谢。

以上是关于用二维窗口计算滚动函数的最快方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

计算大点积的最快方法是啥?

获取计算列表中前 n 个项目的最快方法是啥?

计算用户平均速度的最快方法是啥?

计算 32 次方对数的最快方法是啥?

计算行列式的最快方法是啥?

熊猫滚动窗口和日期时间索引:“偏移”是啥意思?