Superposición de ventanas en Pandas

En pandas, hay varios métodos para manipular los datos en una ventana determinada (por ejemplo, pd.rolling_mean o pd.rolling_std ). Sin embargo, me gustaría establecer una superposición de ventanas, lo que creo que es un requisito bastante estándar. Por ejemplo, en la siguiente imagen, puede ver una ventana que abarca 256 muestras y superpone 128 muestras.

http://health.tau.ac.il/Communication%20Disorders/noam/speech/mistorin/images/hamming_overlap1.JPG

¿Cómo puedo hacer eso usando los métodos optimizados incluidos en Pandas o Numpy?

Usando as_strided harías algo como esto:

 import numpy as np from numpy.lib.stride_tricks import as_strided def windowed_view(arr, window, overlap): arr = np.asarray(arr) window_step = window - overlap new_shape = arr.shape[:-1] + ((arr.shape[-1] - overlap) // window_step, window) new_strides = (arr.strides[:-1] + (window_step * arr.strides[-1],) + arr.strides[-1:]) return as_strided(arr, shape=new_shape, strides=new_strides) 

Si pasa una matriz 1D a la función anterior, devolverá una vista 2D a esa matriz, con forma (number_of_windows, window_size) , por lo que podría calcular, por ejemplo, la media de la ventana como:

 win_avg = np.mean(windowed_view(arr, win_size, win_overlap), axis=-1) 

Por ejemplo:

 >>> a = np.arange(16) >>> windowed_view(a, 4, 2) array([[ 0, 1, 2, 3], [ 2, 3, 4, 5], [ 4, 5, 6, 7], [ 6, 7, 8, 9], [ 8, 9, 10, 11], [10, 11, 12, 13], [12, 13, 14, 15]]) >>> windowed_view(a, 4, 1) array([[ 0, 1, 2, 3], [ 3, 4, 5, 6], [ 6, 7, 8, 9], [ 9, 10, 11, 12], [12, 13, 14, 15]]) 

No estoy familiarizado con los pandas, pero en cantidad usted lo haría algo como esto (sin probar):

 def overlapped_windows(x, nwin, noverlap = None): if noverlap is None: noverlap = nwin // 2 step = nwin - noverlap for i in range(0, len(x) - nwin + 1, step): window = x[i:i+nwin] #this is a view, not a copy y = window * hann(nwin) #your code here with y 

Esto se extrae de un código antiguo para calcular una PSD promediada, que normalmente se procesa con ventanas que se superponen a medias. Tenga en cuenta que la window es una ‘vista’ en la matriz x, lo que significa que no realiza ninguna copia de los datos (muy rápido, probablemente buena) y que si modifica la window también modifica x (así que no haga window = hann * window ) .