今後の参考として、デジタル信号処理スタックサイトhttps://dsp.stackexchange.com/があります。私は将来信号処理に関連する質問を使用することをお勧めします。
私が考えることができる最も簡単な方法は、手動でデータを取り除くことです。これは、最小二乗を計算することで簡単に行うことができます。最小二乗はx
とy
の両方の値を考慮に入れますので、の値はy = NaN
に相当します。
あなたは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])
その後
detrend_y = y - (m*x + b)
そして、それがすべてです:あなたは、単にトレンド除去データを取得するために、あなたのデータ
y
からこのラインを差し引くことができますあなたが必要です。いくつかのダミーデータでたとえば:
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'値を設定することができます。他の主な方法は、データを手動で取り除くことです。すなわち、あなたが持っているデータに対して線形最小二乗を使用し、その線を引きます。それほど難しくない。これには 'scipy.linalg.lstsq'、' scipy.stats.linregress'、 'scipy.optimize.least_squares'、' scipy.optimize.lsq_linear'、 'numpy.linalg.lstsq'のような機能があります。 –
@AlexanderReynoldsはい、それは本当です。補間は私を助けないので、データから行を引くと助けになります。 – bikuser