bik*_*ser 3 python numpy scipy trend
我有一个时间序列数据集,其中包含一些 nan 值。我想去除这些数据的趋势:
我尝试这样做:
scipy.signal.detrend(y)
Run Code Online (Sandbox Code Playgroud)
然后我收到了这个错误:
ValueError: array must not contain infs or NaNs
Run Code Online (Sandbox Code Playgroud)
然后我尝试:
scipy.signal.detrend(y.dropna())
Run Code Online (Sandbox Code Playgroud)
但是我丢失了数据顺序。
如何解决这个问题?
为了将来参考,有一个数字信号处理堆栈站点,https://dsp.stackexchange.com/。我建议将来在信号处理相关问题中使用它。
我能想到的最简单的方法是手动去除数据趋势。您可以通过计算最小二乘法轻松完成此操作。最小二乘法将同时考虑您的x和y值,因此您可以删除x对应于 where的值y = NaN。
您可以使用 获取非NaN值的索引not_nan_ind = ~np.isnan(y),然后使用 的非NaN值y和相应x值进行线性回归,例如scipy.stats.linregress():
m, b, r_val, p_val, std_err = stats.linregress(x[not_nan_ind],y[not_nan_ind])
Run Code Online (Sandbox Code Playgroud)
然后您可以简单地从您的数据中减去这条线y以获得去趋势数据:
detrend_y = y - (m*x + b)
Run Code Online (Sandbox Code Playgroud)
这就是你所需要的。例如一些虚拟数据:
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)
Run Code Online (Sandbox Code Playgroud)
# 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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3459 次 |
| 最近记录: |