2013-12-15 17 views
5

Sto cercando di capire qual è il modo migliore in F # per creare un Frame Deedle, quando i dati provengono da un server SQL. Ho provato cose come le seguenti.F #: Come creare un Frame Deedle con origine dati SQL

#I "../packages/Deedle.0.9.12" 
#load "Deedle.fsx" 

#r "System.dll" 
#r "System.Data.dll" 
#r "System.Data.Linq" 
#r "FSharp.Data.TypeProviders.dll" 

open System 
open System.Data 
open System.Data.Linq 
open Microsoft.FSharp.Data.TypeProviders 
open Deedle 

type dbSchema = SqlDataConnection<"Data Source=server;Initial  Catalog=database;Integrated Security=SSPI;"> 
let db = dbSchema.GetDataContext() 

let fr = db.SomeTable |> Frame.ofRows 

e alcune altre varianti. Ma senza fortuna. Sono nuovo sia per F # che per Deedle. Posso capire perché quanto sopra non funziona (il Frame.ofRows non è compatibile con l'argomento) ma non so quale sia il modo migliore di procedere (o anche come procedere).

+0

Per gli utenti di base qui è utile far notare a * vedere * i risultati mostrato a "Il risultato è il seguente:" è necessario chiamare il Frame.Print() quindi per l'esempio precedente fr.Print() – user1796185

risposta

9

La funzione Frame.ofRows prevede una sequenza di serie che rappresentano singole righe del frame. Analogamente a Frame.ofColumns, questa funzione è utile se si dispone già di alcuni oggetti serie (o se si sta creando tutto da zero). Prendono input di tipo seq<'TRowKey * ISeries<'TColKey>>.

Quando si crea il frame Deedle da una struttura di dati .NET, è possibile utilizzare Frame.ofRecords che funzionerà su qualsiasi sequenza e utilizzerà il reflection per ottenere i nomi delle proprietà (e trattarle come nomi di colonne).

Una lunga spiegazione, ma solo alcuni caratteri cambiano nel codice :-). L'ho provato con Northwind:

type Nwind = SqlDataConnection<"""Data Source=.\SQLExpress; 
    Initial Catalog=Northwind;Integrated Security=SSPI;"""> 
let db = Nwind.GetDataContext() 

// Create data frame from Products table (with appropriate column names) 
let fr = db.Products |> Frame.ofRecords 

Il risultato è:

 ProductID ProductName      SupplierID CategoryID QuantityPerUnit  UnitPrice UnitsInStock UnitsOnOrder ReorderLevel Discontinued OrderDetails        Categories Suppliers 
0 -> 1   Chai        1   1   10 boxes x 20 bags 18.0000 39   0   10   False  System.Data.Linq.EntitySet`1[OrderDetails] Categories Suppliers 
1 -> 2   Chang       1   1   24 - 12 oz bottles 19.0000 17   40   25   False  System.Data.Linq.EntitySet`1[OrderDetails] Categories Suppliers 
2 -> 3   Aniseed Syrup     1   2   12 - 550 ml bottles 10.0000 13   70   25   False  System.Data.Linq.EntitySet`1[OrderDetails] Categories Suppliers 
3 -> 4   Chef Anton's Cajun Seasoning  2   2   48 - 6 oz jars  22.0000 53   0   0   False  System.Data.Linq.EntitySet`1[OrderDetails] Categories Suppliers 
4 -> 5   Chef Anton's Gumbo Mix   2   2   36 boxes   21.3500 0   0   0   True   System.Data.Linq.EntitySet`1[OrderDetails] Categories Suppliers 
(....) 
+0

Perfect! Molte grazie. Ho visto il metodo, ma ho pensato che fosse applicato solo ai record definiti "nel modo usuale". Qual è il modo migliore per digitare la cornice, se voglio dire due colonne per definire la chiave. Un giorno e un'ora? – Stefan

Problemi correlati