How to normalize data in deedle frame ?
I've tried this approach but one doesn't work
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
The frame - series
overload expects that you are subtracting the series
from all columns of the frame
, i.e. that the row keys of the frame and the row keys of the series align.
For your use case, you need to align the column keys - there is no single operator for this, but you can do it using the mapRows
function:
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
I also changed your x
to be just from keys.[0..3]
because otherwise you'd be trying to normalize column of type string
, which fails.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With