【问题标题】:CSV Type Provider & Accessing DataCSV 类型提供程序和访问数据
【发布时间】:2019-02-12 01:33:33
【问题描述】:

晚上好!我是一个刚接触 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

非常感谢任何帮助!

【问题讨论】:

  • 您正在连续访问Patient number,所以不能以相同的方式访问第 n-th 列吗?然后你不能map 在行上创建 x,y 坐标来绘制吗?

标签: f# f#-data


【解决方案1】:

我可能会建议使用 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 值作为元组的序列(或列表)(而不是生成两个单独的序列)。

【讨论】:

  • 我不明白为什么这不是公认的答案。 +1
【解决方案2】:

您要做的是将行序列转换为列中的值序列。您可以使用 Seq.map 进行任何此类转换。

在你的情况下,你可以这样做(以我没有的正确列名为模)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多