0

这是来自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>> 

键入而 s1 是

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 会将字符串放入输出中。这是设计使然吗?

4

1 回答 1

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功能适用​​于以这种方式创建的系列。

于 2014-08-17T08:56:35.397 回答