我很难在F#中使用csv类型提供程序来进行简单的数据分析任务。我已经围绕'Seq'函数和csv类型提供程序进行了一些Google搜索,但是无法找到与我的问题相关的资源,所以请帮助。
我正在尝试使用F#来创建赛马数据的指标(在比赛中每个跑步者)。我的数据在csv中,并且具有与此类似的结构: raceId,runnerId,name,finishingPosition,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告诉我它实际上是{{1} })
然后我希望这可行:
seq<CsvProvider<...>.Row>
但在VS intellisense中无法使用r.name。我知道我无法理解为什么我的分组功能的输出被定义为let raceDetails (raceId, runnersList:seq<Runner>) = runnersList |> Seq.iter ( fun r -> printfn "race: %i runner: %s" raceId r.)
而不是seq<CsvProvider<...>.Row>
,但我找不到任何可以向我解释的内容,或者如何解决我的问题具有
亚历
答案 0 :(得分: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)