我有一个 pandas 数据框,其中有一列名为“Outside Dead Band”,数据以 32Hz(每秒 32 个数据点)记录。
我想遵循以下算法。
无nan的持续时间
如果持续时间超过2秒
如果 nan 之间的值为正,则取最大值,并将其附加到名为机动的列表中。
如果 nan 之间的值为负数,则取最小值,并将其附加到名为机动的列表中。
如果持续时间少于2秒
如果 nan 之间的值为正,则取最大值,并将其附加到名为 gusts 的列表中。
如果 nan 之间的值为负数,则取最小值,并将其附加到名为 gusts 的列表中。
示例:
Example 1
Data Snippet
NaN
NaN
NaN
NaN
0.935829
NaN
NaN
0.9468344
NaN
0.9352744
NaN
0.9299145
NaN
0.9159902
NaN
0.9189067
0.9447504
NaN
NaN
0.9488161
Expected Outputs
gusts = [0.935829, 0.9468344, 0.9352744, 0.9299145, 0.9159902, 0.9159902, 0.9447504, 0.9488161]
Example 2
Data Snippet
NaN
NaN
1.066175
1.108567
1.103931
1.098653
1.094846
1.062542
1.053064
NaN
NaN
0.9460738
0.931207
0.9161806
0.9083371
0.9201323
0.9272887
0.9176005
0.9021356
0.9303108
0.9178913
0.8911541
0.8558757
0.8634101
0.828901
0.8187609
0.8117134
0.8005729
0.7740957
0.7548033
0.7564046
0.7697771
0.7818314
0.7997488
0.8270378
0.8616151
0.8802456
0.9116527
0.9257826
0.9388146
0.945994
0.9453149
0.9454532
0.9426287
0.928901
0.9325082
0.9312031
0.9289232
0.916741
0.9420649
0.9212928
0.922505
0.9238197
0.9236084
0.8717794
0.8492894
0.8158376
0.7905051
0.7699976
0.747136
0.7314162
0.7468339
0.7403114
0.7393804
0.7492437
0.7990298
0.818364
0.8724768
0.947295
0.9460738
0.931207
0.9161806
0.9083371
0.9201323
0.9272887
0.9176005
0.9021356
0.9303108
0.9178913
0.8911541
0.8558757
NaN
NaN
NaN
1.055898
NaN
Expected Outputs
gusts = [1.108567, 1.055898]
maneuvers = [0.947295]
Example 3
Data Snippet
NaN
NaN
-1.066175
-1.108567
-1.103931
-1.098653
-1.094846
-1.062542
-1.053064
NaN
NaN
-0.9460738
-0.931207
-0.9161806
-0.9083371
-0.9201323
-0.9272887
-0.9176005
-0.9021356
-0.9303108
-0.9178913
-0.8911541
-0.8558757
-0.8634101
-0.828901
-0.8187609
-0.8117134
-0.8005729
-0.7740957
-0.7548033
-0.7564046
-0.7697771
-0.7818314
-0.7997488
-0.8270378
-0.8616151
-0.8802456
-0.9116527
-0.9257826
-0.9388146
-0.945994
-0.9453149
-0.9454532
-0.9426287
-0.928901
-0.9325082
-0.9312031
-0.9289232
-0.916741
-0.9420649
-0.9212928
-0.922505
-0.9238197
-0.9236084
-0.8717794
-0.8492894
-0.8158376
-0.7905051
-0.7699976
-0.747136
-0.7314162
-0.7468339
-0.7403114
-0.7393804
-0.7492437
-0.7990298
-0.818364
-0.8724768
-0.947295
-0.9460738
-0.931207
-0.9161806
-0.9083371
-0.9201323
-0.9272887
-0.9176005
-0.9021356
-0.9303108
-0.9178913
-0.8911541
-0.8558757
NaN
NaN
NaN
-1.055898
NaN
Expected Outputs
gusts = [-1.108567, -1.055898]
maneuvers = [-0.947295]
我尝试隔离循环并使用 for 循环和一系列 if 和 else 语句,但我的逻辑似乎不正确。如果可能的话,我真的很感激数据框本身对此的一些帮助。
norm_accel = flight["Outside Dead Band"].tolist()
gusts = []
maneuvers = []
while i <= (len(norm_accel)):
if norm_accel[i] != numpy.nan:
if norm_accel[i+1] == numpy.nan:
gusts.append(norm_accel(i))
else:
j = i
counter = 0
while norm_accel[j] != numpy.nan:
counter =+ 1
j =+ 1
if counter >= 64:
maneuvers.append(max(norm_accel[i:j]))
else:
gusts.append(max(norm_accel[i:j]))
i = j
i = i + 1
我确实知道这并不能解释最大最小条件,我不知道如何合并它。
我会将其放入 pandas 数据框中,并使用 NaN 的出现来创建一个
id
列,然后您可以使用该列进行分组并计算相关统计数据。假设 data
是一个数据框,其值位于 val
列中,它可能看起来像:
data["id"] = data["val"].isna().cumsum()
data = data.dropna()
grps = data.groupby("id").agg(
counts=("val", "count"),
min=("val", "min"),
max=("val", "max"),
)
grps
使用示例 2 可以得到:
counts min max
id
2 7 1.053064 1.108567
4 70 0.731416 0.947295
7 1 1.055898 1.055898
然后您可以使用简单的规则来创建列表:
grps["val"] = np.where(grps["max"] > 0, grps["max"], grps["min"])
manuevers = grps.loc[grps.counts >= 64, "val"].tolist()
gusts = grps.loc[grps.counts < 64, "val"].tolist()