Obtenez une colonne par nom comme tableau de csvfile.load (ou créez un dictionnaire des tableaux de CSV)

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

  •  21-12-2019
  •  | 
  •  

Question

J'ai le code suivant pour charger un CSV.Quelle est la meilleure façon d'obtenir une colonne de "msft" (de préférence par nom) comme une matrice?Ou devrais-je charger les données de manière différente de le faire?

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

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

Edit: Alternativement, quel serait un moyen efficace d'importer un CSV dans un dictionnaire de matrices saisies par nom de colonne?Si je devrais vraiment créer une nouvelle question pour cela, merci de me le faire savoir.Pas encore familier avec toutes les normes Stackoverflow.

Était-ce utile?

La solution

Lorsque vous dites que vous voulez que vous voulez colonne "par nom", il n'est pas clair si vous voulez dire "quelqu'un me transmet le nom de la colonne en tant que chaîne" ou "J'utilise le nom de la colonne de mon code."Les fournisseurs de types sont parfaits pour ce dernier cas, mais ne vous aidez pas vraiment avec le premier.

Pour ce dernier cas, vous pouvez utiliser ceci:

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

Si le premier, vous voudrez peut-être envisager de lire dans les données d'une autre manière, peut-être à un dictionnaire clé par les noms de colonne.

L'ensemble des fournisseurs de types est de fabriquer tout cela fortement typé et axé sur le code, et à s'éloigner des noms de colonne de passage en tant que chaînes qui pourraient ou non être valides.

Autres conseils

Bâtiment sur la réponse de la Latkin, cela semble être la méthode plus fonctionnelle ou F # de faire ce que vous voulez.

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

J'espère que cela vous aide.

J'ai traversé Cet exemple aussi.Quelque chose comme ce qui suit devrait le faire.

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

Ici, je passe ici la liste des enregistrements de données MSFT.Data et la pliant à une liste d'un élément de cette liste.Veuillez vérifier la documentation pour toutes les fonctions mentionnées.Je n'ai pas couru ça.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top