您可以使用numpy 数组的滚动窗口技巧 https://stackoverflow.com/a/6811241/3005167并将其应用于 DataFrame 底层的数组。
import pandas as pd
import numpy as np
def rolling_window(a, window):
shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
strides = a.strides + (a.strides[-1],)
return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
df = pd.DataFrame({
'x': [1, 2, 3, 2, 1, 5, 4, 6, 7, 9],
'y': [4, 3, 4, 6, 5, 9, 1, 3, 1, 2]
})
windowSize = 4
rw = rolling_window(df.values.T, windowSize)
m = np.mean(rw[1], axis=-1, keepdims=True)
a = np.sum(rw[0] * (rw[1] > m), axis=-1)
b = np.sum(rw[0] * (rw[1] <= m), axis=-1)
result = a / b
结果缺乏领先None
值,但它们应该很容易附加(以np.nan
或将结果转换为列表后)。
这可能不是您正在寻找的使用 pandas 的方法,但它可以在没有循环的情况下完成工作。