Source code for signalz.generators.levy_walk

"""
.. versionadded:: 0.5

This function generates Levy walk by interpolation of Levy flight.

The Levy distribution is defined by two parameters :math:`\\alpha`
and :math:`\\beta`. The Gaussian distribution is special case of 
Levy distribution with :math:`\\alpha=2` and :math:`\\beta=0`.

This function uses :ref:`generators-levy_noise`.

Example Usage
==================

The following example produce 1000 samples of Levy walk created from
500 samples of Levy noise (`ns=500`) located (mean value) at 0 (`position`),
with characteristic exponent index of 1.4 (`alpha`),
skeewness of 0 (`beta`) and diffusion of 1. (`sigma`). 


.. code-block:: python

    import signalz
    x = signalz.levy_walk(1000, ns=500, alpha=1.4, beta=0., sigma=1., position=0)

Function Documentation
======================================
"""
import numpy as np

from signalz.misc import check_type_or_raise
import signalz

[docs]def levy_walk(n, ns=0, alpha=2., beta=1., sigma=1., position=0.): """ This function produces Levy walk. **Args:** * `n` - length of the output data (int) - how many samples will be on output * `ns` - number of points (int) in original noise before interpolation, this number cannot be higher than desired length of data; if it is set to 0, then `ns=n` is used; this number is related to number of direction changes in resulting walk **Kwargs:** * `alpha` - characteristic exponent index of used Levy noise (float) in range `0<alpha<2` * `beta` - skeewness of used Levy noise (float) in range `-1<beta<1` * `sigma` - diffusion of used Levy noise (float); in case of gaussian distribution it is standard deviation * `position` - position parameter (float) of used Levy noise **Returns:** * vector of values representing the walk (1d array) """ # check params check_type_or_raise(ns, int, "ns") check_type_or_raise(n, int, "n") if ns == 0: ns = n elif ns > n: raise ValueError("Argument ns cannot be higher than argument n") # generate levy random variable x = signalz.levy_noise(ns, alpha, beta, sigma, position) # interpolate new points xt = np.cumsum(np.abs(x)) xf = np.cumsum(x) t = np.linspace(0, xt[-1], n) return np.interp(t, xt, xf)