当数据来自SQL服务器时,我试图找出在F#中创建Deedle Frame的最佳方法。我尝试过以下内容。
#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
以及其他一些变种。但没有运气。我是F#和Deedle的新手。 我可以看出上面的原因不起作用(Frame.ofRows与参数不兼容)但我不知道最好的方法是什么(甚至如何继续)。
答案 0 :(得分:9)
Frame.ofRows
函数需要一系列表示帧的各行的序列。与Frame.ofColumns
类似,如果您已经有一些系列对象(或者如果您从头开始创建所有内容),则此函数很有用。他们接受seq<'TRowKey * ISeries<'TColKey>>
类型的输入。
当您从某些.NET数据结构创建Deedle框架时,您可以使用Frame.ofRecords
来处理任何序列,它将使用反射来获取属性的名称(并将它们视为列名称) )。
一个很长的解释,但代码中只有几个字符发生变化:-)。我用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
结果是:
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
(....)