python pandas滚动窗口中的比较操作

bq3bfh9z  于 2023-05-21  发布在  Python
关注(0)|答案(2)|浏览(246)

我想创建一个滚动窗口,并将此窗口中的元素与最近的元素进行比较。实际上,我想从所有其他值中子跟踪最后一个值。例如,如果我们有 Dataframe

df = pd.DataFrame([
    [2, 3, 5, 7,],
    [8, 3, 6, 1],
    [1, 5, 9, 13],
    [7, 3, 2, 7],
    [12, 4, 1, 0]
])

我想做一个长度为4的滚动窗口,因此在这个特定的例子中,第一个窗口将是[2,8,1,7]。现在最后一个元素(即7)大于2和1但小于8,因此运算的输出将是-1+1-1 = -1(如果大于,则为-1;如果小于,则为+1。如果相等,它并不重要,但让我们给予一个+1)。下一个滚动窗口也是如此。现在,12大于窗口中的所有值,因此操作将返回-3。
理想的输出最终将是:

[NaN, NaN, NaN, NaN]
[NaN, NaN, NaN, NaN]
[NaN, NaN, NaN, NaN]
[-1,  3,   -3,  1  ]
[ -3,  -1   3,  3  ]

我尝试了pd.rolling().apply(),也尝试了df.shift,但无法获得任何结果。

mzaanser

mzaanser1#

可以是带有自定义lambda的rolling.apply,其中g.iloc[:-1] - g.iat[-1] >= 0将所有前面的元素与窗口中的最后一个元素进行比较:

df.rolling(window=4).apply(lambda g: np.where(g.iloc[:-1] - g.iat[-1] >= 0, 1, -1).sum())

     0    1    2    3
0  NaN  NaN  NaN  NaN
1  NaN  NaN  NaN  NaN
2  NaN  NaN  NaN  NaN
3 -1.0  3.0  3.0  1.0
4 -3.0 -1.0  3.0  3.0
kqhtkvqz

kqhtkvqz2#

您可以使用numpysliding_window_view

from numpy.lib.stride_tricks import sliding_window_view as swv

N = 4

a = df.to_numpy()

out = pd.DataFrame(index=df.index, columns=df.columns)

out.iloc[N-1:,:] = \
np.where(swv(a, (N-1,1))[:-1] >= a[N-1:][..., None, None],
         1, -1).sum(axis=(-1,-2))

print(out)

输出:

0    1    2    3
0  NaN  NaN  NaN  NaN
1  NaN  NaN  NaN  NaN
2  NaN  NaN  NaN  NaN
3   -1    3    3    1
4   -3   -1    3    3

相关问题