F#csv类型提供者问题

时间:2015-12-11 13:33:56

标签: .net f# functional-programming data-science

我很难在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>,但我找不到任何可以向我解释的内容,或者如何解决我的问题具有

亚历

1 个答案:

答案 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)