CSV 类型提供者和访问数据
CSV Type Provider & Accessing Data
晚上好!我是一个刚接触 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
非常感谢任何帮助!!
您要做的是将行序列转换为列中的值序列。您使用 Seq.map
进行任何此类转换。
在你的情况下,你可以这样做(取模我没有的正确列名)
let col5 =
test
|> Seq.map (fun row -> row.Ht_cm)
let col6 =
test
|> Seq.map (fun row -> row.Wt_kg)
我可能会推荐使用 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 值的序列(或列表)作为元组(而不是生成两个单独的序列)。
晚上好!我是一个刚接触 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
非常感谢任何帮助!!
您要做的是将行序列转换为列中的值序列。您使用 Seq.map
进行任何此类转换。
在你的情况下,你可以这样做(取模我没有的正确列名)
let col5 =
test
|> Seq.map (fun row -> row.Ht_cm)
let col6 =
test
|> Seq.map (fun row -> row.Wt_kg)
我可能会推荐使用 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 值的序列(或列表)作为元组(而不是生成两个单独的序列)。