Как преобразовать целое ROW в SEQ из десятичного числа в число с плавающей точкой, а затем обратно? - PullRequest
0 голосов
/ 10 июня 2018

Как преобразовать целую строку в последовательности из десятичного числа в число с плавающей запятой, удалить пропущенные значения или значения 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)]

Это пример одного наблюдения из многих в ПОСЛЕДОВАТЕЛЬНОСТИ.Мне нужно отфильтровать это конкретное наблюдение с помощью функции, описанной выше.

Я пытался использовать Double.Is.NaN, но по какой-то причине оно не работает.

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

Iполучаю эту ошибку:

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

1 Ответ

0 голосов
/ 10 июня 2018

Вам следует взглянуть на документацию Csv * и документацию синтаксического анализатора Csv .Например, вы можете напрямую применить Filter и Map к предоставленному типу Csv, чтобы преобразовать ваши данные.В этом случае вы будете работать с типом напрямую (а не с Row, например, с CsvFile.GetSample ()).Кроме того, синтаксический анализ файла CSV лучше подходит для искаженных данных.Может быть возможность указать схему и тип напрямую, а также справиться с пропущенными значениями.

Конечно, вы можете отфильтровать nan и преобразовать число с плавающей точкой в ​​десятичное число обычным способом (это работает на 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)]

Данные, которые я использовал:

Id, State, Income
40, TX, 2000.1
48, MO, # N /A
15, TX, 3000
78, TN,
41, VT,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...