Python 连续开关信号之间的行数

Python 连续开关信号之间的行数,python,pandas,numpy,Python,Pandas,Numpy,我有一个“信号”系列,有1个值(开),-1个值(关)和零值: signal = pd.Series([0, 1, 0, 0, -1, 0, 1, 1, 0, -1]) 我需要返回连续on和off信号之间的行数,结果如下: 第一次出现=3 第二次出现=2 要考虑存在两个或多个连续on值时,引用是最后一个 非常感谢 问候 Tom基本解决方案 我要做的是定义几个状态,比如所看到的信号上的和重置,然后一步一步地完成这个系列,把事情当作一个状态机来处理。因此,当您浏览每个项目时,根据当前状态和系列中当前

我有一个“信号”系列,有1个值(开),-1个值(关)和零值:

signal = pd.Series([0, 1, 0, 0, -1, 0, 1, 1, 0, -1])
我需要返回连续on和off信号之间的行数,结果如下:

第一次出现=3

第二次出现=2

要考虑存在两个或多个连续on值时,引用是最后一个

非常感谢

问候 Tom

基本解决方案 我要做的是定义几个状态,比如所看到的信号上的
重置
,然后一步一步地完成这个系列,把事情当作一个状态机来处理。因此,当您浏览每个项目时,根据当前状态和系列中当前项目的组合,您会有不同的行为。类似于(伪代码):

如果您将每个状态定义为一个类,然后调用
state=state.next(item)
,其中state的值可以是所看到的状态对象
,或者
重置
,每个对象都有一个不同的
next()
实现,那么还有一种更适合对象的方法

正则表达式解 由于正则表达式是状态机,我认为您还可以将数据转换为字符串并查找
ab*?c
模式。在这里,我在所有数字中添加了2,以避免处理
-1
1
(再次使用伪代码):


您可以利用系列中的索引标签:

s=signal[signal!=0]
np.diff(s[s.shift(-1)!=s].索引)[::2]
输出:

array([3, 2])

解释

首先,删除零:

s = signal[signal!=0]
然后,删除连续的重复项(保留最后一项):

查看输出以了解发生了什么:

1    1
4   -1
7    1
9   -1
dtype: int64
看,现在我们有了负数,后面是负数,保留了原始索引。因此,我们可以计算这些索引的差异(并仅对正的索引进行切片):


你能不能让
1
,后面跟着
0
,后面再跟着
1
,如果是的话应该怎么处理?我不明白。为什么第一次出现是3?@CainãMaxCouto Silva我想这是第一个1和第一个-1之间的距离。但是,如果一个1后跟另一个1,则距离会重置,并从第二个1开始,这就是为什么第二次出现是2而不是3。这就是我的理解?是的,没错。它是最后一个1(在-1之前)和-1之间的距离,因此:第一次出现(1,0,0,-1)是3,第二次出现(1,0,-1)是2。Hi Max,感谢您的解释。如果有连续的副本-1,如何删除它们?
s = signal[signal!=0]
s = s[s.shift(-1) != s]
1    1
4   -1
7    1
9   -1
dtype: int64
np.diff(s.index)[::2]