当我运行下面的代码时,我得到一个DataFrame
,其中包含一个bool
列和两个double
列。但是,当我将bool
列提取为系列时,结果是一个类型为DateTime
和float
的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> = ...
答案 0 :(得分:2)
正如现有的答案所指出的那样,GetColumn
是可行的方法。您可以在调用GetColumn
时直接指定泛型参数,并避免使用类型注释来使代码更好:
let sb = df1.GetColumn<bool>("third")
Deedle框架不会静态跟踪列的类型,因此当您想要将列作为类型化系列时,需要以某种方式指定类型。
我们不想强迫人们编写类型注释,因为它们往往很长而且很难看,因此获取列的主要方法是GetColumn
,您可以在其中指定类型参数,如上所述示例
访问df?third
和df.["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
。