为什么Deedle将一个DataFrame布尔列转换为float系列?

时间:2017-03-14 21:32:18

标签: dataframe f# deedle

当我运行下面的代码时,我得到一个DataFrame,其中包含一个bool列和两个double列。但是,当我将bool列提取为系列时,结果是一个类型为DateTimefloat的Series对象。

看起来Deedle将“列”转换为另一种类型。

为什么会这样?

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 values2 = [ 0.0; -1.0; 1.0 ]


let first = Series(dates, values)
let second = Series(dates, values2)
let third: Series<DateTime,bool> = Series.map (fun k v -> v > 0.0) second

let df1 = Frame(["first"; "second"; "third"], [first; second; third])

let sb = df1.["third"]

df1;;
val it : Frame<DateTime,string> =
  Deedle.Frame`2[System.DateTime,System.String]
    {ColumnCount = 3;
     ColumnIndex = Deedle.Indices.Linear.LinearIndex`1[System.String];
     ColumnKeys = seq ["first"; "second"; "third"];
     ColumnTypes = seq [System.Double; System.Double; System.Boolean];
     ...

sb;;
val it : Series<DateTime,float> = ...

2 个答案:

答案 0 :(得分:2)

正如现有的答案所指出的那样,GetColumn是可行的方法。您可以在调用GetColumn时直接指定泛型参数,并避免使用类型注释来使代码更好:

let sb = df1.GetColumn<bool>("third")

Deedle框架不会静态跟踪列的类型,因此当您想要将列作为类型​​化系列时,需要以某种方式指定类型。

我们不想强迫人们编写类型注释,因为它们往往很长而且很难看,因此获取列的主要方法是GetColumn,您可以在其中指定类型参数,如上所述示例

访问df?thirddf.["third"]等列的其他方式是缩写,假设列类型为float,因为这恰好是非常常见的情况(至少是最常见的情况) Deedle在财务中的常见用法),因此这两个符号为您提供了一种更简单的方式,通常可以很好地运作#34;。

答案 1 :(得分:1)

您可以使用.GetColumn将系列解压缩为bool:

let sb':(Series<DateTime,bool>) = df1.GetColumn("third")
//val sb' : Series<DateTime,bool> =
//series [ 2013/01/01 0:00:00 => False; 2013/01/04 0:00:00 => False; 2013/01/08 0:00:00 => True]

关于你为什么这样的问题,我没有看过源代码,但我认为你使用的索引器类型可能会返回一个obj,然后Deedle尝试将它转换成某个东西,或者也许它试图将所有内容都转换为float