我是Deedle的新手,在文档中我找不到如何解决我的问题。
使用以下代码将SQL表绑定到Deedle Frame:
namespace teste
open FSharp.Data.Sql
open Deedle
open System.Linq
module DatabaseService =
[<Literal>]
let connectionString = "Data Source=*********;Initial Catalog=*******;Persist Security Info=True;User ID=sa;Password=****";
type bd = SqlDataProvider<
ConnectionString = connectionString,
DatabaseVendor = Common.DatabaseProviderTypes.MSSQLSERVER >
type Database() =
static member contextDbo() =
bd.GetDataContext().Dbo
static member acAgregations() =
Database.contextDbo().AcAgregations |> Frame.ofRecords
static member acBusyHourDefinition() =
Database.contextDbo().AcBusyHourDefinition
|> Frame.ofRecords "alternative_reference_table_scan", "formula"]
static member acBusyHourDefinitionFilterByTimeAgregationTipe(value:int) =
Database.acBusyHourDefinition()
|> Frame.getRows
这些事情正常工作因为我无法理解数据框架模式,令我惊讶的是,这不是表格的表示。
我的问题是:
如何通过Rows而不是Columns访问我的数据库元素(列是Deedle默认值)?我讨论了文档中显示的内容,但不幸的是,列名称无法识别,如the CSV example in Deedle Website中所示。
答案 0 :(得分:1)
使用node_t *n = get_node(key);
,您可以将表提取到数据帧中,然后对其行或列进行操作。在这种情况下,我有一个非常简单的表。这适用于SQL Server,但我认为MySQL的工作原理相同。如果您在问题中提供更多详细信息,则解决方案可以缩小范围。
这是由ID索引的表,即Int64:
您可以使用行或列:
Frame.ofRecords
将为您提供以下输出:
#if INTERACTIVE
#load @"..\..\FSLAB\packages\FsLab\FsLab.fsx"
#r "System.Data.Linq.dll"
#r "FSharp.Data.TypeProviders.dll"
#endif
//open FSharp.Data
//open System.Data.Linq
open Microsoft.FSharp.Data.TypeProviders
open Deedle
[<Literal>]
let connectionString1 = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\userName\Documents\tes.sdf.mdf"
type dbSchema = SqlDataConnection<connectionString1>
let dbx = dbSchema.GetDataContext()
let table1 = dbx.Table_1
query { for row in table1 do
select row} |> Seq.takeWhile (fun x -> x.ID < 10L) |> Seq.toList
// check if we can connect to the DB.
let df = table1 |> Frame.ofRecords // pull the table into a df
let df = df.IndexRows<System.Int64>("ID") // if you need an index
df.GetRows(2L) // Get the second row, but this can be any kind of index/key
df.["Number"].GetSlice(Some 2L, Some 5L) // get the 2nd to 5th row from the Number column
根据您尝试做的事情Selecting Specific Rows in Deedle可能也有效。
修改强>
从您的评论中,您似乎正在使用一些大表。取决于您拥有多少内存以及您仍然可以加载它的表大小。如果不是这些,你可以做一些增加复杂性的事情:
使用上述val it : Series<System.Int64,float> =
2 -> 2
>
val it : Series<System.Int64,float> =
2 -> 2
3 -> 3
4 -> 4
5 -> 5
expression缩小数据库服务器上的数据集,并将部分结果转换为数据帧。您可以进行非常复杂的转换,因此您最终可能不需要数据帧。这基本上就是Linq2Sql。
在Deedle中使用lazy loading。这适用于系列,因此您可以获得一些系列并重新组装数据帧。
使用专为此类事情设计的Big Deedle。