F# csv 类型提供程序问题

F# csv type provider questions

我正在努力使用 F# 中的 csv 类型提供程序来执行简单的数据分析任务。我已经围绕 'Seq' 函数和整个 csv 类型提供程序进行了一些谷歌搜索,但找不到与我的问题相关的资源,因此不胜感激。

我正在尝试使用 F# 创建有关赛马数据的指标(每场比赛中的每位赛跑者)。我的数据在 csv 中并且具有类似于此的结构: raceId, runnerId, name, finishingPosition, startingPrice, etc

所以我最初想做的是按 raceId 对每个 csv 行进行分组,并在每场比赛中创建额外的 'insights'(这里的一个例子是 'positionInBetting' 使用 'startingPrice' 为每个跑步者在比赛中)。

这是我的:

open FSharp.Data

type Runner = CsvProvider<Sample="runners.csv",AssumeMissingValues=true>
let dataset = Runner.Load("runners.csv")

let racesSince2010 = dataset.Rows |> Seq.filter (fun r -> r.Meeting_date.IsSome && r.Meeting_date.Value > new System.DateTime(2010,1,1)) |> Seq.groupBy (fun r -> r.Race_id)

所以这实现了按种族对跑步者进行分组的第一部分,并为我提供了元组序列,其中键是 raceId,值是跑步者的序列(我假设,但 VS 告诉我它实际上是一个 seq<CsvProvider<...>.Row>)

然后我希望它能工作:

let raceDetails (raceId, runnersList:seq<Runner>) = runnersList |> Seq.iter ( fun r -> printfn "race: %i runner: %s" raceId r.)

但是 r.name 在 VS 智能感知中不可用。我知道我不明白为什么我的分组函数的输出被定义为 seq<CsvProvider<...>.Row> 而不是 seq<Runner>,但是我找不到任何东西来向我解释它,或者如何解决我遇到的问题有.

亚历克斯

type Runner = CsvProvider<Sample="runners.csv",AssumeMissingValues=true>

此语句定义了一种表示整个 .csv 文件的类型,而不仅仅是 csv 的一行。嵌套类型是在表示文件内部数据结构的主要类型中创建的(例如 csv 文件中的行结构)。

因此,Runner 没有与之关联的 name,但 Runner.Row 应该。

乍一看,这种区别对于 csv 文件可能并不那么明显,但如果您正在处理,例如,内部结构变得更加重要。 XML.

这应该有效:

let raceDetails (raceId, runnersList:seq<Runner.Row>) = 
    runnersList 
    |> Seq.iter ( fun r -> printfn "race: %i runner: %s" raceId r.name)