Pandas为真/假行滚动idmax?

时间:2017-11-03 11:12:31

标签: python-3.x pandas

我在确定某些信号是否低于背景水平时,将得分保持在真/假列中,例如

sig  bg   is_below
5    3    False
5    3    False
5    3    False
2    3    True   # "False positive"
4    3    False
4    3    False
0    3    True   # Signal is dead and not returning from this point onwards
0    3    True
0    3    True
0    3    True
0    3    True

但正如我所展示的那样,噪音有时会产生误报"并且平滑数据并没有消除一些大的尖峰,而不会使小数据过度平滑。我确信这是一种适当的数学方法,但也许这对工作和计算效率来说太过分了。

相反,如何确定出现True的第一个True的索引,例如连续3次?

2 个答案:

答案 0 :(得分:1)

好的,所以我记得True / False可以很容易地解释为1/0,所以滚动中位数,例如

scipy.signal.medfilt(df["is_below"], kernel_size = 5).argmax()

将返回第一次遇到[False, False, True, True, True]的索引,因为[0, 0, 1, 1, 1]的中位数是连续返回3 True的最小窗口。

我不知道是否有更好的方法,但鉴于我的时间序列中有100个数据点,返回的argmax索引对我的应用程序来说足够准确。

答案 1 :(得分:1)

如果您的数据位于pandas数据框中(例如称为df),则可以通过创建一个布尔变量b来实现,该变量仅在行和时在每一行Truedf.is_below中前两行为True。

b = ((df.is_below == True) & (df.is_below.shift(-1) == True) & (df.is_below.shift(-2) == True))

在这里,df.is_below.shift(-1)将整个数据帧向后移动1,因此我们正在查看上一行(类似于shift(-2)以查看前一行之前的行)。

以下完整代码:

import pandas as pd

# Create dataframe
df = pd.DataFrame()
sig = [5, 5, 5, 2, 4, 4, 0, 0, 0, 0, 0]
df['sig'] = sig
df['bg'] = [3] * len(sig)
df['is_below'] = df.sig < df.bg

# Find index of first consecutive three True in df.is_below
b = ((df.is_below == True) & (df.is_below.shift(-1) == True) & (df.is_below.shift(-2) == True))
idx = df.index[b][0]  # first index where three Trues are in a row