私が作成しているライブラリでtimespansを処理する必要があります。私の最初のアイデアは、それを単純なものにして、何年もの間、フロートでそれらを体系化することでした。numpy floatの補間問題を避ける
問題は、たとえば補間を実行するときに発生します。私は極端内側
xs = np.array([0, 0.7, 1.2, 3.0]) # times
ys = np.array([np.nan, 124.3, 214.0, np.nan]) # values associated
私は値np.nanを取得したいと思い[0.7、1.2]区間外
、しかし、明らかに線形補間、特に を持っていると言います。しかし
、私は、そう7/10に正しい値が、1.2である6/5のためのナンを、
[nan, 124.3, 213.98206, nan, nan]
を取得
#!/usr/bin/python3.5
import numpy as np
from fractions import Fraction
import scipy.interpolate as scInt
if __name__ == "__main__":
xs = np.array([0, 0.7, 1.2, 3.0]) # times
ys = np.array([np.nan, 124.3, 214.0, np.nan]) # values associated
interp = scInt.interp1d(xs, ys)
xsInt = np.array([0, 7/10, 6/5-0.0001, 6/5, 6/5+0.0001])
print(interp(xsInt))
を使用。これに謎はなく、浮きの機械表現は のようなものを引き起こす可能性があります。しかし、とにかくそれは私が対処する必要がある問題です。
最初の考えは、fsの値を2倍にして、 [x1-eps、x1 + eps、x2-eps、x2 + eps、...、xn-eps、xn + eps ]、ysベクトルの2倍を繰り返す: [y1、y1、y2、y2、y3、y3、...、yn、yn]。これは動作しますが、それはかなり醜いです。 それから、私は分数を使うでしょうが、代わりに「オブジェクト配列はサポートされていません」と言っていました。 残念ながら、これは行く方法に見えましたが、確かにパフォーマンスの低下があります。
この問題のもう1つの側面があります:キーが同じ種類の時刻である辞書を作成することができればうれしく、私が検索すると恐れます floatを同じキーとして使用する同じ問題が原因で検索が失敗します。
私の最後のアイデアはdatetime.dateのような日付を使用することでしたが、日付の差をを年の分数に変換するときのあいまいさのためあまり幸せではありません。
これには最適な方法はありますか?良い解決策はありますか?
ありがとうございました、はい、私は整数を日数で使用することを考えましたが、最終的にはそれが私の行うことです。私はこれまで避けていましたが、何回も私は「1ヶ月」経過しており、30日であれば12ヶ月は1年よりも短いです。しかし、私は1年間を360日間と数えます。それはそれです。 – zeycus
面白いですが、私は現在整数を使用していますが、補間で同じ問題が発生します。 scipy.integrate.interp1dのドキュメントを見ると、x引数は「実数値の1次元配列」です。私のハックなソリューションの周りに方法はないと思われる? – zeycus
うーん、あなたは正しいかもしれない... –