2017-11-02 3 views
2

ディードルシリーズの最初の欠損値のキーを見つける必要があります。私は以下の関数を書くことができました。これはうまくいくようです。私はDeedleがもっと良い方法を持っているのだろうか、そしてより一般的には欠けている(または欠損していない)値のすべてのキーを返す高速な関数だろうと思う。Deedleシリーズで欠損値の最初のキーを見つけるより良い方法はありますか?

let firstMissing (s: Series<'a,_>) = 
let e = (s.Keys).GetEnumerator() 

let rec loop() = 
    if e.MoveNext() then 
     if s |> Series.has e.Current then loop() 
     else e.Current |> Some 
    else None 

loop() 

let s2 = Series.ofOptionalObservations [ 1 => Some(1.0); 2 => None ] 
// val it : Series<int,float> = 
    series [ 1 => 1; 2 => <missing>] 
firstMissing s2 
val it : int option = Some 2 

let s4 = Series.ofValues [1..4] 
firstMissing s4 
val it : int option = None 

答えて

3

ペア、私はあなたが値を持たないものを見つけるまで、キーをスキャンするよりも任意の主に異なるオプションがあると思いませんが、キーのシーケンスを返すSeries.observationsAllを使用して、よりきれいにそれを行うことができますオプションの値を持つ:

s2 |> Series.observationsAll |> Seq.tryPick (function (k, None) -> Some k | _ -> None) 

すべてのキーがそうでない場合、値なしで最初のキーと値とSome kを持っている場合、これはNone返します。

+0

ありがとうございました。私は 'Series.observationsAll'を知らなかった。私の驚いたことに、私が使った方法は 'Series.observationsAll'を使うよりも約20%速くなっています。 – Soldalma

関連する問題