在scipy.signal中使用nan值去除数据

时间:2017-06-27 11:36:51

标签: python numpy scipy trend

我有一个时间序列数据集,其中包含一些纳米值。我想要删除这些数据:

我试过这样做:

scipy.signal.detrend(y)

然后我收到了这个错误:

ValueError: array must not contain infs or NaNs

然后我尝试了:

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

但是我丢失了数据顺序。

如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

为了将来参考,有一个数字信号处理堆栈站点,https://dsp.stackexchange.com/。我建议将来使用它来处理与信号处理相关的问题。

我能想到的最简单方法是手动删除数据。您可以通过计算最小二乘法轻松完成此操作。最小二乘法将考虑您的xy值,因此您可以删除与x对应的y = NaN值。

您可以使用NaN获取非not_nan_ind = ~np.isnan(y)值的索引,然后使用NaN的非y值和相应的{进行线性回归{1}}值,例如scipy.stats.linregress()

x

然后,您只需从数据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)

Data with some NaN values

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)

Detrended data

答案 1 :(得分:0)

仅趋势非南部分,但保留南部分:

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