如何使用滚动窗口以及整个窗口的平均值将公式应用于Pandas DataFrame



我正在尝试实现一个小算法,根据另一列上的某个条件是否超过阈值,在我的DataFrame中创建一个新列。公式如下:

df.loc[:, 'new_column'] = 0
df.loc[sum(abs(np.diff(df.loc[:, 'old_column']) / df.loc[:, 'old_column'].mean())) > threshold, 'new_column'] = 1

然而,现在我不想将此公式应用于DataFrame的整个高度,而是希望应用滚动窗口,即公式中计算的平均值滚动通过DataFrame的行。我在文档中找到了这个页面,但不知道如何将其应用于像我这样的公式。我怎么能做这样的事?

使用列名ab而不是old_columnnew_column:

df = pd.DataFrame(np.random.randint(10, size=10), columns=['a'])
window = 3
val = df['a'].diff().abs() / df['a'].rolling(window, 1).mean()
threshold = 1
condition = (val > threshold)
df['b'] = 0
df.loc[condition, 'b'] = 1

示例结果:

a  b
0  1  0
1  7  1
2  6  0
3  1  1
4  8  1
5  2  1
6  3  0
7  1  0
8  0  0
9  8  1

请密切关注中间结果中的NaN值。CCD_ 6返回第一行中的CCD_。这与np.diff()不同,因为np.diff()返回的数组比输入小。

rolling().mean()将根据您的min_periods参数返回NaN值。

最终结果不包含NaN值,因为对于NaN输入,(val > threshold)总是False

最新更新