Search code examples
pythonscipytime-seriessmoothing

finding continuous signal in noisy binary time series


Suppose I have a time series such as:

[1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 , 1, 1, 1, 1]

and I know there is some noise in the signal. I want to remove the noise as best I can and still output a binary signal. The above example would turn into something like:

[1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 1, 1]

I have implemented a naive rule-based approach where I iterate through the values and have some minimum amount of 1s or 0s I need to "swap" the signal.

It seems like there must be a better way to do it. A lot of the results from googling around give non-binary output. Is there some scipy function I could leverage for this?


Solution

  • There are two similar functions that can help you: scipy.signal.argrelmin and scipy.signal.argrelmax. There are search for local min/max in discrete arrays. You should pass your array and neighbours search radius as order. Your problem can be solved by their combination:

    >>> a = np.asarray([1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 , 1, 1, 1, 1], int)
    
    >>> signal.argrelmin(a, order=3)
    (array([4], dtype=int32),)
    
    >>> signal.argrelmax(a, order=3)
    (array([15], dtype=int32),)
    

    Then you can just replace these elements.