Frame.mapCols的例子是什么?

时间:2017-03-12 17:35:01

标签: f# deedle

我正在尝试为Deedle中的所有方法创建示例,并取得了成功。我能够为Frame.filterColValues提供示例,但不为Frame.mapCols提供示例。从Tomas Petricek的大量文章中窃取,我定义了一个DataFrame,如下所示:

open Deedle

let dates  = 
  [ DateTime(2013,1,1); 
    DateTime(2013,1,4); 
    DateTime(2013,1,8) ]

let values = [ 10.0; 20.0; 30.0 ]

let first = Series(dates, values)

/// Generate date range from 'first' with 'count' days
let dateRange (first:System.DateTime) count =
    seq {for i in 0..(count - 1) -> first.AddDays(float i)}

/// Generate 'count' number of random doubles
let rand count =
    let rnd = System.Random()
    seq {for i in 0..(count - 1) -> rnd.NextDouble()}

// A series with values for 10 days 
let second = Series(dateRange (DateTime(2013,1,1)) 10, rand 10)

// df1 has two columns
let df1 = Frame(["first"; "second"], [first; second])

接下来,我能够提供Frame.filterColValues的示例:

let df2 = Frame.filterColValues (fun s -> (s.GetAtAs<double>(0) > 5.0)) df1
// df2 has only one column
Frame.toArray2D(df2)

但我不能(我努力)为Frame.map cols创建一个例子。我能想到的最好的是:

let df3 = Frame.mapCols (fun k x -> x.GetAtAs<double>(0)) df1
error FS0001: The type 'double' is not compatible with the type 'ISeries<'a>'

我做错了什么?有人可以发一个例子吗?或者,更好的是,指向一个有Deedle方法示例的地方?

1 个答案:

答案 0 :(得分:3)

使用Frame.mapCols函数可以将列系列转换为另一个列系列。

最基本的例子就是不改变列系列:

df1 
|> Frame.mapCols (fun k col -> col)

正如Foggy Finder在评论中提到的那样,您可以使用此填充列中的所有缺失值 - lambda的主体必须返回一个系列:

df1 
|> Frame.mapCols (fun k v -> Series.fillMissingWith 0.0 v)

如果你愿意,你可以返回一个只包含一个元素的系列(这会将你的框架变成一个包含一行的框架 - 包含第一行的数据 - 以及原始列数):

df1 
|> Frame.mapCols (fun k col -> series [ 0 => col.GetAtAs<float>(0) ])

在您的代码段中,您似乎只想要一个系列(每列有一个值),这可以通过获取列然后使用Series.map来完成:

df1.Columns
|> Series.map (fun k col -> col.GetAtAs<float>(0))