我正在尝试使用 Deedle 进行一些基于行的计算。但是大多数示例都是基于列的。例如我有这个简单的结构:
let tt = Series.ofObservations[ 1=>10.0; 3=>20.0;5=> 30.0 ]
let tt2 = Series.ofObservations[1=> 10.0; 3=> Double.NaN; 6=>30.0 ]
let f1 = frame ["cola" => tt; "colb"=>tt2]
val f1 : Frame<int,string> =
cola colb
1 -> 10 10
3 -> 20 <missing>
5 -> 30 <missing>
6 -> <missing> 30
我想计算可乐和可乐的平均值。如果我做
f1.Rows |> Series.mapValues(fun r -> (r.GetAs<float>("cola") + r.GetAs<float>("colb") )/2.0)
val it : Series<int,float> =
1 -> 10
3 -> <missing>
5 -> <missing>
6 -> <missing>
我知道我可以匹配每一列来处理平均值,但是如果有很多列,这将不切实际。
f1.Rows 返回的每一行都是一个 ObjectSeries 可以将其转换为浮点系列并将 stats.mean 应用于一行吗?
谢谢卡比
更新:
我想我可能已经找到了一种方法来做到这一点(参考:https ://github.com/BlueMountainCapital/Deedle/issues/100 ):
折叠操作:
f1.Rows |> Series.mapValues(fun v -> v.As<float>() |> Series.foldValues (fun acc elem -> elem + acc) 0.0 )
意思是(它正确地跳过了缺失值):
f1.Rows |> Series.mapValues(fun v -> v.As<float>() |> Stats.mean )
数数:
f1.Rows |> Series.mapValues(fun v -> v.As<float>() |> Stats.count )
如果有不同的方法,请告诉我。希望这对像我这样的新人有用。