Linear filtering via convolution. Centered and backward displaced moving weighted average.
Parameters:  x : array_like
filt : array_like
nsides : int, optional


Returns:  y : ndarray, 2d

Notes
In nsides == 1, x is filtered
y[n] = filt[0]*x[n1] + ... + filt[n_filt1]*x[nn_filt]
where n_filt is len(filt).
If nsides == 2, x is filtered around lag 0
y[n] = filt[0]*x[n  n_filt/2] + ... + filt[n_filt / 2] * x[n]
+ ... + x[n + n_filt/2]
where n_filt is len(filt). If n_filt is even, then more of the filter is forward in time than backward.
If filt is 1d or (nlags,1) one lag polynomial is applied to all variables (columns of x). If filt is 2d, (nlags, nvars) each series is independently filtered with its own lag polynomial, uses loop over nvar. This is different than the usual 2d vs 2d convolution.
Filtering is done with scipy.signal.convolve, so it will be reasonably fast for medium sized data. For large data fft convolution would be faster.