Deedle, F # и проблемы с Frame.map - PullRequest
       24

Deedle, F # и проблемы с Frame.map

0 голосов
/ 26 февраля 2019

У меня проблема с пониманием подписей Frame.map (и, в конечном счете, и других тоже), когда я мог легко разобраться Series.map .

Вот краткий пример:

let ts1 = 
  series
   [ ("A", "A1", "p1") => 0.5 
     ("A", "A1", "p2") => 2.
     ("A", "A2", "p3") => 2. 
     ("A", "A2", "p4") => 0.5 ]

let ts2 = 
  series
   [ ("A", "A1", "p1") => "A"
     ("A", "A1", "p2") => "B"
     ("A", "A2", "p3") => "C"
     ("A", "A2", "p4") => "D" ]

let F = ["ts1" =?> ts1 ; "ts2" =?> ts2] |> Frame.ofColumns

Допустим, я хочу применить функцию к Серии ts1, Там нет проблем:

ts1 |> Series.map (fun _ v -> v * 2.)

Работает как положено ...

Но если я захочу использовать, скажем для примера:

let fun1 (a: float) (b: string) =
    match b with
    |"B" -> a ** 2.
    |"C" -> a ** 3.
    |_   -> 0.

На кадре F , я просто рисую фигуруэто из.Я пробовал вызывать столбцы.

Я не возражаю против некоторой помощи, так как я не могу понять это с предыдущими сообщениями / Документация документа / и т.д. ... Я просто застрял в подписи ...

let F2 = F |> Frame.mapRows (fun k a -> (fun1 a.GetAs<float>("ts1") a.GetAs<string>("ts2")))

1 Ответ

0 голосов
/ 27 февраля 2019

Этот тип операции очень интуитивно понятен в MATLAB / R / Python с использованием векторизованной индексации.

В Deedle Frame.mapRows получит каждую строку как ObjectSeries.Мое уродливое решение было бы таким:

F
|> Frame.mapRows(fun _ v -> 
  match string v.["ts2"] with
  | "B" -> v |> Series.map(fun k v -> if k = "ts1" then box((unbox v) * 2.) else v)
  | "C" -> v |> Series.map(fun k v -> if k = "ts1" then box((unbox v) * 3.) else v)
  | _ -> v |> Series.map(fun k v -> if k = "ts1" then box(0.) else v)
)
|> Frame.ofRows
...