Source code for pyrfu.pyrf.struct_func

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

# 3rd party imports
import numpy as np
import xarray as xr

__author__ = "Louis Richard"
__email__ = "louisr@irfu.se"
__copyright__ = "Copyright 2020-2023"
__license__ = "MIT"
__version__ = "2.4.2"
__status__ = "Prototype"


[docs]def struct_func(inp, scales, order): r"""Returns the structure function of a time series .. math:: y= \frac{1}{N-s}\sum_{i=1}^{N-s}(x_i - x_{i+s})^o where :math:`s` is the scale, and :math:`o` is the order. Parameters ---------- inp : xarray.DataArray Input time series. scales : array_like A list or an array containing the scales to calculate. order : int Order of the exponential of the structure function. ncut : int, Optional Number of standard deviation to cut (Kiyani et al., XXXX) Returns ------- values : xarray.DataArray An xarray containing the structure functions, one per product in the original time series. The index coordinate contains the scale value, and the attribute 'order' keeps a record on the order used for its calculation. """ if scales is None: scales = np.arange(1, len(inp) // 2) if inp.ndim == 1: data = inp.data[:, np.newaxis] else: data = inp.data result = [] for scale in scales: increment = np.abs(data[scale:, ...] - data[:-scale, ...]) result.append(np.nanmean(increment**order, axis=0)) _, *comp = [inp.coords[dim].data for dim in inp.dims] result = xr.DataArray( np.squeeze(np.stack(result)), coords=[scales, *comp], dims=["scales", *inp.dims[1:]], attrs=inp.attrs, ) result.attrs["order"] = order return result