如何将SEQ中的整个ROW从十进制转换为float,然后再返回?

时间:2018-06-10 05:51:35

标签: f#

如何将序列中的整行从小数转换为浮点数,删除缺失值或nan值,然后将这些相同的值重新转换为小数,这些都在同一函数中。

有什么建议吗?

按行表示从CSV提供程序创建类型时选择的行。

type IncomeCsv = CsvProvider<IncomeCsvFile>
IncomeCsv.GetSample().Rows
|> Seq.filter (fun row -> row.State = "TX")
|> List.ofSeq

对于TX的一次观察,我得到了这些值:

[(TX, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan, nan, nan, nan, nan, nan)]

这是SEQUENCE中许多人观察到的一个例子。我需要使用上述功能过滤掉这个特定的观察结果。

我尝试过使用Double.Is.NaN,但由于某些原因它无效。

|> Seq.filter (fun element -> not (Double.IsNaN element))

我收到此错误:

  Practice2.fsx(39,53): error FS0001: This expression was expected to have 
     type
  'float'    
     but here has type
  'CsvProvider<...>.Row'

1 个答案:

答案 0 :(得分:1)

您应该查看Csv type providerCsv file parser documentation。例如,您可以直接在Csv提供的类型上应用FilterMap来转换数据。在这种情况下,您将直接操作该类型(而不是其Row,例如在CsvFile.GetSample()上)。此外,csv文件解析更适合格式错误的数据。可以选择直接指定架构和类型,以及处理缺失值。

您当然可以过滤掉nan并以通常的方式将float转换为十进制(这可以在CsvProvider.Row上运行):

data 
|> Seq.filter (fun x -> not  (Double.IsNaN(x.Income)))
|> Seq.map (fun x -> (x.Id, x.State, decimal x.Income))
//val it : seq<int * string * decimal> =seq [(40, "TX", 2000.1M); (15, "TX", 3000M)]

我使用的数据:

  

身份证,国家,收入
  40,TX,2000.1
  48,MO,#N / A
  15,TX,3000
  78,TN,
  41,VT,