2016-07-29 2 views
1

Я новичок в Deedle, и в документации я не могу найти, как решить мою проблему.Deedle Frame Из базы данных, что такое схема?

Я связать SQL таблицы в кадре Deedle, используя следующий код:

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 

Эти вещи работают правильно becuse я не могу понять схему кадра данных, для моего удивления, это не представление таблицы.

Мой вопрос:

, как я могу получить доступ к своим элементам базы данных по строкам вместо столбцов (колонок Deedle по умолчанию)? I Thied, что показано в документации, но, к сожалению, имена колонок не распознаются, как в the CSV example in Deedle Website.

+0

Таким образом, вам удалось подключить SQL Server к провайдеру типов, который я вижу. Вы также должны изучить [SqlClient] (http://fsprojects.github.io/FSharp.Data.SqlClient/). Что касается вашего вопроса, то немного сложно сказать без примера ввода/вывода и ваших ожиданий. Фактически, большая часть функциональности Deedle включена ** Строки **. Поэтому, когда я работаю со столбцами, я часто заканчиваю перенос кадра. Возможно ли, что вы не присвоили индексный столбец? Скажем что-то вроде: 'let df = df.IndexRows (" DateIndex ")'. – s952163

+0

На самом деле то, что мне нужно знать, просто: Deedle добавляет индекс для перечисления строк, когда я пытаюсь получить доступ к строкам, мне нужно ссылаться на этот индекс, но я не знаю, что это такое. –

+0

Вы можете получить индекс: 'df.RowIndex' и' df.RowIndex.Keys'. – s952163

ответ

1

С Frame.ofRecords вы можете извлечь таблицу в кадр данных, а затем работать с ее строками или столбцами. В этом случае у меня очень простая таблица. Это для SQL Server, но я полагаю, что MySQL будет работать одинаково. Если вы предоставите более подробную информацию в своем вопросе, решение может сузиться.

Это таблица, индексируется по идентификатору, который Int64:

enter image description here

Вы можете работать со строками или столбцами:

#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 

Получит вам следующий вывод:

val it : Series<System.Int64,float> = 
2 -> 2 

> 
val it : Series<System.Int64,float> = 
2 -> 2 
3 -> 3 
4 -> 4 
5 -> 5 

В зависимости от того, что вы пытаетесь сделать Selecting Specific Rows in Deedle также может работать.

Редактировать

Ваш комментарий Вы, кажется, работает с некоторым большим столом. В зависимости от того, сколько памяти у вас и насколько большой стол, который вы все еще можете загрузить. Если не эти некоторые из вещей, которые вы можете сделать в возрастающей сложности:

  1. Используйте query { }expression как выше, чтобы сузить набор данных на сервере базы данных и конвертировать только часть результата в dataframe. Вы можете сделать довольно сложные преобразования, чтобы в конце концов вам даже не понадобилась дата-рамка. Это в основном Linq2Sql.

  2. Используйте lazy loading в Deedle. Это работает с серией, поэтому вы можете получить несколько серий и собрать данные.

  3. Используйте Big Deedle, который предназначен для такого рода вещей.

+0

Ваш ответ интересный, но сохраняйте мою проблему, если вы видите, что интересны по строкам, прежде чем создавать фрейм данных, проблема в том, что мне нужно будет прочитать всю таблицу, но она большая. То, как я добавил ссылку на таблицу в фрейме, так что доступ к кадру (создание различных фильтров и т. Д.) Выполняется во время работы, нет необходимости читать базу данных и хранить ее в памяти. –

+0

Вы знаете, как я могу сделать эту прямую ссылку из таблицы, как ваша? –

+0

@ AndréClaudino Вы уверены, что это проблема? Я на самом деле не повторяю строки, 'query {...}' был всего лишь примером. Нет, вы можете быть правы, и сбрасывать много данных в df может быть проблематично. Я проведу несколько таблиц. Но в этом случае вы можете использовать Linq2Sql (или выражения запроса) или, возможно, [Lazy Loading] (http://bluemountaincapital.github.io/Deedle/lazysource.html/). Мы можем обсудить в [Чат] (http://chat.stackoverflow.com/rooms/51909/f) – s952163

Смежные вопросы