Ottieni una colonna per nome come array da csvfile.load (o crea dizionario degli array da CSV)

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

  •  21-12-2019
  •  | 
  •  

Domanda

Ho il seguente codice per caricare un CSV.Qual è il modo migliore per ottenere una colonna da "MSFT" (preferibilmente per nome) come array?O dovrei caricare i dati in un modo diverso per farlo?

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

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

Modifica: in alternativa, quale sarebbe un modo efficiente per importare un CSV in un dizionario di array ketted per nome della colonna?Se dovessi davvero creare una nuova domanda per questo, per favore fammi sapere.Non ancora familiarità con tutti gli standard Stackoverflow.

È stato utile?

Soluzione

Quando dici di voler colonna "per nome" Non è chiaro se vuoi dire "Qualcuno mi passa il nome della colonna come stringa" o "Io uso il nome della colonna nel mio codice".I provider di tipo sono perfetti per quest'ultimo caso, ma non aiutano davvero con il primo.

Per quest'ultimo caso, è possibile utilizzare questo:

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

Se il primo, potresti voler considerare di leggere nei dati in un altro modo, forse a un dizionario con chiave da nomi di colonne.

L'intero punto di provider di tipo è quello di rendere tutto questo fortemente digitato e focalizzato dal codice e per allontanarsi dal passaggio dei nomi delle colonne come stringhe che potrebbero o potrebbero non essere valide.

Altri suggerimenti

Costruire sulla risposta di Latkin, questo sembra il modo più funzionale o f # di fare ciò che vuoi.

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
.

Spero che questo aiuti.

Sono andato avanti Questo esempio pure.Qualcosa come il seguente dovrebbe farlo.

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

Qui sto conducendo l'elenco MSFT.Data dei record di dati MSFT e lo ripiegano in un elenco di un elemento da quell'elenco.Si prega di verificare la documentazione per tutte le funzioni menzionate.Non ho eseguito questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top