Obtenha uma coluna por nome como array de CsvFile.Load (ou crie um dicionário de arrays de csv)

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

  •  21-12-2019
  •  | 
  •  

Pergunta

Eu tenho o seguinte código para carregar um csv.Qual é a melhor maneira de obter uma coluna de "msft" (de preferência por nome) como um array?Ou devo carregar os dados de uma maneira diferente para fazer isso?

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

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

Editar:Alternativamente, qual seria uma maneira eficiente de importar um csv para um dicionário de matrizes codificadas por nome de coluna?Se eu realmente deveria criar uma nova pergunta para isso, por favor me avise.Ainda não estou familiarizado com todos os padrões stackoverflow.

Foi útil?

Solução

Quando você diz que deseja coluna "por nome", não está claro se você quer dizer "alguém me passa o nome da coluna como uma string" ou "Eu uso o nome da coluna no meu código". Os provedores de tipos são perfeitos para o último caso, mas não ajudam realmente com o primeiro.

Para o último caso, você poderia usar isto:

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

No primeiro caso, você pode querer considerar a leitura dos dados de alguma outra maneira, talvez para um dicionário codificado por nomes de colunas.

O objetivo dos provedores de tipos é tornar tudo isso fortemente tipado e focado no código, e deixar de passar nomes de colunas como strings que podem ou não ser válidas.

Outras dicas

Com base na resposta de Latkin, esta parece ser a maneira mais funcional ou em F # de fazer o que você deseja.

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

Espero que isso ajude.

Eu atravessei este exemplo também.Algo como o seguinte deve bastar.

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

Aqui estou canalizando a lista msft.Data de registros de dados msft e dobrando-a em uma lista de um item dessa lista.Por favor, verifique a documentação para todas as funções mencionadas.Eu não executei isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top