Тип CSV-провайдера и доступ к данным - PullRequest
0 голосов
/ 12 февраля 2019

Добрый вечер!Я очень новый программист, промокающий ноги F #.Я пытаюсь провести простой анализ данных и составить график, но не могу понять, как правильно обращаться к данным.Я все настроил и использую CSVProvider, и он отлично работает:

#load @"packages\FsLab\FsLab.fsx"
#load @"packages\FSharp.Charting\FSharp.Charting.fsx"

open Deedle
open FSharp.Data


type Pt = CsvProvider<"C:/Users/berkl/Test10/CGC.csv">
let data = Pt.Load("C:/Users/berkl/Test10/CGC.csv")

Затем я извлекаю данные для конкретной записи:

let test = data.Rows |> Seq.filter (fun r -> r.``Patient number`` = 2104)

Это работает, как ожидается, и печатаетследующее к FSI:

test;;
val it : seq<CsvProvider<...>.Row> =
  seq
    [(2104, "Cita 1", "Nuevo", "Femenino", nan, nan, nan);
     (2104, "Cita 2", "Establecido", "", 18.85191818, 44.0, 103.0);
     (2104, "Cita 3", "Establecido", "Femenino", 17.92617533, 46.0, 108.0);
     (2104, "Cita 4", "Establecido", "Femenino", nan, nan, nan); ...]

Вот где я в недоумении.Я хочу вынуть пятую колонку и построить ее напротив шестой колонны.И я не знаю, как получить к нему доступ.

Что я могу сделать, так это получить доступ к одному значению в одном из столбцов:

let Finally = Seq.item 1 test
let PtHt = Finally.Ht_cm

Любая помощь очень ценится !!

Ответы [ 2 ]

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

Я бы, вероятно, рекомендовал использовать библиотеку XPlot вместо F # Charting, потому что она будет доступна в FsLab в долгосрочной перспективе (она кроссплатформенная).

Для создания диаграммыиспользуя XPlot, вам нужно задать последовательность пар со значениями X и Y:

#load "packages/FsLab/FsLab.fsx"
open XPlot.Plotly

Chart.Scatter [ for x in 0.0 .. 0.1 .. 10.0 -> x, sin x ]

В вашем примере вы можете получить требуемый формат, используя понимание последовательности (как в примере выше) или Seq.map как в существующем ответе - оба варианта делают одно и то же:

// Using sequence comprehensions
Chart.Scatter [ for row in test -> row.Ht_cm, row.Wt_kg ]

// Using Seq.map and piping
test |> Seq.map (fun row -> row.Ht_cm, row.Wt_kg) |> Chart.Scatter

Главное, что вам нужно создать одну последовательность (или список), содержащую значения X и Y в виде кортежа (вместо создания двух отдельных последовательностей).

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

То, что вы хотите сделать, - это преобразовать вашу последовательность строк в последовательность значений из столбца.Вы используете Seq.map для любого такого преобразования.

В вашем случае вы можете сделать (по модулю правильные имена столбцов, которых у меня нет)

let col5 =
    test
    |> Seq.map (fun row -> row.Ht_cm)

let col6 =
    test
    |> Seq.map (fun row -> row.Wt_kg)
...