scipy.signal.

detrend#

scipy.signal.detrend(данные, ось=-1, тип='linear', bp=0, overwrite_data=False)[источник]#

Удалить линейный или постоянный тренд вдоль оси из данных.

Параметры:
данныеarray_like

Входные данные.

осьint, необязательный

Ось, вдоль которой производится удаление тренда данных. По умолчанию это последняя ось (-1).

тип{‘linear’, ‘constant’}, опционально

Тип удаления тренда. Если type == 'linear' (по умолчанию), результат линейной аппроксимации методом наименьших квадратов для данные вычитается из данные. Если type == 'constant', только среднее значение данные вычитается.

bparray_like из целых чисел, необязательно

Последовательность точек разрыва. Если задана, выполняется индивидуальная линейная аппроксимация для каждой части данные между двумя точками разрыва. Точки разрыва задаются как индексы в данныеЭтот параметр имеет эффект только при type == 'linear'.

overwrite_databool, необязательно

Если True, выполнить детрендирование на месте и избежать копирования. По умолчанию False

Возвращает:
retndarray

Очищенные от тренда входные данные.

Смотрите также

numpy.polynomial.polynomial.Polynomial.fit

Создать полином, аппроксимирующий методом наименьших квадратов.

Примечания

Детрендирование можно интерпретировать как вычитание полинома, аппроксимированного методом наименьших квадратов: установка параметра тип в ‘constant’ соответствует подгонке полинома нулевой степени, ‘linear’ — полинома первой степени. Обратитесь к примеру ниже.

Примеры

Следующий пример удаляет тренд из функции \(x(t) = \sin(\pi t) + 1/4\):

>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> from scipy.signal import detrend
...
>>> t = np.linspace(-0.5, 0.5, 21)
>>> x = np.sin(np.pi*t) + 1/4
...
>>> x_d_const = detrend(x, type='constant')
>>> x_d_linear = detrend(x, type='linear')
...
>>> fig1, ax1 = plt.subplots()
>>> ax1.set_title(r"Detrending $x(t)=\sin(\pi t) + 1/4$")
>>> ax1.set(xlabel="t", ylabel="$x(t)$", xlim=(t[0], t[-1]))
>>> ax1.axhline(y=0, color='black', linewidth=.5)
>>> ax1.axvline(x=0, color='black', linewidth=.5)
>>> ax1.plot(t, x, 'C0.-',  label="No detrending")
>>> ax1.plot(t, x_d_const, 'C1x-', label="type='constant'")
>>> ax1.plot(t, x_d_linear, 'C2+-', label="type='linear'")
>>> ax1.legend()
>>> plt.show()
../../_images/scipy-signal-detrend-1_00_00.png

В качестве альтернативы, NumPy Polynomial может использоваться для удаления тренда:

>>> pp0 = np.polynomial.Polynomial.fit(t, x, deg=0)  # fit degree 0 polynomial
>>> np.allclose(x_d_const, x - pp0(t))  # compare with constant detrend
True
>>> pp1 = np.polynomial.Polynomial.fit(t, x, deg=1)  # fit degree 1 polynomial
>>> np.allclose(x_d_linear, x - pp1(t))  # compare with linear detrend
True

Обратите внимание, что Polynomial также позволяет подгонять полиномы более высокой степени. Обратитесь к его документации, чтобы узнать, как извлечь коэффициенты полинома.