Почему 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
,