Obtenga una columna por nombre como matriz de csvfile.load (o cree diccionario de matrices de CSV)

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

  •  21-12-2019
  •  | 
  •  

Pregunta

Tengo el siguiente código para cargar un CSV.¿Cuál es la mejor manera de obtener una columna de "MSFT" (preferiblemente por nombre) como una matriz?¿O debería estar cargando los datos de una manera diferente de hacer esto?

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

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

Editar: Alternativamente, ¿cuál sería una manera eficiente de importar un CSV en un diccionario de matrices clave por nombre de columna?Si realmente debería crear una nueva pregunta para esto, por favor hágamelo saber.Aún no está familiarizado con todos los estándares de STACKOVERFLOW.

¿Fue útil?

Solución

Cuando dice que desea columna "por nombre", no está claro si quiere decir que "alguien me pasa el nombre de la columna como una cadena" o "Utilizo el nombre de la columna en mi código".Los proveedores de tipo son perfectos para este último caso, pero realmente no ayudan con el primero.

Para este último caso, podría usar esto:

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

Si lo primero, es posible que desee considerar leer en los datos de alguna otra manera, quizás a un diccionario clave por nombres de columnas.

El punto completo de los proveedores de tipo es hacer que todo esto sea totalmente escrito y enfocado en el código, y se aleja de pasar los nombres de columnas como cadenas que podrían o no ser válidas.

Otros consejos

Edificio en la respuesta de Latkin, esto parece ser la forma más funcional o F # de hacer lo que quiere.

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 esto ayude.

Fui a través de Este ejemplo también.Algo como lo siguiente debería hacerlo.

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

Aquí estoy tuberiendo la lista de registros de datos MSFT.DATA de MSFT y plegándola a una lista de un elemento de esa lista.Por favor, compruebe la documentación de todas las funciones mencionadas.No he corrido esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top