我在确定某些信号是否低于背景水平时,将得分保持在真/假列中,例如
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次?
答案 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
来实现,该变量仅在行和时在每一行True
。 df.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