Crea grupos superpuestos con pandas timegrouper

Estoy usando Pandas Timegrouper para agrupar puntos de datos en un dataframe de pandas en python:

grouped = data.groupby(pd.TimeGrouper('30S')) 

Me gustaría saber si hay una manera de lograr la superposición de ventanas, como se sugiere en esta pregunta: Superposición de ventanas en Pandas mientras se mantiene el dataframe de pandas como estructura de datos.

Actualización: se probó la sincronización de las tres soluciones propuestas a continuación y la media móvil parece más rápida:

 %timeit df.groupby(pd.TimeGrouper('30s',closed='right')).mean() %timeit df.resample('30s',how='mean',closed='right') %timeit pd.rolling_mean(df,window=30).iloc[29::30] 

rendimientos

 1000 loops, best of 3: 336 µs per loop 1000 loops, best of 3: 349 µs per loop 1000 loops, best of 3: 199 µs per loop 

Crea algunos datos exactamente 3 x 30 s de largo

 In [51]: df = DataFrame(randn(90,2),columns=list('AB'),index=date_range('20130101 9:01:01',freq='s',periods=90)) 

Usar un TimeGrouper de esta manera es equivalente a remuestrear (y eso es lo que realmente hace la remuestreación). Tenga en cuenta que utilicé closed para asegurarme de que se incluyeron exactamente 30 observaciones

 In [57]: df.groupby(pd.TimeGrouper('30s',closed='right')).mean() Out[57]: AB 2013-01-01 09:01:00 -0.214968 -0.162200 2013-01-01 09:01:30 -0.090708 -0.021484 2013-01-01 09:02:00 -0.160335 -0.135074 In [52]: df.resample('30s',how='mean',closed='right') Out[52]: AB 2013-01-01 09:01:00 -0.214968 -0.162200 2013-01-01 09:01:30 -0.090708 -0.021484 2013-01-01 09:02:00 -0.160335 -0.135074 

Esto también es equivalente si luego seleccionas los intervalos de 30 s.

 In [55]: pd.rolling_mean(df,window=30).iloc[28:40] Out[55]: AB 2013-01-01 09:01:29 NaN NaN 2013-01-01 09:01:30 -0.214968 -0.162200 2013-01-01 09:01:31 -0.150401 -0.180492 2013-01-01 09:01:32 -0.160755 -0.142534 2013-01-01 09:01:33 -0.114918 -0.181424 2013-01-01 09:01:34 -0.098945 -0.221110 2013-01-01 09:01:35 -0.052450 -0.169884 2013-01-01 09:01:36 -0.011172 -0.185132 2013-01-01 09:01:37 0.100843 -0.178179 2013-01-01 09:01:38 0.062554 -0.097637 2013-01-01 09:01:39 0.048834 -0.065808 2013-01-01 09:01:40 0.003585 -0.059181 

Entonces, dependiendo de lo que quiera lograr, es fácil hacer una superposición, utilizando rolling_mean y luego seleccione la ‘frecuencia’ que desee. Por ejemplo, aquí hay un remuestreo de 5s con un intervalo de 30s.

 In [61]: pd.rolling_mean(df,window=30)[9::5] Out[61]: AB 2013-01-01 09:01:10 NaN NaN 2013-01-01 09:01:15 NaN NaN 2013-01-01 09:01:20 NaN NaN 2013-01-01 09:01:25 NaN NaN 2013-01-01 09:01:30 -0.214968 -0.162200 2013-01-01 09:01:35 -0.052450 -0.169884 2013-01-01 09:01:40 0.003585 -0.059181 2013-01-01 09:01:45 -0.055886 -0.111228 2013-01-01 09:01:50 -0.110191 -0.045032 2013-01-01 09:01:55 0.093662 -0.036177 2013-01-01 09:02:00 -0.090708 -0.021484 2013-01-01 09:02:05 -0.286759 0.020365 2013-01-01 09:02:10 -0.273221 -0.073886 2013-01-01 09:02:15 -0.222720 -0.038865 2013-01-01 09:02:20 -0.175630 0.001389 2013-01-01 09:02:25 -0.301671 -0.025603 2013-01-01 09:02:30 -0.160335 -0.135074