首页 > 解决方案 > 如果 (i+1) 大于 (i) 对于所有 i 在 4 的窗口(以前的读数),则标记观察

问题描述

我有降雨时间序列,如:

rainfall
0   3.1
1   2
2   0
3   0
4   12
5   0
6   1
7   2
8   3
9   6
10  1
11  2
12  9

我想使用 python pandas 来标记一个观察结果,该观察结果的前 4 个读数满足此条件:对于范围内的每个 i (len(observations))==> i+1>i

预期的输出将是这样的:

rainfall    Flag test
0   3.1 F
1   2   F
2   0   F
3   0   F
4   12  F
5   0   F
6   1   F
7   2   F
8   3   T
9   6   T
10  1   F
11  2   F
12  9   F

它仅在前 3 行具有此条件的第 9 行返回 T 。

我想知道是否有人可以帮助我。

标签: pythonpandasflags

解决方案


使用strides,然后通过numpy.diff、比较和最后检查True每行的所有 s得到差异numpy.all

N = 4
x = np.concatenate([[np.nan] * (N-1), df['rainfall'].values])

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)
arr = rolling_window(x, N)
print (arr)
[[ nan  nan  nan  3.1]
 [ nan  nan  3.1  2. ]
 [ nan  3.1  2.   0. ]
 [ 3.1  2.   0.   0. ]
 [ 2.   0.   0.  12. ]
 [ 0.   0.  12.   0. ]
 [ 0.  12.   0.   1. ]
 [12.   0.   1.   2. ]
 [ 0.   1.   2.   3. ]
 [ 1.   2.   3.   6. ]
 [ 2.   3.   6.   1. ]
 [ 3.   6.   1.   2. ]
 [ 6.   1.   2.   9. ]]

df['flag'] = (np.diff(arr, axis=1) > 0).all(axis=1)
print (df)
    rainfall   flag
0        3.1  False
1        2.0  False
2        0.0  False
3        0.0  False
4       12.0  False
5        0.0  False
6        1.0  False
7        2.0  False
8        3.0   True
9        6.0   True
10       1.0  False
11       2.0  False
12       9.0  False

推荐阅读