2015-12-11 3 views
2

Я изо всех сил пытаюсь обойти меня, используя провайдер типа CSV в F # для простых задач анализа данных. Я сделал несколько поисковых запросов вокруг функции «Seq» и ​​поставщика типа csv в целом, но не могу найти ресурсы, имеющие отношение к моей проблеме, поэтому помощь приветствуется.Вопросы провайдера типа # # # # # # # # #

Я пытаюсь использовать F # для создания показателей на данных Horse Racing (за каждого бегуна в гонке). Мои данные в формате CSV и имеет структуру, подобную этой: raceId, runnerId, имя, finishingPosition, startingPrice и т.д.

Так что я хочу сделать изначально группу, каждая из CSV строки по raceId и создать дополнительные «идеи» на каждой гонке (примером здесь будет «positionInBetting» с использованием «startPrice» для каждого бегуна в гонке).

это то, что у меня есть:

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 и значение является следом полозьев (I предположим, но 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 IntelliSense. Я знаю, что не понимаю, почему вывод моей функции группировки определяется как seq<CsvProvider<...>.Row> вместо seq<Runner>, но я не могу найти что-либо, чтобы объяснить это мне, или как атаковать проблему, которую я испытываю.

Alex

+0

понял это - необходимый «Runner», чтобы быть изменен на «Бегуны» и новой линии типа Runner = Runners.Row –

ответ

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)