Skip to content

Instantly share code, notes, and snippets.

@fwaris
Created July 1, 2011 19:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fwaris/28824fca92e020f7fcf5 to your computer and use it in GitHub Desktop.
Save fwaris/28824fca92e020f7fcf5 to your computer and use it in GitHub Desktop.
open System.IO
open System
open System.Xml
type ComplaintRecord = {Company:string; Make:string; Model:string; Year:string; Date:DateTime}
let complaintsFile = @"C:\ws\nhtsa\FLAT_CMPL\FLAT_CMPL.txt"
let toDate s = if s="" then DateTime.MinValue else XmlConvert.ToDateTime(s,"yyyyMMdd")
let mapComplaint = (fun (line:string) ->
let fs = line.Split('\t')
let date = fs.[7].Trim() |> toDate
{Company=fs.[2]; Make=fs.[3]; Model=fs.[4]; Year=fs.[5]; Date=date})
let complaints = complaintsFile |> File.ReadLines |> Seq.map mapComplaint |> Seq.toArray
let complaintCountByModelYear =
complaints
|> Seq.filter (fun r -> r.Make = "HONDA")
|> Seq.countBy (fun r -> (r.Model, r.Year))
|> Seq.sortBy (fun (modelYear,count) -> -count)
|> Seq.toArray
;;
printfn "%A" complaintCountByModelYear
let calcAverage filterFunction =
complaints
|> Seq.filter filterFunction
|> Seq.countBy (fun r -> (r.Model, r.Year))
|> Seq.averageBy (fun (_,count) -> (float)count)
let fordBefore2k7 = calcAverage (fun r -> r.Make = "FORD" && r.Date.Year < 2007)
let fordAFter2k7 = calcAverage (fun r -> r.Make = "FORD" && r.Date.Year >= 2007)
let hondaBefore2k7 = calcAverage (fun r -> r.Make = "HONDA" && r.Date.Year < 2007)
let hondaAFter2k7 = calcAverage (fun r -> r.Make = "HONDA" && r.Date.Year >= 2007)
let toyotaBefore2k7 = calcAverage (fun r -> r.Make = "TOYOTA" && r.Date.Year < 2007)
let toyotaAFter2k7 = calcAverage (fun r -> r.Make = "TOYOTA" && r.Date.Year >= 2007)
;;
printfn "Ford %0.2f/%0.2f; Honda %0.2f/%0.2f; Toyota %0.2f/%0.2f"
fordBefore2k7 fordAFter2k7 hondaBefore2k7
hondaAFter2k7 toyotaBefore2k7 toyotaAFter2k7
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment