Source code for pyrfu.pyrf.ts_convolve

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 3rd party imports
import scipy
import xarray as xr

__author__ = "Apostolos Kolokotronis"
__email__ = "apostolos.kolokotronis@irf.se"
__copyright__ = "Copyright 2020-2024"
__license__ = "MIT"
__version__ = "2.4.13"
__status__ = "Prototype"


[docs]def ts_convolve(inp, kernel, mode: str = "nearest"): r""" Compute the convolution of a time series of N-dimensional data with a N-dimensional kernel. ***Right now has only been tested for calculating moving averages of 1D time series *** The convolution is done using scipy.ndimage.convolve, with mode = "nearest" (read documentation for scipy.ndimage.convolve for more information). Parameters: ---------- inp : xarray.DataArray The time series to be convolved with the kernel. kernel: nd.array The kernel to apply to inp for the convolution. Returns: ------- out : xarray.DataArray An array containing the convolution of inp with kernel. Mode "valid" is applied from numpy.convolve, which does not affect the edges of the time series. """ message = "Invalid input type. Input must be xarray.DataArary or xarray.Dataset" assert isinstance(inp, xr.DataArray), message if "time" not in inp.dims: message = "Invalid input dimensions. Input must have a 'time' dimension" raise ValueError(message) if inp.data.ndim <= 2 and inp.data.ndim > 0: if inp.data.ndim == 2: convolution = inp.copy() for comp in range(inp.data.shape[1]): convolution[:, comp] = ts_convolve(inp[:, comp], kernel, mode) out = convolution else: convolution = scipy.ndimage.convolve( input=inp.data, weights=kernel, mode=mode ) convolution = xr.DataArray( convolution, coords=inp.coords, dims=inp.dims, attrs=inp.attrs ) out = convolution else: raise ValueError("Invalid dimensions.") return out