2017-06-27 5 views
2

私はそれにいくつかの値を持つ時系列データセットを持っています。その後、scipy.signalでnan値を持つデータを取り除く

ValueError: array must not contain infs or NaNs 

再び私が試した:

scipy.signal.detrend(y) 

が、私はこのエラーを得た:

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

私はこれを行うことによって、試してみました

:私は、このデータをdetrandしたいです私はデータの順序を失った。

この問題を解決するにはどうすればよいですか?

+1

あなたは* *それに近い値の平均値であることを 'NaN'値を設定することができます。他の主な方法は、データを手動で取り除くことです。すなわち、あなたが持っているデータに対して線形最小二乗を使用し、その線を引きます。それほど難しくない。これには 'scipy.linalg.lstsq'、' scipy.stats.linregress'、 'scipy.optimize.least_squares'、' scipy.optimize.lsq_linear'、 'numpy.linalg.lstsq'のような機能があります。 –

+0

@AlexanderReynoldsはい、それは本当です。補間は私を助けないので、データから行を引くと助けになります。 – bikuser

答えて

2

今後の参考として、デジタル信号処理スタックサイトhttps://dsp.stackexchange.com/があります。私は将来信号処理に関連する質問を使用することをお勧めします。


私が考えることができる最も簡単な方法は、手動でデータを取り除くことです。これは、最小二乗を計算することで簡単に行うことができます。最小二乗はxyの両方の値を考慮に入れますので、の値は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) 

Data with some NaN values

# 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) 

Detrended data

+0

プロセスの詳細な説明をありがとうございます。助けになる :) – bikuser

関連する問題