python - 如果 (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 。
我想知道是否有人可以帮助我。
解决方案
使用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
推荐阅读
- vb.net - 在 vb.net 中对 DataTable 中的重复行求和
- mysql - 在插入时在 mysql 中创建触发器,它比较添加行的字段
- mongodb - 通过 mongoose-double 插入数据后找不到文档
- pentaho - 基于某些条件加载水壶的 Pentaho 数据集成问题
- c++ - C++/G++ 包括来自另一个文件夹的标题
- matlab - Matlab排序矩阵取决于降序和升序两列
- javascript - 如何从 reactjs 中的 iframe 订阅在 dojo 中发布的事件
- mongodb - 在两个数组中查找并显示找到的一个
- reactjs - React 组件中的属性始终未定义
- android - 从子活动更改 BaseActivity 的工具栏标题