2016-08-26 34 views
3

如何正常化deedle幀中的數據?Deedle正常化幀

我試過這種方法,但一個不工作

let iris = Frame.ReadCsv("./iris.csv") 
let keys = iris.ColumnKeys |> Seq.toArray 
let x = iris.Columns.[keys.[0..4]] 
let mu = x |> Stats.mean 
let std = x |> Stats.stdDev 
//Not working becasue couldnt substract series from frame 
let norm = (x - mu)/std 

回答

6

frame - series超載期待您減去frame的所有列的series,即框架和的行鍵系列的行鍵對齊。

對於你的使用情況,您需要對齊列鍵 - 沒有一個單一的運營商,但你可以使用mapRows功能做到這一點:

let x = iris.Columns.[keys.[0..3]] 
let mu = x |> Stats.mean 
let std = x |> Stats.stdDev 

let norm = 
    x 
    |> Frame.mapRowValues (fun r -> (r.As<float>() - mu)/std) 
    |> Frame.ofRows 

我也改變了你的x是公正從keys.[0..3]因爲否則你會試圖正常化類型string,其中失敗。

+0

謝謝!其實我也嘗試過使用mapRowValues,我不明白是'.As'操作符需要這個。 Docs對此有點不清楚。 – baio

+0

這是因爲Deedle悲傷地不知道所有的行都是數字的(它們實際上不是,如果你不放棄第四列) - 調用'row.As ()'變成一行'Series '轉換成支持'-'運算符的'系列'。 –