我正在努力在 F# 中使用 csv 类型提供程序来完成简单的数据分析任务。我已经对“Seq”函数和整个 csv 类型提供程序进行了一些谷歌搜索,但找不到与我的问题相关的资源,因此感谢您的帮助。
我正在尝试使用 F# 创建有关赛马数据的指标(每场比赛中的每个跑步者)。我的数据在 csv 中,结构类似于:raceId、runnerId、name、finishPosition、startingPrice 等
所以我最初想做的是按raceId对每个csv行进行分组,并在每场比赛中创建额外的“洞察力”(这里的一个例子是“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)
因此,这实现了按种族对跑步者进行分组的第一部分,并给了我 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>
,但我找不到任何东西可以向我解释,或者如何解决我遇到的问题。
亚历克斯