Frame.mapCols 的例子是什么?
What would be an example for Frame.mapCols?
我正在尝试为 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>'
我做错了什么?有人可以 post 举个例子吗?或者,更好的是,指向一个有 Deedle 方法示例的地方?
Frame.mapCols
函数可让您将一个列系列转换为另一个列系列。
最基本的例子就是return列系列不变:
df1
|> Frame.mapCols (fun k col -> col)
正如 Foggy Finder 在评论中提到的,您可以使用此方法填充列中的所有缺失值 - lambda 的主体必须 return 一系列:
df1
|> Frame.mapCols (fun k v -> Series.fillMissingWith 0.0 v)
如果你愿意,你可以 return 一个只有一个元素的系列(这会将你的框架变成一个只有一行的框架 - 包含第一行的数据 - 和原始列数):
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))
我正在尝试为 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>'
我做错了什么?有人可以 post 举个例子吗?或者,更好的是,指向一个有 Deedle 方法示例的地方?
Frame.mapCols
函数可让您将一个列系列转换为另一个列系列。
最基本的例子就是return列系列不变:
df1
|> Frame.mapCols (fun k col -> col)
正如 Foggy Finder 在评论中提到的,您可以使用此方法填充列中的所有缺失值 - lambda 的主体必须 return 一系列:
df1
|> Frame.mapCols (fun k v -> Series.fillMissingWith 0.0 v)
如果你愿意,你可以 return 一个只有一个元素的系列(这会将你的框架变成一个只有一行的框架 - 包含第一行的数据 - 和原始列数):
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))