.

Traduzir

quarta-feira, 24 de agosto de 2011

Minha proposta para o Python Brasil[7]

Esse é o resumo da minha proposta de palestra no Python Brasil[7].


Uma Jornada Além das Estrelas: Quando Dr. Spock Conheceu o Python e o Design de alto nível.

Resumo

Language: Português
Level: Intermediário
Summary:
Dr. Spock é um gênio com tendências conservadoras, como muitos outros doutores, sempre olhava com desconfiança as novas linguagens de programação. Como muitos, dizia que as linguagens dinâmicas, por serem interpretadas, eram mais "lentas" que as compiladas, por isso não usavam. Até que um dia o capitão Kirk lhe mostrou a linguagem PYTHON e o chamado Design de Alto Nível.
A ideia por traz do design de alto nível está na capacidade de se utilizar o poder da programação multiparadigma e das baterias incluídas presente em PYTHON, além do vasto mundo de pacotes externos, com uma linguagem compilada, seja ela C/C++ ou mesmo o FORTRAN 77/90, tendo como finalidade o ganho em desempenho computacional e a redução do tempo de desenvolvimento de código. Nessa palestra (Ou pequeno conto espacial ) será abordado de forma breve:
  • O uso de Programação Orientada a Objetos na solução de problemas científicos: Planejando antes de programar, gerando código esqueleto a partir do diagrama de classes.
  • A combinação da linguagem FORTRAN com PYTHON: Quando um velho bruxo aprende ofidioglossia
  • O uso de multiprocessing para otimização de cálculos em máquinas multicore.
  • Alguns pacotes essenciais: Numpy, Scipy, Matplotlib, Scientific Python.
  • Graviton Perturbation: Combinando a metodologia anterior com  web2py no desenvolvimento de um aplicativo web para o estudo de cosmologia e astrofísica.

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.