这是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会将字符串放在输出中。这是设计的吗?
答案 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
函数可以在以这种方式创建的系列中正常工作。