scipy.signal 中 nan 值的去趋势数据

Detrending data with nan value in scipy.signal

我有一个时间序列数据集,其中包含一些 nan 值。我想去除这些数据的趋势:

我试过这样做:

scipy.signal.detrend(y)

然后我得到这个错误:

ValueError: array must not contain infs or NaNs

然后我尝试了:

scipy.signal.detrend(y.dropna())

但是我丢失了数据顺序。

如何解决这个问题?

数字信号处理堆栈站点 https://dsp.stackexchange.com/ 供将来参考。我建议将来使用它来解决与信号处理相关的问题。


我能想到的最简单的方法是手动去除数据趋势。您可以通过计算最小二乘法轻松地做到这一点。最小二乘法将同时考虑您的 xy 值,因此您可以删除对应于 y = NaN.

x

你可以用not_nan_ind = ~np.isnan(y)获取非NaN值的索引,然后用y的非NaN值和相应的 x 值,例如 scipy.stats.linregress():

m, b, r_val, p_val, std_err = stats.linregress(x[not_nan_ind],y[not_nan_ind])

然后您可以简单地从您的数据中减去这条线 y 以获得去除趋势的数据:

detrend_y = y - (m*x + b)

这就是您所需要的。例如一些虚拟数据:

import numpy as np
from matplotlib import pyplot as plt
from scipy import stats

# create data
x = np.linspace(0, 2*np.pi, 500)
y = np.random.normal(0.3*x, np.random.rand(len(x)))
drops = np.random.rand(len(x))
y[drops>.95] = np.NaN # add some random NaNs into y
plt.plot(x, y)

# find linear regression line, subtract off data to detrend
not_nan_ind = ~np.isnan(y)
m, b, r_val, p_val, std_err = stats.linregress(x[not_nan_ind],y[not_nan_ind])
detrend_y = y - (m*x + b)
plt.plot(x, detrend_y)

只去除非 nan 部分但保留 nan 部分:

signal[np.logical_not(pd.isna(signal))] = scipy.signal.detrend(signal[np.logical_not(pd.isna(signal))])