.

Traduzir

segunda-feira, 22 de agosto de 2011

web2py, scipy e numpy : Escrevendo e lendo matrizes em banco de dados

Eu estava com um pequeno problema que era o seguinte. Eu uso a biblioteca io do scipy. Essa biblioteca me permite ler e escrever dados em um arquivo no formato .mtx que é um formato bem interessante para se trabalhar com dados matriciais.

Eu estou integrando o meu programa com web2py e estou usando o DAL do mesmo para gerar o banco de dados para a construção de funções semi-analíticas, ou seja, funções que são criadas a partir da interpolação de dados numéricos.


O que eu queria era preservar a estrutura mtx de dados e identificá-los com os parâmetros que os geraram. Mas além disso eu precisava que o meu programa verifica-se se os dados já existiam. Se a resposta fosse afirmativa, os dados deveriam ser lido. Usando io do scipy, os dados lidos eram automaticamente armazenados em uma matriz tipo numpy. Se os dados não existissem, então os cálculos seriam realizados e o resultado final seria escrito, via io, no formato .mtx dentro do banco de dados. A solução para essa questão foi a seguinte.

  • Primeiramente importei as bibliotecas necessárias.

                   >>> from gluon import *
                   >>> from numpy import array
                   >>> from cStringIO import StringIO
                   >>> import scipy.io as io

  • Modelando o banco de dados: O primeiro passo foi pensar em como deveria ser o formato da tabela do meu banco de dados. Em cada linha duas colunas, uma para o identificador, com os parâmetros geradores, e outra para os dados.  De forma geral ficou assim:  


                   >>> db=DAL('sqlite://temporaio.db'
                   >>> db.define_table('dados',Field('Parametro'),Field('Matriz'))

  •  Inserindo as informações no banco de dados: Como teste irei gerar uma matriz 3x3, criar um arquivo via buffer, usar o io para escrever os dados no formato mtx no buffer e finalmente pegar os dados do buffer e escrevê-los no banco de dados
                   >>> x=array([[1,2,3],[5,6,7],[8,9,0]])
                   >>> output=StringIO()
                   >>> io.mmwrite(output,x,comment='isso e um teste',field='real')
                   >>> db.dados.insert(Parametro='Primeira',Matriz=output.getvalue())
                   >>> db.commit()
                   >>> output.close() #Limpa o buffer
  • Lendo os dados: Agora irei selecionar a matriz previamente inserida no banco de dados e convertê-la para o formato de matriz do numpy.
                   >>> MM = db(db.dados.Parametro=='Primeira').select()[0]
                   >>> T3=MM.Matriz
                   >>> Input=StringIO(T3)
                   >>> X4=io.mmread(Input)
                   >>> Input.close() #Limpa o Buffer

O  que falta agora é escrever os validadores do banco de dados para garantir que não serão inseridas matrizes iguais.

Nenhum comentário:

Postar um comentário