Scipy interp1d関数でこのエラーを受け取りました。通常、xが単調に増加していない場合、このエラーが生成されます。
_import scipy.interpolate as spi
def refine(coarsex,coarsey,step):
finex = np.arange(min(coarsex),max(coarsex)+step,step)
intfunc = spi.interp1d(coarsex, coarsey,axis=0)
finey = intfunc(finex)
return finex, finey
for num, tfile in enumerate(files):
tfile = tfile.dropna(how='any')
x = np.array(tfile['col1'])
y = np.array(tfile['col2'])
finex, finey = refine(x,y,0.01)
_
コードが正しいのは、6つのデータファイルで正常に機能し、7日間エラーをスローしたためです。そのため、データに何か問題があるはずです。しかし、私が知る限り、データはずっと下がっていきます。例のエラーを再現できないため、例を提供しないで申し訳ありません。
私を助けることができる2つのことがあります:
ValueError: A value in x_new is above the interpolation range.
_をスローするときにx_newとそのインデックスの値を返すことは(どのように?)可能であるため、ファイルのどこに問題があるかを実際に確認できますか?[〜#〜] update [〜#〜]
したがって、問題は、何らかの理由で、max(finex)
がmax(coarsex)
よりも大きいことです(一方は.x39で、もう一方は.x4です)。元の値を有効数字2桁に丸めることで問題が解決することを期待していましたが、表示されませんが、表示される桁数は少なくなりますが、表示されないままカウントされます。私はそれについて何ができますか?
Scipy v。0.17.0以降を実行している場合、 _fill_value='extrapolate'
_を_spi.interp1d
_ に渡すと、これらの値が補間範囲。したがって、次のように補間関数を定義します。
intfunc = spi.interp1d(coarsex, coarsey,axis=0, fill_value="extrapolate")
データの外観と実行する補間のタイプによっては、外挿された値が誤っている可能性があります。これは、ノイズの多いデータまたは非単調なデータがある場合に特に当てはまります。あなたの場合、x_new値は補間範囲を超えているslighlyだけなので大丈夫かもしれません。
以下に、この機能がうまく機能するだけでなく、誤った結果をもたらす方法の簡単なデモンストレーションを示します。
_import scipy.interpolate as spi
import numpy as np
x = np.linspace(0,1,100)
y = x + np.random.randint(-1,1,100)/100
x_new = np.linspace(0,1.1,100)
intfunc = spi.interp1d(x,y,fill_value="extrapolate")
y_interp = intfunc(x_new)
import matplotlib.pyplot as plt
plt.plot(x_new,y_interp,'r', label='interp/extrap')
plt.plot(x,y, 'b--', label='data')
plt.legend()
plt.show()
_
したがって、補間された部分(赤)はうまく機能しましたが、外挿された部分は、明らかにノイズのために、このデータの線形トレンドに明らかに従っていません。したがって、データをある程度理解し、注意して進めてください。
finex
calcの簡単なテストは、(常に?)外挿領域に入ることができることを示しています。
In [124]: coarsex=np.random.Rand(100)
In [125]: max(coarsex)
Out[125]: 0.97393109991816473
In [126]: step=.01;finex=np.arange(min(coarsex), max(coarsex)+step, step);(max(
...: finex),max(coarsex))
Out[126]: (0.98273730602114795, 0.97393109991816473)
In [127]: step=.001;finex=np.arange(min(coarsex), max(coarsex)+step, step);(max
...: (finex),max(coarsex))
Out[127]: (0.97473730602114794, 0.97393109991816473)
繰り返しますが、これは簡単なテストであり、いくつかの重要なステップまたは値が欠落している可能性があります。