2

我正在努力在 F# 中使用 csv 类型提供程序来完成简单的数据分析任务。我已经对“Seq”函数和整个 csv 类型提供程序进行了一些谷歌搜索,但找不到与我的问题相关的资源,因此感谢您的帮助。

我正在尝试使用 F# 创建有关赛马数据的指标(每场比赛中的每个跑步者)。我的数据在 csv 中,结构类似于:raceId、runnerId、name、finishPosition、startingPrice 等

所以我最初想做的是按raceId对每个csv行进行分组,并在每场比赛中创建额外的“洞察力”(这里的一个例子是“po​​sitionInBetting”对比赛中的每个跑步者使用“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)

因此,这实现了按种族对跑步者进行分组的第一部分,并给了我 seq 元组,其中键是 raceId,值是 Runners 的 seq(我假设,但 VS 告诉我它实际上是 a seq<CsvProvider<...>.Row>

然后我希望这可以工作:

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

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

亚历克斯

4

1 回答 1

2

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)
于 2015-12-11T13:45:08.233 回答