Почему Deedle преобразует логический столбец DataFrame в серию с плавающей точкой?

Когда я запускаю код ниже, я получаю DataFrame с одним bool колонна и два double колонны. Тем не менее, когда я извлекаю boolСтолбец как серия. Результатом является объект Series с типами. DateTime а также float,

Это выглядит как 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 ответа

Решение

Как указывает существующий ответ, GetColumn это путь Вы можете указать общий параметр непосредственно при вызове GetColumn и избегайте аннотации типа, чтобы сделать код лучше:

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

Рамка Deedle не отслеживает статически типы столбцов, поэтому, если вы хотите получить столбец в виде типизированной серии, вам нужно каким-то образом указать тип.

Мы не хотели заставлять людей писать аннотации типов, потому что они имеют тенденцию быть довольно длинными и некрасивыми, поэтому основной способ получения столбца GetColumn где вы можете указать аргумент типа как в примере выше.

Другие способы доступа к столбцу, такие как df?third а также df.["third"] являются сокращениями, которые предполагают, что тип столбца float потому что это довольно распространенный сценарий (по крайней мере, для наиболее распространенного использования Deedle в финансах), поэтому эти две нотации дают вам более простой способ, который "часто работает хорошо".

Ты можешь использовать .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Затем Дидл пытается привести его к чему-либо, или, может быть, он пытается все float,

Другие вопросы по тегам