Deedle OptionalValue.Missing不能被Series.dropmissing删除

时间:2014-08-16 04:06:04

标签: f# deedle

这是http://bluemountaincapital.github.io/Deedle/reference/deedle-seriesmodule.html

的代码示例
let s1 = series [ 1 => 1.0; 2 => Double.NaN ]
s1 |> Series.dropMissing 

缺失值将按预期删除。但是,如果我将其更改为

let s2 = series [ 1 => OptionalValue(1.0); 2 => OptionalValue.Missing ]
s2 |> Series.dropMissing 

不会删除缺失的值。

我注意到S2是

Series<int,OptionalValue<float>> 
当p1是

时输入

Series<int,float>

这是设计的行为吗?

我问这个问题的原因是我从这个答案Deedle moving window stats calcuation with a dynamic condition and boundary.atending

获得了这段代码
let lastKey = ref None
let r = 
  ts |> Series.aggregateInto
      (WindowWhile(fun d1 d2 -> d1.AddMonths(1) >= d2)) (fun seg -> seg.Data.LastKey())
      (fun ds -> 
         match lastKey.Value, ds.Data.LastKey() with 
         | Some lk, clk when lk = clk -> OptionalValue.Missing
         | _, clk -> lastKey := Some clk; OptionalValue(ds.Data))
     |> Series.dropMissing

Series.aggregateInto可以以某种方式返回非OptionalValue系列,同时仍包含缺失值。如果我想在我创建的系列中使用OptionalValue.Missing,那么Stats.mean可以正确地忽略它们,这是正确的方法吗?

同时将系列/帧写入缺失值的csv Deedle将在输出中显示空白。但是如果Series / Frame包含OptionalValue,Deedle会将字符串放在输出中。这是设计的吗?

1 个答案:

答案 0 :(得分:2)

Deedle中的OptionalValue类型是系列中可选值的内部表示。因此,如果您有Series<Date, float>,它实际上会将数据存储为OptionalValue<float>。我们并没有完全将其隐藏在用户之外 - 有时(如聚合示例中),Deedle将采用OptionalValue然后直接在内部表示中使用它以使事情更快。

但是,您可能永远不想使用Series<K, OptionalValue<T>>,因为这是一种奇怪的系列(Deedle会自动处理缺失值,因此不需要这样做。)

如果要在创建系列时指定缺失值,可以使用:

let s2 = Series.ofOptionalObservations [ 1 => Some(1.0); 2 => None ]
s2 |> Series.dropMissing 

F#API通常更喜欢标准的F#option类型,因此这是ofOptionalObservations所采用的。 dropMissing函数可以在以这种方式创建的系列中正常工作。