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)
我正在努力使用 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)