Получить столбец по имени как массив из CSVFile.load (или создать словарь массивов от CSV)

StackOverflow https://stackoverflow.com//questions/21030203

  •  21-12-2019
  •  | 
  •  

Вопрос

У меня есть следующий код для загрузки CSV.Какой лучший способ получить столбец из «MSFT» (желательно по имени) в качестве массива?Или я должен загрузить данные по-другому, чтобы сделать это?

#r "FSharp.Data.dll"
open FSharp.Data.Csv

let msft = CsvFile.Load("http://ichart.finance.yahoo.com/table.csv?s=MSFT").Cache()
.

Редактировать: в качестве альтернативы, каково было бы эффективным способом импорта CSV в словарь массивов, развязанных именем столбца?Если я действительно должен создать новый вопрос для этого, пожалуйста, дайте мне знать.Пока не знаком со всеми стандартами Stackoverflow.

Это было полезно?

Решение

Когда вы говорите, что вы хотите столбец «по имени», неясно, если вы имеете в виду: «Кто-то передает мне имя столбца как строку» или «Я использую имя столбца в моем коде».Поставщики типа идеально подходят для последнего случая, но на самом деле не помогают с первым.

Для последнего случая вы можете использовать это:

let closes = [| yield! msft.Data |> Seq.map (fun x -> x.Close) |]
.

Если бывший, вы, возможно, захотите рассмотреть данные чтения данных каким-либо другим способом, возможно, на словарь, ключ от имени столбцов.

Весь точка провайдеров типа - значит сделать все это сильно напечатано и сфокусировано кода, и отойти от прохождения имен столбцов в виде строк, которые могут или могут быть недействительными.

Другие советы

Строительство на ответе Латна, это похоже на более функциональный или F # способ делать то, что вы хотите.

let getVector columnAccessor msft = 
    [| yield! msft.Data |> Seq.map columnAccessor |]

(* Now we can get the column all at once *)
let closes = getVector (fun x -> x.Close) msft

(* Or we can create an accessor and pipe our data to it. *) 
let getCloses = getVector (fun x -> x.Close)    
let closes = msft |> getCloses
.

Я надеюсь, что это поможет.

Я прошел через Это пример также.Что-то вроде следующее должно сделать это.

let data = 
    msft.Data
    |> List.fold (fun acc row -> row.Date :: acc) List.Empty<DateTime>
.

Здесь я работаю в списке данных MSFT.DATA из записей данных MSFT и складывая его в список одного элемента из этого списка.Пожалуйста, проверьте документацию для всех упомянутых функций.Я не бегал это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top