Escolar Documentos
Profissional Documentos
Cultura Documentos
Cientca
com Python
Computao
Cientca
com Python
Petrpolis RJ
Edio do Autor
2007
Primeira Edio:
Julho 2007
Agradecimentos
Muitas pessoas foram indispensveis para que este livro se tornasse
uma realidade.
Mas algumas
Richard M. Stallman.
Linus Torvalds.
por acreditar que elegncia e clareza so atributos importantes de uma linguagem de programao.
Comunidade Python.
Sumrio
Sumrio
Lista de Figuras
vii
Lista de Tabelas
Listagens
xi
Python
xvii
1 Fundamentos da Linguagem
SUMRIO
ii
1.1
Primeiras impresses . . . . . . . . . . . . . . . . . .
1.2
Uso Interativo
1.3
1.4
11
Estruturas de Dados . . . . . . . . . . . . . . . . . .
13
Listas
1.5
vs.
. . . . . . . . . . . . . . . . . . . . . . . . . .
13
Tuplas . . . . . . . . . . . . . . . . . . . . . . . . . .
20
Strings . . . . . . . . . . . . . . . . . . . . . . . . . .
22
Dicionrios
24
. . . . . . . . . . . . . . . . . . . . . . .
Conjuntos . . . . . . . . . . . . . . . . . . . . . . . .
27
Controle de uxo . . . . . . . . . . . . . . . . . . . .
28
Condies . . . . . . . . . . . . . . . . . . . . . . . .
28
Iterao
. . . . . . . . . . . . . . . . . . . . . . . . .
1.7
1.8
Funes
. . . . . . . . . . . . . . . . . . . . . . . . .
34
37
Geradores . . . . . . . . . . . . . . . . . . . . . . . .
38
Decoradores . . . . . . . . . . . . . . . . . . . . . . .
39
Strings de Documentao
41
Mdulos e Pacotes
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
42
45
Documentando Programas . . . . . . . . . . . . . . .
47
Pydoc
48
. . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
49
Exerccios . . . . . . . . . . . . . . . . . . . . . . . .
50
2 Orientao a Objeto
29
32
Funes lambda . . . . . . . . . . . . . . . . . . . . .
Epydoc
1.9
. . . . . . . . . . . . .
Objetos
. . . . . . . . . . . . . . . . . . . . . . . . .
51
52
. . .
53
55
Herana . . . . . . . . . . . . . . . . . . . . . . . . .
56
iii
ricas. . . . . . . . . . . . . . . . . . . . . . . .
57
Exerccios . . . . . . . . . . . . . . . . . . . . . . . .
57
Introduo produo de guras de alta qualidade utilizando o pacote matplotlib. Pr-requisitos: Captulo 1.
3.1
3.2
Introduo ao Matplotlib
. . . . . . . . . . . . . . .
59
Congurando o MPL . . . . . . . . . . . . . . . . . .
61
Comandos Bsicos
. . . . . . . . . . . . . . . . . . .
62
Exemplos Simples
. . . . . . . . . . . . . . . . . . .
63
O comando
plot . .
subplot
. . . . . . . . . . . . . . . . . .
63
. . . . . . . . . . . . . . . . . .
65
68
Exemplos Avanados . . . . . . . . . . . . . . . . . .
69
Mapas . . . . . . . . . . . . . . . . . . . . . . . . . .
69
O Comando
3.3
4 Ferramentas de Desenvolvimento
4.1
Ipython
. . . . . . . . . . . . . . . . . . . . . . . . .
Primeiros Passos
4.2
73
74
Comandos Mgicos . . . . . . . . . . . . . . . . . . .
75
Editores de Cdigo . . . . . . . . . . . . . . . . . . .
80
Editores Genricos
80
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
83
. . . . . . . . . . .
86
Entendendo o Mercurial . . . . . . . . . . . . . . . .
88
73
. . . . . . . . . . . . . . . . . . . .
Editores Especializados
4.3
59
Introduo . . . . . . . . . . . . . . . . . . . . . . . .
99
99
SUMRIO
iv
5.2
. . . . . . . . . . . . 100
Weave . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Ctypes . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Pyrex
5.3
. . . . . . . . . . . . . . . . . . . . . . . . . . 106
Integrao com
C++
. . . . . . . . . . . . . . . . . . . 111
Shedskin . . . . . . . . . . . . . . . . . . . . . . . . . 112
5.4
f2py
5.5
Fortran
. . . . . . . . 117
. . . . . . . . . . . . . . . . . . . . . . . . . . . 118
. 126
. . . . . . . . . . . . . . . . 126
Exerccios . . . . . . . . . . . . . . . . . . . . . . . . 131
II Aplicaes
133
6 Modelagem Matemtica
135
Modelos . . . . . . . . . . . . . . . . . . . . . . . . . 137
Lineares . . . . . . . . . . . . . . . . . . . . . . . . . 137
Exponenciais
6.2
. . . . . . . . . . . . . . . . . . . . . . 142
. . . . . . . . . . . 145
. . . . . . . . . . 155
. . . . . . . . . . . . . . . . . . 158
Exerccios . . . . . . . . . . . . . . . . . . . . . . . . 167
7 Teoria de Grafos
Breve introduo a teoria de grafos e sua representao computacional. Introduo ao Pacote NetworkX,
voltado para a manipulao de grafos. Pr-requisitos:
Programao orientada a objetos.
7.1
7.2
169
Introduo . . . . . . . . . . . . . . . . . . . . . . . . 169
NetworkX . . . . . . . . . . . . . . . . . . . . . . . . 172
Construindo Grafos . . . . . . . . . . . . . . . . . . . 173
Manipulando Grafos
. . . . . . . . . . . . . . . . . . 174
. . . . . . 179
Exerccios . . . . . . . . . . . . . . . . . . . . . . . . 182
Apresentao dos mdulos de armazenamento de dados Pickle e Sqlite3 que fazem parte da distribuio padro do Python. Apresentao do pacote SQLObject para
comunicao com os principais sistemas de bancos de dados existentes. Pr-requisitos: Conhecimentos bsicos
de bancos de dados e SQL.
185
8.1
O Mdulo Pickle
8.2
8.3
. . . . . . . . . . . . . . . . . . . . 186
8.4
. . . . . . . . . . . . 190
Exerccios . . . . . . . . . . . . . . . . . . . . . . . . 197
9 Simulaes Estocsticas
199
9.2
Inferncia Bayesiana
. . . . . . . . . . . . . . . . . . 203
SUMRIO
vi
9.3
9.4
Simulaoes Estocsticas
. . . . . . . . . . . . . . . . 205
. . . . . . . . . . . . . . . . 205
. . . . . . . . . . . . . . . 207
. . . . . . . . 217
O Amostrador de Metropolis-Hastings
. . . . . . . . 217
O Amostrador de Gibbs
9.7
. . . . . . . . . . . . . . . . 220
. . . . . . . . . . 223
9.9
. . . . . . . . . . 235
Console Gnu/Linux
A linguagem BASH
253
. . . . . . . . . . . . . . . . . . . . . 254
ndice Remissivo
. . . . . . . . . . . . . . . . . . . . . . 259
267
Lista de Figuras
HTML
Epydoc.
1.1
Verso
3.1
61
3.2
63
3.3
65
3.4
3.5
3.6
4.1
. . .
. . . . . . . . . . . . . . . . . .
50
67
70
72
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
82
4.2
Editor Scite.
4.3
4.4
. . . . . . . . . . . . . . . . . . .
85
4.5
IDE Boa-Constructor
. . . . . . . . . . . . . . . . . . .
86
4.6
IDE Eric.
4.7
IDE Pydev
. . . . . . . . . . . . . . . . . . . . .
83
84
. . . . . . . . . . . . . . . . . . . . . . . . . .
87
. . . . . . . . . . . . . . . . . . . . . . . . .
88
4.8
89
4.9
Operao de commit. . . . . . . . . . . . . . . . . . . .
90
. . . . . . . . . . . . . . . . . . . .
vii
91
LISTA DE FIGURAS
viii
. . . . . . . . . . . . . . . . . .
92
92
93
94
5.1
(we-
5.3
6.1
6.2
. . . . . . . . . . . . . . . . . . . . . . 139
6.3
. . . . . . . . . . . . . . . . . . . . . . . . 142
b.
. . . . . . . . . . . . . . . . . . . . . . . . 143
6.7
a.
6.6
. . . . . . 141
6.5
. 140
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
6.8
. 153
7.1
Um grafo simples.
7.2
7.3
7.4
7.5
. . . . . . . . . . . . . . . . . . . . . 171
ix
9.1
9.2
x N (0, 1),
mos-
. . . . . . . . . . . . . . . . . . . 202
. . . . . . . . . . . . . . . . . . . . . . 211
9.4
9.5
9.6
Amostrador de Metropolis-Hastings(n=10000).
9.7
216
. . . . . 220
9.8
9.9
. . . . . . . . . . . . . . . . . . . . . . . . . . . 224
. . . . . . . . . . . . . . . . . . . . . . . . 232
Usando
no KDE. . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
spline. .
. . . . . . . . . . . . . . . . . . . . . . 262
Lista de Tabelas
1.1
Mtodos de Listas. . . . . . . . . . . . . . . . . . . . . .
16
1.2
Mtodos de Dicionrios. . . . . . . . . . . . . . . . . . .
26
3.1
62
3.2
. . .
66
3.3
6.1
6.2
6.3
6.4
Listagens
1.1
1.2
1.3
1.4
. . . . . .
1.5
1.7
. . . . . .
1.6
. . . . . . . . . . . .
1.8
Operaes aritmticas
. . . . . . . . . . . . . . . . .
1.9
Atribuindo valores
. . . . . . . . . . . . . . . . . . .
nomes de variveis
. . . . . . . . . . . . . . . . . . .
for. .
. . . . . . . . .
3
4
5
. . . . . . . . . . . . . . . . . .
10
10
11
. . . . . . . . . . . . . . . .
12
. . . . . . . . . . . . . . . . . . . . .
14
14
15
15
16
. . . . . . . . . . . . . . . . .
17
17
18
xi
LISTAGENS
xii
18
19
. . . . . . . . . . . . . . . . .
20
20
1.27 Strings.
22
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
23
24
24
25
. . . . . . . . . . . . . . . . . .
if
. . . . . . . .
e
elif
28
por
meio de um dicionrio. . . . . . . . . . . . . . . . . .
29
30
30
31
31
32
. . . . . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . .
33
34
1.41 Denindo uma funo com um argumento obrigatrio e outro opcional (com valor default"). . . . . . .
35
36
36
37
37
38
1.47 Geradores . . . . . . . . . . . . . . . . . . . . . . . .
38
39
39
40
. . . . . . . . . . . . . . . . . . .
41
. . . . . . . . . . . . . . . . . . . .
43
. . . . . . . .
44
xiii
. . . . . . . . . . . . . . . . . .
45
. . . . . . . . . . . . . . . . . . . . . . . . . . .
45
. . . . . . . . . . . .
49
2.1
53
2.2
54
54
2.3
54
2.4
Herana . . . . . . . . . . . . . . . . . . . . . . . . .
56
2.5
. . . . . . . . . .
57
3.1
Instalando o matplotlib
. . . . . . . . . . . . . . . .
60
3.2
. . . . .
60
3.3
Grco de linha . . . . . . . . . . . . . . . . . . . . .
63
3.4
64
3.5
3.6
69
3.7
70
5.1
5.2
5.3
5.4
Carregando bibliotecas em
5.5
5.6
5.7
5.8
5.9
Python e em
ctypes
weave
C(weave.inline)
C.
x e y especicados.
. . . . . . . . . . . 100
. . . . . . . . . . . . 102
. . . . . . . . . . . . . 106
. . . . . . . . . . . . . . . . . . . . . . . . . . 106
. . . . . . . . 107
. . . . . . . . . . . 108
. . . . . . . 109
Pyrex
. . . . . . . . . . . . . . . . . . . . . . . . . . 111
. . . . . . 112
LISTAGENS
xiv
. . . . . . . . . . . . . . 114
C++ . . . . . .
C++ gerado pelo Shed-skin a partir do script
trapintloopy.py
. . . . . . . . . . . . . . . . . . . . . 115
5.16 implementao em
label118
f2py
Fortran via
. . . . . . . . . . . . . . . . . . . . . . . . . . . 121
5.20 Executando
trapintloopcomp.py
. . . . . . . . . . 123
?? 120
. . . . . . . . . . . . . . . . . 121
f2py
. 114
. . . 123
. 125
. 127
Jython
. . . . 128
. . . . . . . . . . . . 128
. . . . . . . . . . . . . . . . 129
. . . . . . . 130
6.1
6.2
6.3
6.4
7.1
7.2
7.3
7.4
7.5
7.6
8.1
8.2
Mdulos necessrios
8.3
8.4
Especicando a tabela
dinrias
. . . . . . . . . . . . . . . . . . . . . . . . . 149
. . . . . . . . . . . . . . 171
pickle
. . . . . 172
. . . . . . . . 176
. . . . . . . . . . 186
. . . . . . . . . . . . . . . . . . 190
ideia
. . . . . . . . . . . 191
xv
8.5
9.1
9.2
9.3
9.4
9.5
9.6
9.7
9.8
9.9
velope
. . . . . . . . . . . . 193
. . . . . . 201
. . . . . . . . . . . . . . . . 206
. . . . . . . . . . . . . . . . . . . . . . . . . . 209
tri-variada . . . . . . . . . . . . . . . . . . . . . . . . 221
igual a
. . . . . . 225
0.
. . . . . 230
. . . . . . . . . . . . . . . . . . 234
a priori.
. . . . . . . . . . . . . . . . . . . . 240
. . . . . . . . . . . . . . . . . . . . . . . . 241
23
24
. . . . . . . 258
LISTAGENS
xvi
25
26
Uso do
27
28
spline
. . . . . . . . . . . . . . . . . . . . . 261
29
. . . 265
Prefcio: Computao
Cientca
Da Computao Cientca e sua denio pragmtica.
Do porqu esta se diferencia, em metas e ferramentas,
da Cincia da Computao.
omputao
xviii
lento e centralizado de softwares comerciais, tem se mostrado incapaz de acompanhar a demanda da comunidade cientca, que precisa ter acesso a mtodos que evoluem a passo rpido. Alm disso,
esto se multiplicando as disciplinas cientcas que tm como sua
ferramenta principal de trabalho os mtodos computacionais, como
por exemplo a bio-informtica, a modelagem de sistemas complexos, dinmica molecular e etc.
Cientistas que se vem na situao de terem de desenvolver
softwares para poder viabilizar seus projetos de pesquisa, geralmente tm de buscar uma formao improvisada em programao
e produzem programas que tem como caracterstica bsica serem
minimalistas, ou seja, os programas contm o mnimo nmero de
linhas de cdigo possvel para resolver o problema em questo. Isto
se deve conjugao de dois fatos: 1) O cientista raramente possui
habilidades como programador para construir programas mais sosticados e 2) Frequentemente o cientista dispe de pouco tempo
entre suas tarefas cientcas para dedicar-se programao.
Para complicar ainda mais a vida do cientista-programador, as
linguagens de programao tradicionais foram projetadas e desenvolvidas por programadores para programadores e voltadas ao desenvolvimento de softwares prossionais com dezenas de milhares
de linhas de cdigo. Devido a isso, o nmero de linhas de cdigo
xix
MATLAB
Nestes
aplicativos, os programas so escritos e executados dentro do prprio aplicativo, no podendo ser executados fora dos mesmos. Estes
ambientes, entretanto, no possuem vrias caractersticas importantes das linguagens de programao: No so portteis, ou seja,
no podem ser levados de uma mquina para a outra e executados a menos que a mquina-destino possua o aplicativo gerador do
programa (MATLAB
licena, Os programas no podem ser portados para outra plataforma computacional para a qual no exista uma verso do aplicativo gerador. E, por ltimo e no menos importante, o programa
produzido pelo cientista no lhe pertence, pois, para ser executado,
necessita de cdigo proprietrio do ambiente de desenvolvimento
comercial.
Este livro se prope a apresentar uma alternativa livre (baseada em Software Livre), que combina a facilidade de aprendizado e
rapidez de desenvolvimento, caractersticas dos ambientes de desenvolvimento comerciais apresentados acima, com toda a exibilidade
das linguagens de programao tradicionais. Programas cientcos
desenvolvidos inteiramente com ferramentas de cdigo aberto tem
a vantagem adicional de serem plenamente escrutinveis pelo sis-
xx
Apresentando o Python
O Python uma linguagem de programao dinmica e orientada
a objetos, que pode ser utilizada no desenvolvimento de qualquer
tipo de aplicao, cientca ou no.
volvida ao nal dos anos 80, na Holanda, por Guido van Rossum.
Guido foi o principal autor da linguagem e continua at hoje desempenhando um papel central no direcionamento da evoluo. Guido
reconhecido pela comunidade de usurios do Python como Benevolent Dictator For Life (BDFL), ou ditador benevolente vitalcio
da linguagem.
A primeira verso pblica da linguagem (0.9.0) foi disponibilizada.
trabalhou para o CNRI , o Python atingiu a verso 1.6, que foi rpidamente seguida pela verso 2.0. A partir desta verso, o Python
1 www.python.org
2 Corporation for National
Research Initiatives
xxi
5
gem Python (PYPY ), e na plataforma
.NET
(IronPython ).
Dentre as vrias caractersticas da linguagem que a tornam interessante para computao cientca, destacam-se:
Multiplataforma:
Portabilidade:
facilmente distribudos para vrias plataformas diferentes daquela em que foi desenvolvido, mesmo que estas no possuam
o Python instalado.
Software Livre:
Extensibilidade:
dulos,escritos em Python ou rotinas escritas em outras linguagens, tais como C ou Fortran (Mais sobre isso no captulo
5).
Orientao a objeto:
funes,
xxii
Tipagem automtica:
oat, etc.)
Tipagem forte:
Cdigo legvel:
e forar a diviso de blocos de cdigo por meio de indentao, torna-se bastante legvel, mesmo para pessoas que no
estejam familiarizadas com o programa.
Flexibilidade:
aplicaes, cientcas ou no, incluindo mdulos para interao com os protocolos mais comuns da Internet (FTP, HTTP,
XMLRPC, etc.). A maior parte destes mdulos j faz parte
da distribuio bsica do Python.
Uso interativo:
invocado para a execuco de scripts completos. O uso interativo permite experimentar comandos antes de inclu-los em
programas mais complexos, ou usar o Python simplesmente
como uma calculadora.
etc...
Entretanto, para melhor compreender todas estas vantagens
apresentadas, nada melhor do que comear a explorar exemplos
xxiii
import
1 >>>
2 The Zen
3
4
Beautiful
Explicit
Simple
Complex
Flat
Sparse
Python ,
better
is
than
better
Readability
11
Special
12
Although
13
Errors
aren ' t
never
Unless
explicitly
15
In
face
of
should
19
is
to
be
that
first
18 Now
If
the
's
21
If
the
way
way may
is
bad
's
23 >>>
do
the
preferably
do
only
it .
be
obvious
at
Dutch .
never .
better
than
right
is
hard
to
explain ,
it
is
easy
to
explain ,
it
idea .
implementation
Namespaces
purity .
refuse
not
often
implementation
a
to
you ' r e
than
never
may be
22
break
guess .
now .
20
to
silently .
one and
unless
better
Although
enough
silenced .
o b v i o u s
Although
beats
pass
ambiguity ,
temptation
17
special
practicality
14
one
dense .
rules .
should
the
nested .
than
counts .
cases
the
There
Peters
i s b e t t e r than u g l y .
i s b e t t e r than i m p l i c i t .
10
16
by Tim
i s b e t t e r than complex .
i s b e t t e r than c o m p l i c a t e d .
is
this
of
good
are
one
more
of
idea .
honking
those !
great
idea
let
xxiv
O nico pr-requisito
7O
fccoelho.googlepages.com/CCP_code.zip
http://
xxv
Windows
com).
Enm, este livro foi concebido para ser uma leitura prazeirosa
para indivduos curiosos como eu, que esto sempre interessados
em aprender coisas novas!
Bom Proveito! Flvio Codeo Coelho
Petrpolis, 2007
8 Recomendo
tstico!
Parte I
Introduo ao Python e
Ferramentas de
Desenvolvimento
Captulo 1
Fundamentos da Linguagem
Breve introduo a conceitos bsicos de programao e
linguagem Python. A maioria dos elementos bsicos
da linguagem so abordados neste captulo, com exceo
de classes, que so discutidas em detalhe no captulo 2.
Pr-requisitos: Conhecimentos bsicos de programao em qualquer linguagem.
este
Python.
python
3
Python
2.5.1
( r251 :54863 ,
May
2007 ,
16:56:35)
[GCC 4 . 1 . 2
( Ubuntu
4 . 1 . 2 0 u bu n tu 4 ) ]
linux2
for
more
on
or
"
information .
5 >>>
Toda linguagem, seja ela de programao ou linguagem natural,
possui um conjunto de palavras que a caracteriza. As linguagens
de programao tendem a ser muito mais compactas do que as
linguagens naturais. O Python pode ser considerado uma linguagem compacta, mesmo em comparao com outras linguagens de
programao.
As palavras que compem uma linguagem de programao so
ditas reservadas, ou seja, no podem ser utilizadas para nomear
variveis. Se o programador tentar utilizar uma das palavras reservadas como varivel, incorrer em um erro de sintaxe.
Listagem 1.2: Palavras reservadas no podem ser utilizadas como
nomes de variveis
1 >>>
2
3
4
5
for =1
File
"<s t d i n >" ,
for =1
line
^
SyntaxError :
invalid
syntax
dir(__builtins__).
VS.
EXECUO A PARTIR DE
__builtins__
O comando
help(),
keywords
para acessar a
Se digitarmos
for
7.3
The
2
3
The
for
for
the
( such
as
statement
is
statement
elements
a
of
string ,
iterable
for.
used
a
to
iterate
sequence
tuple
or
list )
or
over
other
object :
...
1 Ateno,
;.
ao ser redenidos.
ao nal da linha.
1 >>> 1+1
2
3 >>>
No cabealho da shell do Python, acima (listagem 1.1), o interpretador identica a verso instalada, data e hora em que foi compilada, o compilador C utilizado, detalhes sobre o sistema operacional
e uma linhazinha de ajuda para situar o novato.
Para executar um programa, a maneira usual (em Unix) digitar:
python script.py.
*.py.
arquivos
python
s c r i p t . py
script:
1 #!
/ u s r / b i n / env
python
#!
chmod +x script.py
(listagem 1.7).
chmod +x
s c r i p t . py
VS.
EXECUO A PARTIR DE
1 #!
2
/ u s r / b i n / env
sys : 1 :
python
. / s c r i p t . py
DeprecationWarning :
character
3,
but
no
in
encoding
NonASCII
file
./ teste
declared ;
see
on
line
http
: / /www . p y t h o n . o r g / p e p s / pep 0 2 6 3 . h t m l
for
details
A l Mundo !
Mas que lixo aquele antes do nosso
Al mundo?
Trata-
Al.
para
fazer com que nosso script produzisse uma string como sada, ou
stdin?
input('texto'),
tanto perigoso, e
es pelo
raw_input('texto'),
2 Todos
1 >>> 2+2
2
3 >>> # C o m e n t r i o
4
...
22
6 >>> 2 2
7
# Comentrio
na mesma
linha
8 >>> ( 5 0 5 6 ) / 4
9
10 >>> # D i v i s o
11
...
12
de
inteiros
retorna
7/3
13 >>> 7/ 3
14
15 >>> 7 / 3 .
16
2.3333333333333335
Nosso primeiro exemplo numrico (Listagem 1.8) , trata nmeros em sua representao mais simples: como constantes. desta
forma que utilizamos uma calculadora comum. Em programao
mais comum termos nmeros associados a quantidades, a que
3 Repare
Ela retorna o
VS.
EXECUO A PARTIR DE
precisamos nos referenciar e que podem se modicar. Esta representao de nmeros chama-se varivel.
O sinal de
1.9).
Listagem 1.9: Atribuindo valores
1 >>> l a r g u r a = 2 0
2 >>> a l t u r a = 5 9
3 >>> l a r g u r a
4
altura
900
Um valor pode ser atribudo a diversas variveis com uma nica
1 >>> x = y = z = 0
# Zero
x,
2 >>> x
3
4 >>> y
5
6 >>> z
7
8 >>> a , b , c = 1 , 2 , 3
9 >>> a
10
11 >>> b
12
13 >>> c
14
3
O Python tambm reconhece nmeros reais (ponto-utuante)
e complexos naturalmente.
10
1 >>> 1 j
1J
complex ( 0 , 1 )
2 (1+0 j )
3 >>> 1 j
4 (1+0 j )
5 >>> 3+1 j 3
6
(3+3 j )
7 >>> (3+1 j ) 3
8
(9+3 j )
(1.5+0.5 j )
Um Nmero complexo para o Python, um objeto . Podemos extrair as partes componentes de um nmero complexo
atributos do tipo complexo:
c.real
c.imag.
utilizando
A funo
abs,
que
retorna o mdulo de um numero inteiro ou real, retorna o comprimento do vetor no plano complexo, quando aplicada a um nmero
complexo. O mdulo de um nmero complexo tambm denominado magnitude (listagem 1.12).
Listagem 1.12: Explorando nmeros complexos
1 >>> a = 3 . 0 + 3 . 0 j
2 >>> a . r e a l
3
3.0
4 >>> a . imag
5
3.0
6 >>> a b s ( a )
4 Assim
# sqrt (a . real
+ a . imag 2 )
11
4.2426406871192848
nome != Nome.
1 >>> a =3 2 7
2 >>> a , b = ( ' l a r a n j a ' , ' banana ' )
As variveis criadas por atribuio cam guardadas na memria
do computador. Para evitar preenchimento total da memria, assim que um objeto deixa de ser referenciado por um nome (deixa de
existir no espao de nomes corrente), ele imediatamente apagado
da memria pelo interpretador.
O conceito de espao de nomes uma caracterstica da linguagem Python que contribui para sua robustez e ecincia. Espaos
de nomes so dicionrios (ver 1.4) contendo as variveis, objetos
e funes disponveis durante a execuo de um programa. A um
dado ponto da execuo de um programa, existem sempre dois dicionrios disponveis para a resoluo de nomes: um local e um
global. Estes dicionrios podem ser acessados para leitura atravs
das funes
locals()
globals(),
12
conjunto de palavras reservadas da linguagem, ele a procura, primeiro no espao de nomes local e depois no global. Se a palavra
no encontrada, um erro do tipo
1.14).
Listagem 1.14: Exemplo de NameError
1 >>> m a r i a
2
Traceback
3
4
File
( most
recent
"<s t d i n >" ,
NameError :
name
line
call
last ) :
in ?
i s not
1,
defined
daquela funo .
igual ao global.
1 >>> a=1
2 >>> l e n ( g l o b a l s ( ) . i t e m s ( ) )
3
4 >>> l e n ( l o c a l s ( ) . i t e m s ( ) )
5
6 >>>
7
...
...
...
10
...
def
fun ( ) :
a= ' novo
print
print
valor '
len ( l o c a l s () . items () )
a
11 >>> f u n ( )
12
13
novo
14 >>>
15
valor
16 >>> l e n ( l o c a l s ( ) . i t e m s ( ) )
5 Mais
13
18 >>> l o c a l s ( )
19
in ) >,
built
' : <f u n c t i o n
__doc__ ' :
'__name__ ' :
fun
None ,
at
'a ' :
'__main__ ' ,
0 xb7c18ed4 >,
(
' fun
'
1}
__builtins__
Listas
As listas formam o tipo de dados mais utilizado e verstil do
Python.
14
1 >>> l i s t a = [ 1 ,
'a ' ,
' pe ' ]
2 >>> l i s t a
3
[1 ,
'a ' ,
' pe ' ]
4 >>> l i s t a [ 0 ]
5
6 >>> l i s t a [ 2 ]
7
' pe '
8 >>> l i s t a [ 1 ]
9
' pe '
Na listagem 1.15, criamos uma lista de trs elementos.
Uma
lista uma sequncia ordenada de elementos, de forma que podemos selecionar elementos de uma lista por meio de sua posio.
Note que o primeiro elemento da lista
tagens em Python comeam em
0.
lista[0].
Todas as con-
type(lista[0]).
lista[-1]
o ltimo elemento da lista. Como listas so sequncias de tamanho varivel, podemos assessar os ltimos
[ ' pe ' ,
1]
15
4 >>> l i s t a [ 1 ]
5
6 >>> l i s t a [ 3 ]
7
8 >>>
lista[1:3], delimita uma fatia que vai do ele1 (o segundo elemento) ao elemento imediatamente anterior
elemento 3. Note que esta seleo inclui o elemento corresponO comando
mento
ao
1 >>> l i s t a [ 2 : ]
2
1]
3 >>>
Este comando signica todos os elementos a partir do elemento
2 (o terceiro), at o nal da lista. Este comando poderia ser utilizado para selecionar elementos do incio da lista:
que desta vez no incluindo o elemento
lista[:3],
(o quarto elemento).
1 >>> l i s t a [ : ]
2
[ 'a ' ,
' pe ' ,
1]
3 >>>
S que no a mesma lista, uma nova lista com os mesmos
elementos. Desta forma,
lista[:]
a = lista[:].
16
1 >>> l i s t a [ : ]
2
[ 'a ' ,
' pe ' ,
1]
3 >>> l i s t a . append ( 2 ) #a d i c i o n a
4
[ 'a ' ,
' pe ' ,
1,
ao
final
2]
[ 'a ' ,
' pe ' ,
[ 'a ' ,
'b ' ] ,
1,
2]
8 >>>
As listas so conjuntos mutveis, ao contrrio de tuplas e strings,
portanto pode-se adicionar(listagem 1.19), modicar ou remover
(tabela 1.1) elementos de uma lista.
Tabela 1.1: Mtodos de Listas.
Mtodo
L.append(objeto)
L.count(elemento)
L.extend( list )
L.index(value)
L. insert ( i , o)
L.pop([indice ])
L.remove(value)
L.reverse ()
L.sort ()
Efeito
in situ
in situ
17
[ 'a ' ,
' pe ' ,
[ 'a ' ,
'b ' ] ,
1,
2,
'a ' ,
'b
' ]
J na listagem 1.20, os elementos da segunda lista so adicionados, individualmente, ao nal da lista original.
Listagem 1.21: Efetuando buscas em listas.
Traceback
File
( most
ValueError :
9 >>>
10
'z '
recent
"<i n p u t >" ,
in
line
call
1,
l i s t . index ( x ) :
in
x
last ) :
?
not in
list
lista
0
Conforme ilustrado na listagem 1.21, o mtodo
ValueError.
L.index retorna
Se o valor no
Para testar se um
in6
6O
inverso do operador
in,
1,
o operador
not in
07 .
todas as sequncias.
7 Verdadeiro
18
L.remove
L.pop
listagem 1.22.
O primeiro remove o
[ 'a ' ,
' pe ' ,
[ 'a ' ,
'b ' ] ,
1,
2,
'a ' ,
'b ' ]
4 >>> l i s t a . pop ( 2 )
5
[ 'a ' ,
'b ' ]
6 >>> l i s t a
7
[ 'a ' ,
' pe ' ,
1,
2,
'a ' ,
'b ' ]
8 >>>
Operadores aritmticos tambm podem ser utilizados para ope-
L.extend
conforme
' pe ' ,
1,
2,
'a ' ,
'b ' ]
3 >>> l i s t a
4
[ 'a ' ,
' pe ' ,
1,
2,
'a ' ,
'b ' ,
'b ' ,
'd ' ,
'
elemento ' ]
[ 'a ' ,
' pe ' ,
1,
2,
'a ' ,
'o ' ,
' i ' ,
'
s ' ]
19
1 >>> r a n g e ( 1 0 )
2
[0 ,
1,
2,
3,
4,
5,
6,
7,
8,
3 >>> r a n g e ( 2 , 2 0 , 2 )#nmeros
4
[2 ,
4,
6,
8,
10 ,
12 ,
14 ,
16 ,
5 >>> r a n g e ( 1 , 2 0 , 2 )#nmeros
6
[1 ,
3,
5,
7,
9,
11 ,
13 ,
9]
pares
18]
mpares
15 ,
17 ,
19]
9 >>> l i s t a
10
[ 'a ' ,
' pe ' ,
s ' ,
11 >>>
2,
'a ' ,
'b ' ,
'd ' ,
'o ' ,
' i ' ,
'
l i =[1 ,2]
12 >>>
li
13
2,
[1 ,
1,
3
1,
2,
1,
2]
14 >>>
lista
extende.
Esta
O operador de
range
range
aceita 1, 2 ou
20
Tuplas
Uma tupla, uma lista imutvel, ou seja, ao contrrio de uma lista,
aps a sua criao, ela no pode ser alterada. Uma tupla denida
de maneira similar a uma lista, com exceo dos delimitadores do
conjunto de elementos que no caso de uma tupla so parnteses
(listagem 1.25).
Listagem 1.25: Denindo uma Tupla.
'
estagio ' )
2 >>> t u [ 0 ]
3
4 >>> t u [ 1 : 3 ]
5
6 >>>
Os elementos de uma tupla podem ser referenciados atravs de
ndices, (posio) de forma idntica a como feito em listas. Tuplas
tambm podem ser fatiadas, gerando outras tuplas.
As tuplas no possuem mtodos.
tuplas serem imutveis. Os mtodos
append, extend,
pop
natu-
ralmente no se aplicam a tuplas, uma vez que no se pode adicionar ou remover elementos de uma tupla. No podemos fazer busca
em tuplas, visto que no dispomos do mtodo
podemos usar
in
index.
No entanto,
1 >>> t u =()
2 >>> t u
3
()
5 >>> t u
vrgula
ao
21
7 >>> t u = 1 , 2 , 3 , 4
8 >>> t u
9
(1 ,
2,
3,
4)
10 >>> v a r =w , x , y , z
11 >>> v a r
12
(w , x , y , z )
13 >>> v a r = t u
14 >>> w
15
16 >>> x
17
18 >>> y
19
20 >>> z
21
4
Conforme exemplicado em 1.26, uma tupla vazia, denida
pela expresso
tu=('casa',)
pacotamento de sequncia.
em-
22
tuple(lista),
assim
list(tupla).
Uma outra aplicao interessante para tuplas, mostrada na listagem 1.26, a atribuio mltipla, em que uma tupla de valores,
atribuda a uma lista de nomes de variveis armazenados em uma
tupla.
Strings
Strings so um terceiro tipo de sequncias em Python. Strings so
sequncias de caracteres delimitados por aspas simples,
ou duplas
"string".
'string345'
1 >>> s t= ' 1 2 3
de
oliveira4 '
2 >>> l e n ( s t )
3
16
4 >>> min ( s t )
5
'
'
6 >>> max ( s t )
7
'v '
segunda
terceira
11 >>>
linha
l i n h a """
texto
linha
primeira
13
segunda
14
terceira
23
linha
linha
linha
Conforme ilustrado na listagem 1.27, uma string uma sequncia de quaisquer caracteres alfanumricos, incluindos espaos.
funo
len(),
ou tupla. As funes
min()
max()
%s.
'%s : %s
' Hamster
1:
gramas '
Na listagem 1.28, temos uma expresso de sintaxe no to bvia mas de grande valor na gerao de strings. O operador
(m-
%s na string.
Mas no .
Vejamos
24
'%s : %s
' Hamster
1:
98
5 >>> a n i m a l+ ' :
6
Traceback
7
8
File
( most
recent
"<i n p u t >" ,
TypeError :
'
gramas '
'+p e s o+ '
cannot
line
gramas '
call
in
1,
last ) :
?
concatenate
and
' int
objects
9 >>>
Pelo erro apresentado na listagem 1.29, vemos que a formatao
da string utilizando o operador mdulo e os marcadores
peso
Dicionrios
O dicionrio um tipo de dado muito interessante do Python:
uma estrutura que funciona como um banco de dados em miniatura, no sentido de que seus elementos consistem de pares
chave
'O ' : 1 6 ,
'N ' : 1 2 ,
' Na ' : 4 0 }
16
{ ' Na ' :
40 ,
12}
'C ' :
12 ,
'H ' :
1,
'O ' :
16 ,
'N ' :
25
7 >>> Z . k e y s ( )
8
[ ' Na ' ,
'C ' ,
'H ' ,
'O ' ,
'N ' ]
1
As chaves podem ser de qualquer tipo imutvel: nmeros, strings,
tuplas (que contenham apenas tipos imutveis). Dicionrios possuem os mtodos listados na tabela 1.2.
Os conjuntos (chave:valor) so chamados de tens do dicionrios. Esta terminologia importante pois podemos acessar, separadamente, chaves, valores ou tens de um dicionrio.
Os valores de um dicionrio podem ser de qualquer tipo, nmeros, strings, listas, tuplas e at mesmo outros dicionrios. Tambm
no h qualquer restrio para o armazenamento de diferentes tipos
de dados em um mesmo dicionrio.
Conforme exemplicado em 1.30, pode-se adicionar novos tens
a um dicionrio, a qualquer momento, bastando atribuir um valor
a uma chave. Contudo, preciso ter cuidado. Se voc tentar criar
um tem com uma chave que j existe, o novo tem substituir o
antigo.
Os mtodos D.iteritems (),
D.iterkeys()
D.itervalues()
criam iteradores. Iteradores permitem iterar atravs dos tens, chaves ou valores de um dicionrio. Veja a listagem 1.31:
Listagem 1.31: Iterando dicionrios.
1 >>> Z . i t e m s ( )
2
[ ( ' Na ' ,
40) ,
( 'N ' ,
( 'C ' ,
12) ,
( 'H ' ,
1) ,
( 'O ' ,
16) ,
12) ]
3 >>> i =Z . i t e r i t e m s ( )
4 >>> i
5 <d i c t i o n a r y i t e r a t o r
6 >>> i . n e x t ( )
7
( ' Na ' ,
40)
8 >>> i . n e x t ( )
object
at
0 x 8 9 8 5 d 0 0>
26
Mtodo
D.clear()
D.copy()
D.get(k[,d])
D.has_key(k)
D.items()
D.iteritems()
D.iterkeys()
D.itervalues ()
D.keys()
D.popitem()
D.update(E)
D.values()
( 'C ' ,
Efeito
12)
10 >>> # e
assim
por
diante . . .
11 >>> k=Z . i t e r k e y s ( )
12 >>> k . n e x t ( )
13
' Na '
14 >>> k . n e x t ( )
15
'C '
16 >>> k . n e x t ( )
17
'H '
18 >>> k . n e x t ( )
19
'O '
20 >>> k . n e x t ( )
21
'N '
22 >>> k . n e x t ( )
23
24
25
Traceback
File
( most
recent
"<i n p u t >" ,
StopIteration
line
call
1,
in
last ) :
?
27
StopIteration.
Conjuntos
Rearmando sua vocao cientca, a partir da verso 2.4, uma
estrutura de dados para representar o conceito matemtico de conjunto foi introduzida na linguagem Python. Um conjunto no Python
uma coleo de elementos sem ordenao e sem repeties.
objeto conjunto em Python aceita operaes matemticas de conjuntos tais como unio, interseo, diferena e diferena simtrica
(exemplo 1.4).
5 >>> a
6
'r ' ,
b #L e t r a s
7 >>> a
em a
'p ' ,
'o ' ])
mas
em a
ou
no em b
'o ' ])
b #l e t r a s
'a ' ,
em a
'e ' ,
' i ' ,
'm ' ,
b
'o ' ,
'n ' ,
'p ' ,
'r '
])
9 >>> a & b #l e t r a s
10
'p ' ,
11 >>> a ^ b #l e t r a s
12
'm ' ,
em a
'r ' ])
em a
'e ' ,
ou
'o ' ,
b mas
no em ambos
'n ' ] )
No exemplo 1.4 pode-se observar as seguintes correspondncias entre a notao do Python e a notao matemtica convencional:
a - b:
A B8
a | b:
AB
8 Por
28
a & b: A B
a b: (A B) (A B)
Condies
Toda linguagem de programao possui estruturas condicionais que
nos permitem representar decises: se isso, faa isso, caso contrrio
faa aquilo. Estas estruturas tambm so conhecidas por ramicaes. O Python nos disponibiliza trs palavras reservadas para este
m:
if , elif e else.
if
a == 1 :
2
3
4
5
6
7
#e s t e
elif
pass
pass
executado
se
for
bloco
executado
se
for
bloco
executado
se
else :
#e s t e
#s e
11
a == 2 :
#e s t e
8
10
bloco
se
nenhum
#a n t e r i o r e s
pass
dos
tiver
blocos
sido
executado
29
pass,
As condies so as chaves de um
else,
porm.
if
elif
por
meio de um dicionrio.
d e s f e c h o s = { 1 : fun1 , 2 : fun2 }
desfechos [ a ]
Iterao
Muitas vezes em problemas computacionais precisamos executar
uma tarefa, repetidas vezes. Entretanto no desejamos ter que escrever os mesmos comandos em sequncia, pois alm de ser uma
tarefa tediosa, iria transformar nosso belo programa em algo similar a uma lista telefnica.
este problema a utilizao de laos (loops) que indicam ao interpretador que ele deve executar um ou mais comandos um nmero
arbitrrio de vezes.
Python.
O lao
while:
O lao
while
30
while True :
pass#r e p e t e
1 >>>
2
indefinidamente
3 >>> i =0
4 >>>
while
i <
+=1
10:
7 # saida
omitida
for
8 >>>
i in r a n g e ( 1 ) :
print i
O lao
for:
O lao
for
cia atribuindo os elementos da mesma a uma varivel, sequencialmente, medida que prossegue. Este lao se interrompe automaticamente ao nal da sequncia.
Iterao avanada:
iterao sobre sequncias que podem ser bastante teis na reduo da complexidade do cdigo. No exemplo 1.31 ns vimos que
dicionrios possuem mtodos especcos para iterar sobre seus componentes. Agora suponhamos que desejssemos iterar sobre uma
lista e seu ndice?
for
1 >>>
' ]) :
2
3
4
0:
1:
2:
3:
4:
in
enumerate ( [ ' a ' , ' b ' , ' c ' , ' d ' , ' e
"%s : %s "%(n , e )
enumerate
31
for
in z i p ( p e r g u n t a s , r e s p o s t a s ) :
print " q u a l o s e u %s ? %s "%(p , r )
p, r
5
6
7
qual
seu
nome ?
qual
seu
cargo ?
qual
seu
p a r t i d o ? PT
Lula
Presidente
1 >>>
for
2
3
i in r e v e r s e d ( r a n g e ( 5 ) ) :
print i
1 >>>
for
in
sorted ( set ( l ) ) :
32
2
3
laranja
leite
5 manga
6
ovos
uva
Iteraes podem ser interrompidas por meio da palavra reser-
vada
break.
continue.
A palavra reservada
else
1 >>> 1 / 0
9 Os
excees
Traceback
File
( most
recent
"<s t d i n >" ,
ZeroDivisionError :
modulo
by
line
33
call
1,
integer
in
last ) :
?
division
or
zero
1 >>>
2
...
...
...
...
...
for
...
Diviso
1.0
i in
try :
range (5) :
q =1./ i
print q
except Z e r o D i v i s i o n E r r o r :
print " D i v i s o p o r z e r o ! "
por
zero !
10
0.5
11
0.333333333333
12
0.25
A construo
try:...except:
34
except:
pass.
Pode aconte-
cer ainda que queiramos lidar de forma diferente com cada tipo de
erro (listagem 1.40).
Listagem 1.40: Lidando com diferentes tipos de erros.
1 >>>
try :
s = f . readline ()
= int ( s . strip () )
except I O E r r o r ,
print " E r r o
5
6
errno ,
( errno ,
de
strerror )
except V a l u e E r r o r :
print "No f o i
7
8
dado em
except :
print
9
10
" Erro
strerror ) :
I /O (% s ) : %s " % (
possvel
converter
Inteiro . "
desconhecido . "
try).
Finalmente,
que sempre executada (quer haja erros quer no). Ela util para
tarefas que precisam ser executadas de qualquer forma, como fechar
arquivos ou conexes de rede.
1.6 Funes
No Python, uma funo um bloco de cdigo denido por um
cabealho especco e um conjunto de linhas indentadas, abaixo
deste. Funes, uma vez denidas, podem ser chamadas de qualquer ponto do programa (desde que pertenam ao espao de no-
1.6. FUNES
35
10 chamado
__call__.
Todos
11 .
func().
Continue
def
nome ( p a r 1 ,
args ,
par2 ,
p a r 3=v a l o r d e f a u l t ,
k w a r g s ) :
A palavra reservada
def
a=1.
1 >>>
2
...
...
def
f u n ( a , b=1) :
a,b
4 >>> f u n ( 2 )
5
10 Veja o captulo
11 O leitor, neste
__call__
a objetos
36
6 >>> f u n ( 2 , 3 )
7
SyntaxError :
3
nonke ywo rd
arg
after
key wor d
arg
Por m, um nmero varivel de argumentos adicionais pode ser
previsto atravs de argumentos precedidos por
* ou **.
No exemplo
t,
e argumentos
d(Listagem
1.42).
1 >>>
def
fun ( t ,
t ,
d ) :
d
3 >>> f u n ( 1 , 2 , c =2 , d=4)
4
(1 ,2)
1 >>>
def
fun ( a , b , c , d ) :
a,b,c ,d
3,
'c ' :
4}
1.6. FUNES
37
Argumentos passados dentro de um dicionrio podem ser utilizados simultneamente para argumentos de passagem obrigatria
(declarados no cabealho da funo sem valor default) e para argumentos opcionais, declarados ou no(Listagem 1.44).
Listagem 1.44:
dicionrio.
1 >>>
2
...
...
def
fun2 ( a ,
b =1 , o u t r o s ) :
a,
b,
outros
{ 'c ' :
3,
'd ' :
4}
Note que no exemplo 1.44, os valores cujas chaves correspondem a argumentos declarados, so atribudos a estes e retirados do
dicionrio, que ca apenas com os tens restantes.
Funes podem retornar valores por meio da palavra reservada
return.
1 >>>
2
3
def
4 >>> soma
5
soma ( a , b ) :
return a+b
print " i g n o r a d o ! "
(3 ,4)
7
A palavra return indica sada imediata do bloco da funo le-
Funes lambda
Funes lambda so pequenas funes annimas que podem ser
denidas em apenas uma linha. Por denio, podem conter uma
nica expresso.
38
1 >>>
def
n
uma
raiz
de
ordem
return lambda ( x ) : x ( 1 . / n )
3 >>> r 4 = r a i z ( 4 )#r 4
calcula
raiz
de
ordem
4 >>> r 4 ( 1 6 ) #u t i l i z a n d o
5
2
Observe no exemplo (1.46), que lambda lembra a denio de
Assim,
r4
passa
Geradores
Geradores so um tipo especial de funo que retm o seu estado
de uma chamada para outra.
1 >>>
def
2
3
4 >>>
5
for
next().
for
in
yield
in
palavra :
i
1.6. FUNES
39
Decoradores
Decoradores so uma alterao da sintaxe do Python, introduzida a partir da verso 2.4, para facilitar a modicao de funes
(sem alter-las), adicionando funcionalidade.
ilustrar o uso bsico de decoradores.
http://wiki.python.org/moin/
PythonDecoratorLibrary.
1
2
def
faznada ( f ) :
def
3
4
n o v a f . __name__ = f . __name__
n o v a f . __doc__ = f . __doc__
7
8
n o v a f . __dict__ . u p d a t e ( f . __dict__ )
return
novaf
Como
seu nome diz, no faz nada, alm de ilustrar a mecnica de um decorador. Decoradores esperam um nico argumento: uma funo.
A listagem 1.49, nos mostra como utilizar o decorador.
Listagem 1.49: Utilizando um decorador
1 >>>@ f a z n a d a
2
3
def
soma ( a , b ) :
return
a+b
4
5 >>> soma ( 1 , 2 )
6
chamando . . .
(1 ,
2)
{}
7 Out [ 5 ] : 3
O decorador da listagem 1.48, na verdade adiciona uma linha
de cdigo funo que decora:
print "chamando...",args,kwargs.
40
Repare que o decorador da listagem 1.48, passa alguns atributos bsicos da funo original para a nova funo, de forma que
a funo decorada possua o mesmo nome, docstring, etc.
funao original.
que a
1 >>>
2 >>>
from f u n c t o o l s import
def m e u D e c o r a d o r ( f ) :
...
...
...
@wraps ( f )
def
novaf ( args ,
decorada
...
...
8
9
wraps
kwds ) :
' Chamando
funcao
'
return f ( a r g s ,
return n o v a f
kwds )
...
>>> @meuDecorador
10
...
11
...
12
...
def
exemplo ( ) :
""" Docstring """
' funcao
exemplo
executada ! '
13
...
14
>>> e x e m p l o ( )
15
Chamando
16
funcao
17
18
19
20
funcao
exemplo
decorada
executada !
>>> e x e m p l o . __name__
' exemplo '
>>> e x e m p l o . __doc__
' Docstring '
Decoradores nao adicionam nenhuma funcionalidade nova ao
Aplicaes cientcas
1.6. FUNES
41
de decoradores so raras, mas a sua presena em pacotes e mdulos de utilizao genrica vem se tornando cada vez mais comum.
Portanto, familiaridade com sua sintaxe aconselhada.
Strings de Documentao
Strings posicionadas na primeira linha de uma funo, ou seja,
diretamente abaixo do cabealho, so denominadas strings de documentao, ou simplesmente
docstrings.
__doc__
da funo.
Ferramentas de documentao de programas em Python extraem estas strings para montar uma documentao automtica
de um programa.
def
1 >>>
soma ( a , b ) :
"""
Esta
funcao
soma
"""
return
numeros :
a+b
8 >>> h e l p ( soma )
9
dois
>>> soma ( 2 , 3 )
Help
on
function
soma
in
module __main__ :
10
11
12
13
14
soma ( a ,
Esta
b)
funcao
soma
>>> soma ( 2 , 3 )
5
dois
numeros :
42
No exemplo 1.51, adicionamos uma docstring explicando a nalidade da funo soma e ainda inclumos um exemplo. Incluir um
exemplo de uso da funo cortado e colado diretamente do console
Python (incluindo o resultado), nos permitir utilizar o mdulo
doctest
.py,
Python contrudos para serem importados, so denominados mdulo. Existem algumas variaes na forma de se importar mdulos. O comando
import meumodulo
O comando
im-
desejamos importar:
ou ainda
Podemos
1 >>>
import
12 Dicionrio
um script
fibo
43
1 # Disponvel
no
pacote
de
programas
como :
f i b o . py
2 #modulo
para
ate
3
4
def
calcular
numero
b = 0,
while b <
print
a,
9
10
if
serie
de
fibonacci
fib (n) :
a,
n.
1
n:
b,
b = b,
a+b
__name__=="__main__" :
13
import s y s
print __name__
print s y s . a r g v
14
f i b ( i n t ( sys . argv [ 1 ] ) )
11
12
2 >>> f i b o . f i b ( 5 0 )
3
13
21
34
4 >>> f i b o . __name__
5
mtodo de
fibo.
fibo.py
chamada como um
__name__.
O contedo deste
modulo.py), __name__
__name__
igual a
__main__.
44
__main__,
as linhas abaixo do
__name__
do mdulo
1.
A posio
python
f i b o . py
60
2 __main__
3
[ ' f i b o . py ' ,
'60 ']
13
21
34
55
.py
considerado um m-
dulo Python pelo interpretador Python. Mdulos podem ser executados diretamente ou importados por outros mdulos.
A linguagem Python tem como uma de suas principais vantagens uma biblioteca bastante ampla de mdulos, includa com a
distribuio bsica da linguagem. Nesta seo vamos explorar alguns mdulos da biblioteca padro do Python, assim como outros,
mdulos que podem ser obtidos e adicionados sua instalao do
Python.
Para simplicidade de distribuio e utilizao, mdulos podem
ser agrupados em pacotes.
__init__.py
(este ar-
13 Alm
de
__init__.py,
modulo1.py
naturalmente.
modulo2.py13 .
Um
45
1 >>>
import
pacote
2 >>> d i r ( p a c o t e )
3
Numpy
Um dos pacotes mais importantes, seno o mais importante para
quem deseja utilizar o Python em computao cientca, o
numpy.
numpy
List
http://www.scipy.org/Numpy_Example_
1 >>>
from
numpy
import
2 >>> a = a r a n g e ( 9 )
46
3 >>>
4
[0
5 >>> a . s h a p e
6 >>>
[[0
2]
[3
5]
[6
8]]
10 >>>
from
8]
=(3 ,3)
numpy . l i n a l g
import
det
11 >>> d e t ( a )
12
0.0
13 >>>
Na primeira linha do exemplo 1.55, importamos todas as funes e classes denidas no mdulo numpy.
Na segunda linha, usamos o comando
um vetor
arange(9)
para criar
range
a[0] o primeiro elemento do vea. O objeto que criamos, do tipo array, denido no mdulo numpy. Uma outra forma de criar o mesmo objeto seria: a =
array([0,1,2,3,4,5,6,7,8]).
Na terceira linha, ns mostramos o contedo da varivel a com
o comando print. Este comando imprime na tela o valor de uma
varivel.
Como tudo em Python um objeto, o objeto array apresenta
diversos mtodos e atributos. O atributo chamado
shape contm o
(3,3)
shape.
14 .
14 nome_da_varivel.atributo
a.
47
Scipy
Outro mdulo muito til para quem faz computao numrica com
Python, o
scipy.
scipy
scipy.
Naturalmente, o
Estas
strings servem no somente como referncia para o prprio programador durante o desenvolvimento, como tambm como material
48
para ferramentas de documentao automtica. A principal ferramenta de documentao disponvel para desenvolvedores o
pydoc,
Pydoc
O
pydoc
pydoc
pydoc
pydoc
pydoc
PYTHONPATH.
-k <palavra>
os mdulos.
-p <porta> <nome>
-g
-w <nome>
no arquivo
<nome>.html,
onde
<nome>
instalado na biblioteca local do Python ou um mdulo ou pacote em outra parte do sistema de arquivos. Muito til para
gerar documentao para programas que criamos.
Alm do
pydoc,
volvidas por terceiros, esto disponveis para automatizar a documentao de programas Python. Exploraremos uma alternativa a
seguir.
49
Epydoc
que o mdulos
docstrings.
O uso do Epydoc similar ao do
pydoc.
Entretanto, devido
epydoc
Epydoc
man do programa.
AT X, facilita a
A capacidade de gerar a documentao em L
E
customizao da mesma pelo usurio e a exportao para outros
formatos.
A opo
url,
Epydoc
tambm verica o quo bem nosso programa ou pacote encontrase documentado. Usando-se a opo
check
Epydoc
graph
UML(Figura
1.1).
15 .
15 http://epydoc.sourceforge.net
50
HTML
Epydoc.
1.9 Exerccios
1. Repita a iterao do exemplo 1.35 sem utilizar a funo enumerate. Execute a iterao do objeto gerado por
manualmente, sem o auxlio do lao
for
enumerate
sultado.
2. Adicione a funcionalidade
else
excees.
3. Escreva um exemplo de iterao empregando
e
else(ao
nal).
break, continue
Captulo 2
Programao Orientada a
Objetos
Exem-
52
2.1 Objetos
Um tema frequente em computao cientca, a simulao de
sistemas naturais de vrios tipos, fsicos, qumicos, biolgicos, etc.
A orientao a objetos uma ferramenta natural na construo de
simulaes, pois nos permite replicar a arquitetura do sistema natural em nossos programas, representando componentes de sistemas
naturais como objetos computacionais.
A orientao a objeto pode ser compreendida em analogia ao
conceito gramatical de objeto. Os componentes principais de uma
frase so:
Na programao orientada a
2.1. OBJETOS
53
class
Objeto :
pass
Em exemplos de outros
54
class
pessoa :
i d a d e =20
a l t u r a =170
s e x o= ' m a s c u l i n o '
p e s o =70
pass
que
atributos.
1 >>> m a r i a = p e s s o a ( )
2 >>> m a r i a . p e s o
3
70
4 >>> m a r i a . s e x o
5
6 >>> m a r i a
7 <__main__ . p e s s o a
instance
at
0 x402f196c>
1 >>>
class
pessoa :
2.1. OBJETOS
2
55
def
...
__init__ ( s e l f , i d a d e , a l t u r a , s e x o ,
peso ) :
...
s e l f . i d a d e=i d a d e
...
s e l f . a l t u r a=a l t u r a
...
s e l f . s e x o=s e x o
...
s e l f . p e s o =70
7 >>> m a r i a = p e s s o a ( )
8
9
10
Traceback
File
( most
TypeError :
(1
call
line
__init__ ( )
arguments
11
recent
"<s t d i n >" ,
1,
in
takes
last ) :
?
exactly
given )
12 >>> m a r i a . s e x o
13
A funo
__init__
mtodos
de objeto. Mto-
__init__
self,
que
pode ser omitido ao se invocar o mtodo em uma instncia do objeto (veja linha 11 da listagem 2.3). O argumento
self
tambm
56
Herana
Para simplicar a denio de classes complexas, classes podem
herdar atributos e mtodos de outras classes. Por exemplo, uma
classe Felino, poderia herdar de uma classe mamfero, que por sua
vez herdaria de outra classe, vertebrados. Esta cadeia de herana
pode ser extendida, conforme necessrio (Listagem 2.4).
1 >>>
2
class
v e r t e b r a = True
3 >>>
4
class
Mamifero ( V e r t e b r a d o ) :
mamas = True
5 >>>
class
C a r n i v o r o ( Mamifero ) :
l o n g o s _ c a n i n o s = True
7 >>> b i c h o = C a r n i v o r o ( )
8 >>> d i r ( b i c h o )
9
[ '__doc__ ' ,
' mamas ' ,
10 >>> i s s u b c l a s s ( C a r n i v o r o , V e r t e b r a d o )
11
True
12 >>> b i c h o . __class__
13
<
class
__main__ . C a r n i v o r o
at
0 x b 7 a 1 d 1 7 c>
14 >>> i s i n s t a n c e ( b i c h o , M a m i f e r o )
15
True
Na listagem 2.4, vemos um exemplo de criao de um objeto,
issubclass,
isinstance.
A funo
2.2. EXERCCIOS
57
struct
da linguagem
C.
Para
1 >>>
2
class C a c h o r r o :
pass
3 >>> r e x=C a c h o r r o ( )
4 >>> r e x . dono = ' P e d r o '
5 >>> r e x . r a c a = ' P a s t o r '
6 >>> r e x . p e s o =25
7 >>> r e x . dono
8
9 >>> l a i k a = C a c h o r r o ( )
10 >>> l a i k a . dono
11
AttributeError :
attribute
Cachorro
instance
has
no
Cachorro
2.2 Exerccios
1. Utilizando os conceitos de herana e os exemplos de classes
__call__.
Crie uma
58
__call__.
Captulo 3
Introduo produo de guras de alta qualidade utilizando o pacote matplotlib. Pr-requisitos: Captulo
1.
xiste
simplicidade,
1 http://matplotlib.sourceforge.net
59
60
tar.gz do stio,
python
s e t u p . py
install
1 >>>
2 >>>
from
from
pylab
import
numpy . random
import
3 >>> x=n o r m a l ( 0 , 1 , 1 0 0 0 )
4 >>> h i s t ( x , 3 0 )
5
...
6 >>> show ( )
Podemos tambm embutir a sada grca do MPL em diversas GUIs:
GTK, WX e TKinter.
Naturalmente a utilizao do
2 Veja
61
Congurando o MPL
O MPL possui valores
cos gerados.
chamado
default
matplotlibrc,
/.matplotlibrc,
home do usurio.
matplotlibrc
62
bar
cohere
csd
errorbar
hist
imshow
pcolor
plot
psd
scatter
specgram
stem
Grco de barras
Grco da funo de coerncia
Densidade espectral cruzada
Grco com barras de erro
Histograma
Plota imagens
Grco de pseudocores
Grco de linha
Densidade espectral de potncia
Diagrama de espalhamento
Espectrograma
Pontos com linhas verticais
Comandos Bsicos
Os comandos relacionados diretamente gerao de grcos so
bastante numerosos(tabela 3.1); mas, alm destes, existe um outro
conjunto ainda maior de comandos, voltados para o ajuste no de
detalhes dos grcos (ver tabela 3.2, para uma amostra), tais como
tipos de linha, smbolos, cores, etc. Uma explicao mais detalhada
dos comandos apresentados na tabela 3.1, ser dada nas prximas
sees no contexto de exemplos.
3 Para
63
plot
from
show ( )
pylab
import
64
Quando
x so as
x e a segunda a y.
'ro'
indica
from
import
axis ([0 ,
pylab
6,
0,
x e y especicados.
[1 ,4 ,9 ,16] ,
' ro ' )
20])
show ( )
savefig
x e y,
respectivamente.
plot.
Uma das
4 Para
maiores
detalhes
consulte
(http://matplotlib.sourceforge.net).
documentao
do
MPL
65
O Comando
arrays.
subplot
xos.
plot
O comando
gcf()
gura
independente do de
ei-
gca()
retorna os eixos atuais. Este detalhe nos permite posicionar os eixos de um grco em posies arbitrrias dentro da gura. Todos
os comandos de plotagem so realizados nos eixos atuais.
Mas,
66
Valores
alpha
antialiased
color
label
linestyle
linewidth
marker
markeredgewidth
markeredgecolor
markerfacecolor
markersize
transparncia (0-1)
true | false
Cor: b,g,r,c,m,y,k,w
legenda
+ o . s v x > < ^
1 # Disponivel
2
3
4
5
6
7
from
def
no
pacote
de
programas
s u b p l o t . py
pylab
import
f(t):
s1 = cos (2 pi t )
e 1 = e x p ( t )
return
m u l t i p l y ( s1 , e1 )
8
9
t1 = arange ( 0 . 0 ,
5.0 ,
0.1)
10
t2 = arange ( 0 . 0 ,
5.0 ,
0.02)
como :
67
11
12
figure (1)
13
subplot (211)
14
p l o t ( t1 ,
f ( t1 ) ,
' bo ' ,
t2 ,
f ( t2 ) ,
15
16
subplot (212)
17
p l o t ( t2 ,
18
19
show ( )
cos (2 pi t2 ) ,
' r ' )
'k ' )
68
Tabela 3.3:
texto.
Propriedades
Valores
alpha
Transparncia (0-1)
color
Cor
fontangle
fontname
Nome da fonte
fontsize
Tamanho da fonte
fontweight
horizontalalignment
rotation
horizontal | vertical
verticalalignment
O comando
plot
show().
plot
aceita mais de
pendentemente.
text.
x e y, respectivamente.
O MPL tam-
5 exemplo:
r'raw string'
69
cifres($).
Listagem 3.6: Formatando texto e expresses matemticas
1 # Disponivel
no
pacote
de
programas
como :
m a t h t e x t . py
from
t = arange ( 0 . 0 ,
s = s i n (2 pi t )
plot (t , s )
pylab
import
2.0 ,
0.01)
text (1 ,
0.6 ,
f o n t s i z e =20)
x_i$ ' ,
f o n t s i z e =20)
text (0.6 ,
0.6 ,
\ omega
)$ ' ,
f o n t s i z e =20)
10
x l a b e l ( ' time
11
(s) ')
12
13
show ( )
Explorar todas as
Mapas
O matplotlib pode ser extendido para plotar mapas. Para isso precisamos instalar o Basemap toolkit. Se voc j instalou o matplo-
70
3.7).
Listagem 3.7: Plotando o globo terrestre
1 # Disponivel
2
from
no
pacote
de
programas
mapa . py
m a t p l o t l i b . t o o l k i t s . basemap
Basemap
como :
import
import
pylab
as
71
4
5 map = Basemap ( p r o j e c t i o n= ' r o b i n ' , l a t _ 0 = 23,
lon_0 = 46,
r e s o l u t i o n= ' l ' , a r e a _ t h r e s h
=1000.)
7 map . d r a w c o a s t l i n e s ( )
8 map . d r a w c o u n t r i e s ( )
9 map . f i l l c o n t i n e n t s ( c o l o r= ' c o r a l ' )
10 map . drawmapboundary ( )
11 map . d r a w m e r i d i a n s ( p . a r a n g e ( 0 , 3 6 0 , 3 0 ) )
12 map . d r a w p a r a l l e l s ( p . a r a n g e ( 9 0 , 9 0 , 3 0 ) )
13 p . show ( )
Na listagem 3.6, criamos um objeto map, que uma instncia,
da classe Basemap (linha 4). A classe Basemap possui diversos atributos, mas neste exemplo estamos denindo apenas alguns como
a projeo (Robinson), coordenadas do centro do mapa,
lon_0,
lat_0
1000km2 .
area_thresh,
denido
72
Captulo 4
Ferramentas de
Desenvolvimento
Exposio de ferramentas voltadas para o aumento da
produtividade em um ambiente de trabalho em computao cientca. Pr-requisitos: Captulos 1 e 2
omo
ramentas alm da linguagem de programao. Neste captulo falaremos das ferramentas mais importantes, na opinio do autor.
4.1 Ipython
A utilizao interativa do Python de extrema valia. Outros am-
TM ,
Ipython.
74
Primeiros Passos
Para iniciar o Ipython, digitamos o seguinte comando:
ipython
[ opes ]
arquivos
ipythonrc
dentro do diretrio
/.ipython.
-gthread,
Estas
opes iniciam o Ipython em um thread separado, de forma a permitir o controle interativo de elementos grcos. A opo
-pylab
show(),
show()
ao nal, corre-
tamente.
Aps uma das quatro opes acima terem sido especicadas,
as opes regulares podem seguir em qualquer ordem.
Todas as
4.1. IPYTHON
75
Comandos Mgicos
Uma das caractersticas mais teis do Ipython o conceito de comandos mgicos.
%autoindent
dentro do Ipython.
Existe uma opo que vem ativada por default no
denomidada
automagic.
ipythonrc,
%autoindent.
autoindent
enten-
autoindent
no mais reconhecida
%magic
O comando mgico
%Exit
%Pprint
%Quit
%alias
In
[2]:
alias
all
parnteses :
In
Entrada
[3]:
all
" Entrada
entre
(% l ) "
Ola mundo
entre
parnteses :
( Ola mundo )
76
%autocall
%autoindent
%automagic
%bg
fun 1
vira fun(1).
Liga/desliga auto-indentao.
Liga/desliga auto-mgica.
%bg func(x,y,z=1).
cuo se inicia, uma mensagem impressa no console informando o nmero da tarefa. Assim, pode-se ter acesso ao resultado da tarefa nmero 5 por meio do comando
jobs.results[5]
jobs. Para maiores informaes sobre este objeto dijobs?. O Ipython permite completar automaticamente um
do objeto
gite
jobs
%bookmark
experimente digitar
jobs.seguido
%cd
da tecla <TAB>.
%bookmark?.
Para
Muda de diretrio.
%colors
%cpaste
%dhist
%ed
Sinnimo para
%edit
%edit
Este
4.1. IPYTHON
77
%edit apresenta algumas convenincias. Por exemfun em uma sesso de edio ao sair
%edit fun
In
IPython
[ 6 ] : % ed
will
make
temporary
file
named :
tmp/ ipython_edit_GuUWr_ . py
done .
Executing
4 Out [ 6 ] : " d e f
ndef
edited
fun ( ) : \ n
funa ( ) : \ n
code . . .
print
5
6
In
fun
[ 7 ] : fun ( )
8
9
10
In
[ 8 ] : funa ( )
funa
11
12
13
In
[ 9 ] : % ed
done .
%hist
fun
Executing
Sinnimo para
%history
edited
code . . .
%history.
_i<n>,
que
78
In
[1]:% hist
1:
_ip . m a g i c ( "%h i s t
")
3
4
In
[2]:% hist
1:
_ip . m a g i c ( "%h i s t
")
2:
_ip . m a g i c ( "%h i s t
")
O Ipython possui um sosticado sistema de registro das sesses. Este sistema controlado pelos seguintes comandos mgicos:
%lsmagic
%macro
44-47 49.
%p
%macro teste 1 2
ou
%macro macro2
%pdb
%pdef
Se o
%pdoc
%pfile
%psearch
%psource
%quickref
%quit
Sai do Ipython.
4.1. IPYTHON
%r
79
%rehashdir
tabela de sinnimos.
%rehashx
executveis em
%reset
$PATH.
%run
%runlog
%save
%sx
%store
sesso futura.
%time
%timeit
lizando o mdulo
timeit.
%unalias
Remove um sinnimo.
%upgrade
%who
80
%who_ls
%whos
Similar ao
%who,
Para nalizar, o Ipython um excelente ambiente de trabalho interativo para computao cientca, especialmente quando
invocado coma opo
-pylab.
O modo
pylab
alm de grcos,
MATLAB
pylab.
numpy
tam-
bugs.
Editores Genricos
Existe um sem-nmero de editores de texto disponveis para o Ambiente Gnu/Linux. A grande maioria deles cumpre nossos requisitos bsicos de indentao automtica e colorizao. Selecionei al-
81
Emacs:
Easymacs1
seja
Scite:
CUA.
Gnu Nano:
suporte a auto indentao e colorizao em diversas linguagens, incluindo o Python (gura 4.3). Ideal para utilizar em
conjuno com o Ipython (comando
Jedit:
%edit).
Kate/Gedit
1 http://www.dur.ac.uk/p.j.heslin/Software/Emacs/Easymacs/
82
83
Editores Especializados
Editores especializados em Python tendem a ser mais do tipo IDE
(ambiente integrado de desenvolvimento), oferecendo funcionalidades que s fazem sentido para gerenciar projetos de mdio a grande
porte, sendo demais para se editar um simples Script.
Boa-Constructor:
84
grca.
Eric:
Pyrex
ou
C(gura
4.5).
Qt Designer,
85
Pydev (Eclipse):
Para quem j
86
87
para a equipe em reunies regulares. O que fazer quando modicaes desenvolvidas por diferentes membros de uma mesma equipe
se tornam incompatveis? Ou mesmo, quando dois ou mais colaboradores esto trabalhando em partes diferentes de um programa,
mas que precisam uma da outra para funcionar?
O tipo de ferramenta que vamos introduzir nesta seo, busca
resolver ou minimizar os problemas supracitados e pode ser aplicado tambm ao desenvolvimento colaborativo de outros tipos de
documentos, no somente programas.
Como este um livro baseado na linguagem Python, vamos utilizar um sistema de controle de verses desenvolvido inteiramente
88
em Python:
Mercurial2 .
Migrar
Entendendo o Mercurial
O Mercurial um sistema de controle de verses descentralizado,
ou seja, no h nenhuma noo de um servidor central onde ca
2 http://www.selenic.com/mercurial
89
depositado o cdigo.
Para simplicar
3 Doravante
muns(les).
90
mit(gura 4.9) .
Aps um
commit,
Mercurial automati-
O
(via
4 Vou
em diante. Optei por no tentar uma traduo pois este termo um jargo
dos sistemas de controle de verso.
91
uma reviso.
Mercurial
permite desenvolvimento de
um mesmo projeto em paralelo, os nmeros de reviso para diferentes desenvolvedores poderiam diferir.
Mercurial denominar as revises mais recentes de cada ramo(heads, cabeas). Dentre estas, a que tiver
maior nmero de reviso ser considerada a ponta (tip) do repo-
em desenvolvimento, o
sitrio.
Exemplo de uso:
Nestes exemplos, exploraremos as operaes mais comuns num ambiente de desenvolvimento em colaborao utilizando o
Mercurial.
hg
clone
s s h : / / maquinadana / p r o j e t o
meuprojeto
requesting
5 Assumimos
all
changes
ssh
92
adding
changesets
adding
manifests
adding
added
file
4
changes
changesets
with
changes
to
files
URLs vlidas:
le://
http://
https://
ssh://
static-http://
Aps o comando acima, Bruno receber uma cpia completa
do arquivo de Ana, mas seu diretrio de trabalho,
permanecer independente.
trabalhar e logo faz dois
meu projeto,
commits
(gura 4.11).
hg
pull
93
pulling
searching
adding
changesets
adding
manifests
adding
added
( run
from
file
1
s s h : / / maquinadaana / p r o j e t o
for
changes
changes
changesets
' hg
heads '
with
to
see
changes
heads ,
' hg
to
files
merge '
to
merge )
O comando
hg pull,
Este comando
hg
update para sincronizar nosso diretrio de trabalho com o Arquivo
por Ana. Normalmente, aps puxar modicaes, executamos
recm atualizado. Ento Bruno faz isso.
hg
update
this
update
spans
following
h e l l o . py
files :
( resolve )
branch
affecting
the
94
aborting
update
spanning
branches !
( use
merge '
to
across
' hg
' hg
update
C '
merge
to
lose
branches
or
changes )
update
merging
hg
merge
tip
h e l l o . py
No comando
merge,
Criando um Repositrio
Para criar um repositrio do zero, preciso apenas um comando:
hg
init
95
.hg criado
Mercurial ir armazenar todas
repositrio no diretrio .hg. O contedo
Mercurial
hg help -v <comando>
com qual-
add
addremove
tes.
annotate
quivo.
archive
reviso especicada.
backout
branch
branches
bundle
cat
clone
Replica um repositrio.
96
commit
copy
diff
commit.
export
juntos de modicaes.
grep
heads
help
identify
import
incoming
um dado repositrio.
init
Cria um novo repositrio no diretrio especicado. Se o diretrio no existir, ele ser criado.
locate
log
Localiza arquivos.
manifest
merge
97
sitrio de destino.
parents
paths
pull
push
recover
pull.
remove
rename
revert
copy + remove.
reviso.
rollback
root
serve
showconfig Mostra
vos hgrc.
status
tag
tags
tip
unbundle
98
update
verify
version
Captulo 5
5.1 Introduo
O Python uma linguagem extremamente poderosa e verstil, perfeitamente apta a ser, no somente a primeira, como a ltima linguagem de programao que um cientista precisar aprender. Entretanto, existem vrias situaes nas quais torna-se interessante
combinar o seu cdigo escrito em Python com cdigos escritos em
outras linguagens.
100
Um bom
Este
de programas em Python.
Vrios pacotes cientcos para Python como o
Numpy
Scipy,
Coincidentemente, o primeiro m-
Scipy.
em programas
Weave
O
de cdigo escrito em
weave
dependendo do tipo
inline
do
weave,
weave,
avanadas do
linguagem
C,
www.scipy.org.
weave
1 # e n c o d i n g : l a t i n
2 # Disponivel
no
101
weave
pacote
de
programas
como :
w e a v e l o o p . py
3
4
5
inline , converters
6
7
int
while
i =0;
( i < n)
10
11
i ^3;
12
i ++;
13
}"""
14
def
15
loopp (n) :
i =0
while
16
i < n:
17
18
i +=1
19
20
def
21
loopc (n) :
return
t y p e _ c o n v e r t e r s=c o n v e r t e r s . b l i t z
, c o m p i l e r= ' g c c ' )
22
23
def
b e n c h ( max ) :
24
ptim =
[]
25
ctim =
[]
26
for
in
x r a n g e ( 1 0 0 , max , 1 0 0 ) :
27
t = time . time ( )
28
loopp (n)
29
t 1=t i m e . t i m e ( ) t
102
30
p t i m . append ( t 1 )
31
t = time . time ( )
32
loopc (n)
33
t 1=t i m e . t i m e ( ) t
34
return
35
c t i m . append ( t 1 )
ptim , c t i m , max
36
37
ptim , c t i m , max = b e n c h ( 1 0 0 0 0 )
38
39
y l a b e l ( ' tempo em
40
41
42
show ( )
No exemplo 5.1 podemos ver como funciona o
weave.
inline
Uma
com-
weave
mais lento
weave.inline tem
C equivalente,
grama em
Mas a sua
C(weave.inline)
1 # Disponivel
2
from
no
pacote
w e a v e f i b . py
scipy
import
weave
de
programas
como :
Figura 5.1:
103
3
4
5
6
7
8
c o d e=\
"""
10
while
(b < n)
11
12
int
savea = a ;
converters
bayes_mvs
104
13
a=b ;
14
b=s a v e a+b ;
15
16
return_val = a ;
17
"""
18
def
fibp (n) :
19
"""
20
Calcula
21
"""
22
a , b = 0 ,1
while
23
24
26
27
def
de
Fibonacci
em Python
b < n:
return
25
srie
a , b = b , a+b
a
fibw (n) :
28
"""
29
Verso
30
"""
31
a = 0
32
b = 1
return
33
weave . i n l i n e
' ] ,
34
t y p e _ c o n v e r t e r s=c o n v e r t e r s . b l i t z ,
c o m p i l e r= ' g c c ' )
35
36
ptim = [ ] ; c t i m = [ ]
for
in
range (100) :
37
t = time . time ( )
38
pn = f i b p ( 1 0 0 0 0 0 0 0 0 0 )
39
p t = t i m e . t i m e ( ) t ; p t i m . append ( p t )
40
f i b w ( 1 0 )#t o
41
t = time . time ( )
42
cn = f i b w ( 1 0 0 0 0 0 0 0 0 0 )
43
44
compile
c t = t i m e . t i m e ( ) t ;
no
before
timing
c t i m . append ( c t )
p y t h o n : %g
s e g u n d o s '%
105
pt
45
no
weave : %g
s e g u n d o s '%
ct
46
47
S t a t s = bayes_mvs ( a r r a y ( p t i m ) / a r r a y ( c t i m ) )
" Acelerao
mdia : %g + %g
"% ( S t a t s
[0][0] ,
48
Stats [ 2 ] [ 0 ] )
No exemplo 5.2, o ganho de performance do
weave.inline
no to acentuado.
Listagem 5.3: Executando o cdigo do exemplo 5.2.
python
w e a v e f i b . py
2 Tempo mdio no p y t h o n :
3 Tempo mdio no weave :
4
Acelerao
mdia :
1 . 6 9 2 7 7 e 05
1 . 3 1 1 3 e 05
segundos
segundos
1 . 4 9 5 5 4 + 0 . 7 6 4 2 7 5
Ctypes
O pacote
ctypes,
C.
106
convenincias do
apenas dar dois exemplos bsicos para que o leitor tenha uma ideia
de como funciona o
ctypes.
ctypes/tutorial.html)
ctypes
no Windows no idntico.
1 >>>
from
ctypes
import
' l i b c . so . 6 ' ,
handle
...
at
... >
1 >>> l i b c . p r i n t f
2 <_FuncPtr
object
3 >>>
l i b c . t i m e ( None )
at
0x . . . >
1150640792
5 >>> p r i n t f = l i b c . p r i n t f
6 >>> p r i n t f ( " Ola , %s \ n " ,
7
Ola ,
"Mundo ! " )
Mundo !
Pyrex
O Pyrex uma linguagem muito similar ao Python feita para gerar
mdulos em
para o Python.
107
denies de classe devem ocorrer apenas no espao de nomes global do mdulo, nunca dentro de funes ou de outras
classes;
No permitido
import *.
As outras formas de
import
so
permitidas;
As funes
Alm das limitaes acima, existe um outro conjunto de limitaes que considerado temporrio pelos desenvolvedores do Pyrex.
So as seguintes:
Operadores
in situ
Pyrex;
No h suporte a Unicode.
Para exemplicar o uso do Pyrex, vamos implementar uma funo geradora de nmeros primos em Pyrex (listagem 5.6).
Listagem 5.6: Calculando nmeros primos em Pyrex
1 #
2
def
Calcula
numeros
primes ( i n t
primos
kmax ) :
cdef
int
n,
cdef
int
p[1000]
k,
108
result
if
6
7
[]
kmax > 1 0 0 0 :
kmax = 1 0 0 0
k = 0
n = 2
10
while
11
k < kmax :
= 0
12
while
13
if
14
i < k
n % p [ i ] <>
0:
i == k :
15
p[k]
16
k = k + 1
17
and
+ 1
= n
r e s u l t . append ( n )
18
n = n + 1
return
19
result
Vamos analisar o cdigo Pyrex, nas linhas onde ele difere do que
seria escrito em Python.
int kmax.
lao
while
109
pyrexc
gcc
gcc
p r i m e s . pyx
c fPIC I / u s r / i n c l u d e / p y t h o n 2 . 4 /
primes . c
s h a r e d
primes . o
primes . so
1 # Disponivel
2
3
4
5
6
7
def
no
pacote
if
como :
N <= 3 :
return
#t e s t a
r a n g e ( 2 ,N)
apenas
primos =
[2]
os
+
numeros
impares
r a n g e ( 3 , N, 2 )
index = 1
#c o n v e r t e n d o
#p a r a
while
12
if
em
acelerar
t o p = i n t (N
11
13
programas
p r i m e s (N) :
8
10
de
p r i m e s 2 . py
inteiro
comparacao
abaixo
0.5)
1:
= primos [ index ]
14
i >t o p :
break
15
i n d e x += 1
16
primos =
i )
17
return
18
primes (100000)
or
[x
for
in
primos
if
(x %
( x == i ) ]
primos
Comparemos agora a performance das duas funes para encontrar todos os nmeros primos menores que 100000. Para esta
110
comparao utilizaremos o ipython que nos facilita esta tarefa atravs da funo mgica
%timeit.
from
from
In
[1]:
In
[2]:
In
[3]:\% timeit
10
loops ,
In
[4]:\% timeit
10
loops ,
primes
primes2
best
best
import p r i m e s
import p r i m e s
as
primesp
primes (100000)
of
3:
19.6
ms
per
loop
primesp (100000)
of
3:
5 1 2 ms
per
loop
Pyrex.
build.
Para compilar uma extenso Pyrex, o usurio deve naturalmente ter o Pyrex instalado. Entretanto para facilitar a distribuio destas extenses, o pacote setuptools, na ausncia do Pyrex,
procura a verso em
Pyrex
1 # Disponivel
2
C.
from
no
s e t u p y x . py
setuptools
pacote
de
programas
import
setup
como :
111
import s e t u p t o o l s
from s e t u p t o o l s . e x t e n s i o n import
Extension
from
Extension
setuptools . extension
import
4
5
p r i m e s p i x = E x t e n s i o n ( name =
sources =
[ ' p r i m e s . pyx
' ]
8
9
s e t u p ( name =
10
ext_modules =
11
[ primespix ]
C++
C++
C++
C++.
112
Shedskin
O ShedSkin (http://shed-skin.blogspot.com/)se auto intitula
um compilador de Python para
C++
C++,
Apesar de seu
f (x) dx
a
n1
X
h
(f (a) + f (b)) + h
f (a + ih),
2
i=1
h=
ba
n
(5.1)
1 # e n c o d i n g : l a t i n
2 # Disponivel
no
pacote
de
programas
como :
t r a p i n t l o o p . py
3 # copyright
2007
by
Flvio
Codeo
Coelho
113
4
5
6
7
from
from
def
time
math
import
import
clock
exp ,
log ,
sin
t i n t ( a , b , fun ) :
"""
Integrao
numrica
pela
regra
trapezoidal
10
"""
11
n = 5000000
12
h2 = ( ba ) / ( n 2 . )
13
14
r e s = h2 f u n ( a )+h2 f u n ( b )
for
in
xrange ( n ) :
2 h2
15
p = a+ i
16
r e s += 2 h2 f u n ( p )
114
return
17
res
18
19 # Rodando
as
funcoes
20
start
21
r =
22
stop = clock ()
23
= clock ()
em Python
lambda ( x ) :1+ x )
' r e s u l t a d o : %d \nTempo : %s
s e g ' %(r , s t o p
s t a r t )
24
start
25
r =
= clock ()
lambda ( x ) : e x p ( x 2 l o g ( x+x
sin (x) ) ) )
26
27
stop = clock ()
' r e s u l t a d o : %d \nTempo : %s
s e g ' %(r , s t o p
s t a r t )
Executando o script da Listagem 5.12 (trapintloop.py) observamos o tempo de execuo da integrao das duas funes.
Listagem 5.13: Executando a listagem 5.12
resultado :
python
3 Tempo :
4
t r a p i n t l o o p . py
resultado :
5 Tempo :
16
11.68
seg
49029
26.96
seg
:
Listagem 5.14: Vericando o tempo de execuo em
ss
C++
t r a p i n t l o o p . py
SHED SKIN Pythont o C++ C o m p i l e r
0.0.15
Copyright
2005 ,
2006
GNU GPL v e r s i o n
Mark
2
or
Dufour ;
later
License
( See
LICENSE )
( If
your
program
me
at
does
115
not
compile ,
please
mark . d u f o u r @ g m a i l . com ! ! )
5
6
WARNING
trapintloop :13:
enumerate '
for
and
[ iterative
type
iterations :
[ generating
c++ c o d e . . ]
11
12
g++
13
./ trapintloop
14
resultado :
16
templates :
55
run
O3
...
16
0.06
resultado :
17 Tempo :
lists
analysis . . ]
10
15 Tempo :
'
return
now
make
seg
49029
1.57
seg
O cdigo
C++ gerado
trapintloopy.py
1
2
3
#include
namespace
4
5
str
const_0 ;
116
6
7
8
9
double
r ,
double
__lambda0__ (
10
return
11
12
13
14
double
19
double
x)
double
x)
(1+ x ) ;
__lambda1__ (
return
16
18
stop ;
15
17
start ,
e x p ( ( ( x x ) l o g ( ( x+(x s i n ( x ) ) ) ) ) ) ;
int
20
__main ( )
const_0 =
%s
new
s t r ( " r e s u l t a d o : %d \nTempo :
seg " ) ;
21
22
start
23
r =
24
stop = clock () ;
25
= clock () ;
tint (1.0 ,
new
5.0 ,
__lambda0__ ) ;
26
start
27
r =
28
stop = clock () ;
29
30
__int ( r ) ,
f l o a t _ ( ( s t o p s t a r t ) ) ) ) ;
= clock () ;
tint (1.0 ,
new
5.0 ,
__lambda1__ ) ;
__int ( r ) ,
f l o a t _ ( ( s t o p s t a r t ) ) ) ) ;
31
32
33
Integrao
numrica
pela
regra
b,
lambda0
trapeziodal
34
35
double
tint (
double
a,
double
fun )
117
double h2 , p ,
int __0, __1,
36
37
res ;
i ,
n;
38
39
n = 5000000;
40
h2 = ( ( ba ) / ( n 2 . 0 ) ) ;
41
r e s = ( ( h2 f u n ( a ) ) +(h2 f u n ( b ) ) ) ;
42
43
FAST_FOR( i , 0 , n , 1 , 0 , 1 )
2 ) h2 ) ) ;
44
p = ( a +(( i
45
r e s += ( ( 2 h2 ) f u n ( p ) ) ;
46
END_FOR
47
return
48
49
res ;
50
51
52
53
//
int
module
main (
int
namespace
argc ,
char
a r g v )
54
__shedskin__ : : _ _ i n i t ( ) ;
55
__math__ : : _ _ i n i t ( ) ;
56
__time__ : : _ _ i n i t ( ) ;
57
58
__trapintloop__ : : __main ( ) ;
}
Fortran
A sigla
Fortran
system.
118
Felizmente, a integrao do
Fortran
f2py,
que
demonstraremos a seguir.
f2py
Esta ferramenta est disponvel como parte do Pacote numpy (www.
scipy.org).
for,
Fortran,
C++
ou
??).
Fortran
da regra trapezoidal.
label
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
program t r a p e z i o
intrinsic exp , l o g , s i n
real l i n e a r , n o n l
external l i n e a r
external n o n l
call tint (1.0 ,5.0 , linear , res )
print , " R e s u l t a d o : " , r e s
c a l l t i n t ( 1 . 0 , 5 . 0 , nonl , r e s )
print , " R e s u l t a d o : " , r e s
end
subroutine t i n t ( a , b , f u n , r e s )
real a , b , r e s
integer 8 n
real h2 , a l f a
real f u n
external f u n
n = 5000000
19
Cf2py
20
Cf2py
21
Cf2py
22
Cf2py
intent ( in ) a
intent ( in ) b
intent ( in ) f u n
intent ( out , h i d e , c a c h e )
res
h2 = ( ba ) / ( 2 n )
23
24
a l f a =h2 f u n ( a )+h2 f u n ( b )
25
r e s =0.0
do
26
i =1 , n
2 h2
27
p = a+ i
28
r e s = r e s +2 h2 f u n ( p )
end do
29
30
r e s = r e s+ a l f a
return
end
31
32
33
real function l i n e a r ( x )
real x
intent ( in , out ) x
34
35
36
Cf2py
37
linear
return
end
38
39
40
= x +1.0
real function n o n l ( x )
real x
intent ( in , out ) x
41
42
43
119
Cf2py
n o n l = e x p ( x 2 l o g ( x+x s i n ( x ) ) )
44
return
end
45
46
??.
GCC
gfortran
por
120
g77
f77.
ou
??
1
gfortran
time
trapint
trapint . f
./ trapint
Resultado :
16.01428
Resultado :
48941.40
5
6
real
0m2 . 0 2 8 s
user
0m1 . 7 1 2 s
sys
0m0 . 0 1 3 s
Como em
Fortran
time
do
C++
(listagem 5.15).
Fortran
f2py.
A lista-
f2py
as variveis de
As
o ou procedure.
sada
em
Fortran.
Fortran para
Fortran
com o
f2py.
121
isso.
Listagem 5.18: Compilando com
f2py
trapintf
f2py
trapint . f
f2py
# e n c o d i n g : l a t i n 1
2 # Disponivel
3
4
5
6
from
from
from
def
no
pacote
de
programas
como :
t r a p i n t l o o p c o m p . py
import c l o c k
import exp , l o g , s i n
t r a p i n t f import t i n t a s f t i n t
time
math
linear ,
nonl
tint (a ,b , f ) :
n = 5000000
h2 = ( ba ) / ( n 2 . )
r e s = h2 f ( a )+h2 f ( b )
for
10
in
xrange ( n ) :
2 h2
11
p = a+ i
12
r e s += 2 h2 f ( p )
return
13
14 # Rodando
as
start
16
r =
17
stop = clock ()
em Python
= clock ()
tint (1 ,5 ,
res
funcoes
15
18
Fortran
lambda ( x ) :1+ x )
' r e s u l t a d o : %d \nTempo : %s
s t a r t )
s e g ' %(r , s t o p
122
19
start
20
r =
= clock ()
tint (1 ,5 ,
lambda ( x ) : e x p ( x 2 l o g ( x+x s i n (
x) ) ) )
21
22
stop = clock ()
' r e s u l t a d o : %d \nTempo : %s
s e g ' %(r , s t o p
s t a r t )
23 #Rodando
as
funes
em
Fortran
chamando
Python
24
" tempo
do
Fortran
com
funcoes
em
Python "
25
start
26
r =
27
= clock ()
lambda ( x ) :1+ x )
' r e s u l t a d o : %d \nTempo : %s
s e g ' %(r ,
c l o c k ( ) s t a r t )
28
start
29
r =
= clock ()
lambda ( x ) : e x p ( x 2 l o g ( x+x
sin (x) ) ) )
30
' r e s u l t a d o : %d \nTempo : %s
s e g ' %(r ,
c l o c k ( ) s t a r t )
31 #Rodando
32
as
funes
" tempo
do
em
Fortran
Fortran
com
puro
funcoes
em
Fortran "
33
start
34
r =
35
= clock ()
' r e s u l t a d o : %d \nTempo : %s
s e g ' %(r ,
c l o c k ( ) s t a r t )
36
start
37
r =
38
= clock ()
f t i n t ( 1 . , 5 . , nonl )
' r e s u l t a d o : %d \nTempo : %s
s e g ' %(r ,
c l o c k ( ) s t a r t )
Fortran
123
Fortran.
Executando
lambda
trapintloopcomp.py,
lambda)
do lao
resultado :
python
3 Tempo :
4
t r a p i n t l o o p c o m p . py
tempo
resultado :
do
12
resultado :
14
do
4.85
15 Tempo :
6.42
em Python
com
funcoes
em
seg
seg
Fortran
resultado :
funcoes
48941
24.95
tempo
com
16
7.31
11
13 Tempo :
seg
Fortran
resultado :
10 Tempo :
seg
49029
29.14
8 Tempo :
16
13.29
resultado :
5 Tempo :
trapintloopcomp.py
Fortran
16
seg
48941
seg
Ser justo
Realmente,
124
1 # e n c o d i n g : l a t i n
2 # Disponivel
3
4
5
6
from
from
def
no
pacote
de
programas
como :
t r a p i n t v e c t . pt
numpy
time
import
import c l o c k
t i n t ( a , b , fun ) :
"""
Integrao
numrica
pela
regra
trapezoidal
"""
10
n = 5000000.
11
h = ( ba ) / n
12
13
return
fun ( arange ( a , b , h ) ) )
14
15
if
res
16
start
17
r =
18
= clock ()
tint (1 ,5 ,
lambda ( x ) :1+ x )
' r e s u l t a d o : %d \nTempo : %s
seg '
%(r , c l o c k ( ) s t a r t )
19
start
20
r =
= clock ()
tint (1 ,5 ,
lambda ( x ) : e x p ( x 2 l o g (
x+x s i n ( x ) ) ) )
21
' r e s u l t a d o : %d \nTempo : %s
seg '
%(r , c l o c k ( ) s t a r t )
Executando a listagem 5.21, vemos que a implementao vetorizada em Python ganha (0.28 e 2.57 segundos)de nossas solues
utilizando
f2py.
Pyrex,
Fortran,
com
125
setup.py
Listagem 5.22:
em
Fortran
import
ez_setup . u s e _ s e t u p t o o l s ( )
3
4
ez_setup
import s e t u p t o o l s
from numpy . d i s t u t i l s . c o r e import
setup ,
Extension
flib
l i b r a r i e s =[] ,
library_dirs =[] ,
f2py_options =[] ,
s o u r c e s =[ ' m e u p a c o t e /
flib . f ' ]
10
11
)
s e t u p ( name =
12
version =
13
packages =
14
ext_modules =
15
126
A linguagem
Python, conforme descobrimos ao longo deste livro, extremamente verstil, e deve esta versatilidade, em parte, sua biblioteca
padro.
muito o Python (ao menos atualmente), na quantidade de mdulos disponveis para os mais variados ns: o
A linguagem
Java
Java.
C++,
e no e-
Java.
em seus aplicativos e applets e ns, programadores Python, podemos utilizar, livremente, toda (ou quase toda) a biblioteca padro
do Python com classes em
Java.
Jython
O interpretador Jython
Para iniciar nossa aventura com o
1O
desenvolvimento
do
Jython continua, mas no se sabe ainda
quando alcanar o CPython (implementao em C do Python).
127
Jython
jython
2.1
java1 .4.2 01
on
4 >>>
5
Jython
6 >>>
or
null )
for
"license"
information .
hello
( JIT :
' hello
world '
world
import
math ( )
7 >>> d i r ( math )
8
classDictInit ' ,
' ,
hypot ' ,
' pi ' ,
tan ' ,
'e ' ,
'
' exp
'
'
9 >>> math . p i
10
3.141592653589793
At agora, tudo parece funcionar muito bem. Vamos tentar um
Java.
Jython
Swing.
1
2
3
import j a v a x . s w i n g . J O p t i o n P a n e ;
class t e s t D i a l o g {
public static void main ( S t r i n g [ ]
args
j a v a x . s wi n g . JOptionPane .
showMessageDialog
um
teste . "
) ;
null ,
" Isto
128
}
A verso apresentada na listagem 5.24 est escrita em
Jython.
Java.
1 >>>
import
j a v a x . s wi n g . JOptionPane
2 >>> j a v a x . s w i n g . J O p t i o n P a n e .
s h o w M e s s a g e D i a l o g ( None , " I s t o
e um
teste .
")
Podemos observar, na listagem 5.25, que eliminamos a verborragia caracterstica do
Java,
e que o programa em
Jython
cou
Jython,
grande vantagem do
invs do
Java,
Jython.
Java.
S isto j uma
Em suma, utilizado-se o
Jython
ao
Uma, ao
Java,
Jython
Jython.
plet(listagem 5.26).
Listagem 5.26: Criando um applet em
import
java . a p p l e t . Applet ;
Jython
129
2
3
class a p p l e t p ( j a v a . a p p l e t . A p p l e t
def p a i n t ( s e l f , g ) :
g . drawString
` ` Eu
5,
Java,
) :
s o u um A p p l e t
um applet um mini-aplicativo
Java.
Java
Jython, o jythonc.
jythonc
d e e p c o r e j
a p p l e t p . py
processing
appletp
3
4
5
Required
packages :
java . applet
6
7
Creating
adapters :
Creating
. java
8
9
files :
appletp . j a r
130
10
appletp
11
module
appletp
extends
java . a p p l e t . Applet
12
13
Compiling
. java
14
Compiling
with
to
. class . . .
args :
[ ' / o p t / b l a c k d o w n j d k
' ,
' c l a s s p a t h ' ,
'/
2.1. j a r :/ usr
/ s h a r e / l i b r e a d l i n e j a v a / l i b / l i b r e a d l i n e
usr / share / jython / l i b / jython
j a v a . j a r : . : . / jpywork : : / u s r / s h a r e / j y t h o n /
t o o l s / jythonc :/
home/ f c c o e l h o / Documents /
L i v r o P y t h o n / . : / u s r / s h a r e / j y t h o n / Lib ' ,
' . / jpywork / a p p l e t p . java ' ]
15
Note :
. / jpywork / a p p l e t p . j a v a
overrides
16
Note :
Recompile
deprecated
with
uses
or
API .
d e p r e c a t i o n
for
details .
17
18
Building
archive :
19
Tracking
java
appletp . j a r
dependencies :
html>
head>
<meta content=" t e x t / h t m l ;
1 <
2 <
3
c h a r s e t=ISO
8859 1"
4
5
h t t p e q u i v=" c o n t e n t t y p e ">
t i t l e>j y t h o n
head>
<body>
<
6 </
7
8
Este
a p p l e t</
t i t l e>
5.6. EXERCCIOS
131
o s e u a p p l e t em J y t h o n :<br>
br>
<br>
<center>
<applet code=" a p p l e t p " archive=" a p p l e t p . j a r "
name=" A p p l e t em J y t h o n "
alt=" T h i s b r o w s e r d o e s n ' t s u p p o r t JDK 1 . 1
a p p l e t s . " align=" bottom "
height=" 5 0 " width=" 1 6 0 ">
<PARAMNAME=" c o d e b a s e " VALUE=" . ">
<h3>A l g o s a i u e r r a d o ao c a r r e g a r
e s t e a p p l e t .</ h3>
</ applet>
</ center>
<br>
<br>
</ body>
</ html>
9 &e a c u t e ;
10 <
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Na compilao, o cdigo em
mente em cdigo
Java
Java
Jython
convertido completa-
padro.
5.6 Exerccios
1. Compile a listagem 5.1 com o Shed-skin e veja se h ganho de
performance. Antes de compilar, remova as linhas associadas
ao uso do Weave.
2. Aps executar a funo primes (listagem 5.6), determine o
tamanho da lista de nmeros primos menor do que 1000.
Em seguida modique o cdigo Pyrex, declarando a varivel
results como uma lista de inteiros, e eliminando a funo
132
append
do lao
while.
Parte II
Aplicando o Python a
Problemas Cientcos
Concretos
133
Captulo 6
Modelagem Matemtica
Introduo modelagem matemtica e sua implementao computacional. Discusso sobre a importncia da
Anlise dimensional na modelagem e apresentao do
pacote Unum para lidar com unidades em Python. Prrequisitos:Conhecimentos bsicos de clculo.
A construo de modelos uma etapa imprescindvel, na cadeia de procedimentos normalmente associada ao mtodo cientco.
Modelos matemticos so uma tentativa de representar de forma
lgico/quantitativa, mecanismos que observamos na natureza.
Todo modelo por denio falso. O modelo um instrumento
de organizao de idias e hipteses. Como tal, o modelo bom
aquele que representa bem nossas idias. O que o far til para o
conhecimento do mundo, depender, em grande parte, da qualidade
de nossa concepo de mundo. Assim, bons modelos exigem uma
boa compreenso do sistema a ser modelado. Algum pode estar
pensando:
136
6.1. MODELOS
137
Computacionalmente falando, modelos so como mquinas transformadoras, produzem informao a partir de informao.
So
equivalentes, portanto, a funes que, a partir de argumentos, produzem um resultado que consiste na transformao do argumento
de entrada, de acordo com o mecanismo codicado dentro de si.
Vamos comear nossa jornada, em direo representao computacional de modelos matemticos, com uma breve introduo ao
modelos mais simples e suas implementaes.
6.1 Modelos
Lineares
Modelos lineares representam a relao entre grandezas que variam
de forma proporcional.
R$ = a Km + b
138
km
valor/kilometragem
valor total
2,50
4,50
4,00
6,00
1,50
3,50
10
5,00
7,00
4,50
6,50
2,00
4,00
15
7,50
9,50
onde
= 0, 50)
1 >>>
def
t a x i ( t a r i f a , km ,
return
tarifa
band =2) :
km+band
3 >>> p r = t a x i ( 0 . 5 , 1 0 )
4 >>> p r
5
7.0
Vamos ver outros exemplos:
Uma po-
a = 10).
Agora,
6.1. MODELOS
Figura 6.1:
139
A reta
a = 10).
140
Y =aX +b
a, chamado de coeciente angular, a taxa de variao da
Y por unidade de X e b, chamado de coeciente linear,
o valor de Y quando X = 0. Este modelo se expressa gracamente
como uma reta com ngulo a em relao a linha horizontal e que
cruza o eixo vertical no ponto b. Esta reta ser crescente se a
for maior do que 0; horizontal, se a = 0, e decrescente, se a for
onde
grandeza
negativo.
6.1. MODELOS
141
Propriedades
que a variao de crescimento ou decrescimento constante e independente do valor de X. No caso da imigrao, por exemplo,
estavam entrando 10 pessoas todos os anos, independentemente do
nmero de pessoas j existentes na populao. No caso do taxi, o
valor pago por quilmetro rodado no mudava se a pessoa j tivesse
rodado 5 ou 20 km.
142
a.
Exponenciais
O modelo linear descrito na seo anterior, pode ser um bom modelo para descrever o crescimento de uma populao por imigrao
constante. Porm, no nos serve para descrever o crescimento por
reproduo. Vejamos o clssico exemplo do crescimento bacteriano
por bipartio. Digamos que temos uma populao com uma bactria no tempo t=0. Aps 1 hora, cada bactria se divide e forma
duas bactrias-lha. Estas duas bactrias geram 4 novas bactrias
6.1. MODELOS
143
b.
144
145
Y = wB X
onde
= 1).
Modelando Iterativamente
Vamos comear a explorar os modelos dinmicos, atravs de modelos com dinmica temporal discreta. Neste caso, podemos representar o tempo discreto como a execuo iterativa de uma funo.
146
r,
i).
147
for
para resolver
numericamente as equaes de diferena. Representaes recursivas tambm seriam possveis, mas para este exemplo no so necessrias.
Listagem 6.1: Dois modelos discretos de crescimento populacional
1 # Disponivel
no
pacote
de
programas
como :
m o d e l o . py
2 # e n c o d i n g : l a t i n
3
from
pylab
import
4
5 N = [ 1 0 0 0 0 ] #s e r i e
6
n0 = 1 0 0 0 0
t = 100
temporal
#p o p u l a c a o
de
populacao
inicial
#p e r i o d o
de
tempo
da
simulacao
r = 0.02
#n a t a l i d a d e
9 m = 0.03
#t a x a
de
mortalidade
10 im = 0
#t a x a
de
imigrao
11 em = 0
#t a x a
de
emigrao
12 #p a r m e t r o s
modelo2
13 mc = 0 . 0 1
#t a x a
de
mortalidade
14 ma = 0 . 0 1
#t a x a
de
mortalidade
15
ra = 0.02
#t a x a
de
reproducao
16
e = 0.1
#t a x a
de
envelhecimento
infantil
adulta
17 C = [ 1 0 0 0 0 ]
#s e r i e
temporal
de
crianas
18 A = [ 0 ]
#s e r i e
temporal
de
adultos
19
#p o p u l a c a o
inicial
de
#p o p u l a c a o
inicial
de
a0 = 0
adultos
20
c0 = 10000
criancas
21
22
23
def
Modelo ( n0 ) :
n f = n0 + r n0
m n0
+im
em n0
148
24
N . append ( n f )
return
25
26
27
def
nf
Modelo2 ( c0 , a 0 ) :
28
c f = c0 + r a a0
29
a f = a0 + e c 0
30
C . append ( c f )
31
A . append ( a f )
32
cf , af
33
34
return
for
in
mc c 0 e c 0
ma a 0
xrange ( t ) :
35
c0 , a 0 = Modelo2 ( c0 , a 0 )
36
n0 = Modelo ( n0 )
37
38
subplot (121)
39
40
C, ' r^ ' )
41
42
subplot
43
44
45
(122)
46
47
show ( )
Integrao Numrica
A simulao de modelos onde a varivel independente contnua,
tcnicamente mais complexa. Por isso, neste caso, lanaremos mo
do pacote scipy .
1 http://www.scipy.org
149
scipy
In
[1]:
from
scipy
integrate.
import
integrate
integrate
para resolver um
dP
dt
dQ
dt
= rP pP Q
(6.1)
= mQ + P Q
Esta funo tem como argumentos uma funo que retorna as derivadas, a partir das condies iniciais, e um vetor de valores da
varivel independente(t) para os quais os valores das variveis de
estado sero calculados.
Listagem 6.2: Integrando um sistema de equaes diferenciais ordinrias
1 #modelo_ode . py
2 # Disponivel
no
pacote
de
programas
como :
modelo_ode . py
3 # e n c o d i n g : u t f 8
4
from
scipy
import
integrate
150
5
6
7
8
9
class Model :
def __init__ ( s e l f
, equations , i n i t s ,
trange , ) :
10
"""
11
Equations :
Lista
com
diferenciais
equaes
forma
de
condies
da
simulao
12
inits :
13
trange :
14
"""
15
s e l f . eqs = equations
sequencia
as
na
de
strings
iniciais
extenso
16
17
self . Inits
18
s e l f . Trange = a r a n g e ( 0 , t r a n g e , 0 . 1 )
19
s e l f . compileEqs ( )
20
21
def
22
inits
compileEqs ( s e l f ) :
"""
23
C om p il a
24
"""
as
equaes .
try :
25
26
s e l f . ceqs =
[ compile ( i
, '<
for
in
s e l f . eqs ]
except S y n t a x E r r o r :
print ' H um e r r o
27
28
de
sintaxe
e q u a e s , \ n C o n s e r t e o
tente
29
30
31
def
Run ( s e l f ) :
"""
novamente '
nas
151
32
Faz
33
"""
34
t_courseList =
35
t _ c o u r s e L i s t . append ( i n t e g r a t e . o d e i n t
integrao
numrica .
[]
( s e l f . Equations , s e l f . I n i t s , s e l f .
Trange ) )
return
36
37
def
38
( t _ c o u r s e L i s t , s e l f . Trange )
Equations ( s e l f , y , t ) :
39
"""
40
Define
os
sistema
cada
41
com
base
no
valor
retornando
42
d e EDOs
calculando
equao
as
anterior
derivadas .
"""
# C r i a
43
vetor
de
equaes
44
eqs =
45
Neq=l e n ( e q s )
46
for
47
48
51
in
x r a n g e ( Neq ) :
ydot [ k ]
return
49
50
s e l f . ceqs
if
= eval ( eqs [ k ] )
ydot
__name__=="__main__" :
52
inits
53
eqs =
[1 ,1]
2.0 y [ 0 ] y [ 1 ]
' , '
2.0 y
[1]+ y [ 0 ] y [ 1 ] ' ]
54
ODE = Model ( e q s , i n i t s , 1 0 )
55
y , t = ODE. Run ( )
56
#p r i n t
57
P. plot
(t ,y [0][: ,0] ,
' )
58
152
59
60
P . show ( )
O modelo implementado como uma classe. A implementao
a funo que
y.
eval,
Para evitar
compileEqs
integrate
ode.
153
1 # Disponivel
no
pacote
de
programas
como :
modelo_ode_minimo . py
2 # e n c o d i n g : u t f 8
3
4
5
6
7
from s c i p y import
from numpy import
import p y l a b a s P
def
Equations ( t , y ) :
"""
Define
os
cada
10
integrate
com
base
sistema
d e EDOs
calculando
equacao
no
valor
anterior
retornando
154
as
derivadas .
11
"""
12
# C r i a
vetor
de
equacoes
13
eqs
14
Neq=l e n ( e q s )
15
for
16
17
20
in
return
if
2.0 y
x r a n g e ( Neq ) :
ydot [ k ]
18
19
' , '
= eval ( eqs [ k ] )
ydot
__name__=="__main__" :
21
r = i n t e g r a t e . ode ( E q u a t i o n s ) .
22
23
tf
24
dt = 0 . 1
= 10 #tempo
25
t =
[]
26
y =
[]
27
28
while
final
r . successful ()
and
r . t <=
tf :
r . i n t e g r a t e ( r . t+d t )
29
t . append ( r . t )
30
y . append ( r . y )
31
32
#P l o t a
resultados
33
P. plot
( t , array (y) [ : , 0 ] ,
r .y
' v ' , t , a r r a y ( y )
[ : , 1 ] , ' o ' )
34
P. t i t l e ( ' Integrador
35
36
37
P . show ( )
Vode ' )
155
unidades
grandeza
a dimenso medida.
Os modelos matemticos relacionam as vrias dimenses do sistema estudado, por meio das grandezas numricas que as representam.
Por exemplo,
3 http://model-builder.sourceforge.net
4 A menos que adicionemos contantes ao modelo
o do ponto de vista dimensional
156
Grandeza fsica
Comprimento
metro
Massa
quilograma
kg
Tempo
segundo
Temperatura
kelvin
K
mol
Quantidade
de uma substncia
mol
Corrente eltrica
ampre
Intensidade luminosa
candela
cd
Grandeza, dimenso
unidade
no so sinnimos e devido
ubiquidade da sua utilizao em modelagem, so conceitos que devem estar muito bem denidos na mente de todo modelador.
Unidades derivadas de nomes prprios (e.g.
Lord Kelvin,
dimenses bsicas.
Estas dimenses
derivadas
157
Grandeza fsica
rea
Volume
Velocidade
Acelerao
Fora
Energia
Potncia
Presso
Viscosidade
Voltagem
Resistncia elt.
Dimenso
(derivao)
L2
L3
LT 1
LT 2
M LT 2
M L2 T 2
M L2 T 3
M L1 T 2
M L1 T 1 101
M L2 T 3 I 1
M L2 T 3 I 2
ngulo
Veloc. angular
Frequncia
T 1
T 1
Unidade (SI)
Smbolo
metro2
metro3
metro/segundo
metro/segundo2
newton
joule
watt
pascal
poise
volt
ohm
graus, radianos
radianos/seg.
hertz
m2
m3
m/s
m/s2
N (kg m s2 )
J (kg m2 s2 )
W (kg m2 s3 )
P a (N m2 )
P
V
(V /A)
graus, radianos
radianos/s
Hz (s1 )
L/L = 1.
O fato de um ngulo ser adimensional, faz com que seu valor
numrico no se altere, ao se utilizar diferentes unidades de medida
para o raio e o arco da circunferncia que o contm. Funes trigonomtricas so adimensionais pois o argumento destas um ngulo,
que adimensional. O expoente de uma funo exponencial nada
mais do que um logaritmo, e se os logaritmos so adimensionais,
158
Outros adimensionais:
Funes trigonomtricas,
Expoentes,
Logaritmos,
Contagens,
, e,
etc.
ekt ,
T 1
y=
para
Anlise Dimensional
Um modo eciente de evitar erros dimensionais na construo das
equaes que compem o nosso modelo, consiste em construir uma
verso da equao em questo, substituindo-se as variveis e parmetros por suas unidades ou dimenses. Em seguida, expande-se
as expresses em ambos os lados da igualdade em termos das dimenses bsicas. Ento simplicamos ao mximo os dois lados da
equao e vericamos se so de fato iguais. A este processo d-se
o nome de anlise dimensional.
Todas as equaes cientcas devem estar dimensionalmente
corretas, assim sendo, a anlise dimensional uma excelente ferramentar para analisar nossas formulaes. Vamos listar algumas
regras bsicas da anlise dimensional:
1. Dimenses e unidades podem ser combinadas e manipuladas,
utilizando-se regras algbricas.
2. Os dois lados de uma equao devem ser dimensionalmente
idnticos.
3. Deve-se tomar cuidado para no cancelar unidades idnticas
de objetos independentes. Por exemplo,
ml CO2
ml sangue no uma
159
N, W, J
O Pacote Unum
5 Quando escrevemos nossos modelos em Python, podemos fazer
uso de unidades para nossas variveis de forma a no cometer erros
quanto s dimenses do nosso problema. Vamos explorar algumas
possibilidades interativamente dentro do
from
In
[1]:
In
[ 2 ] :M
3 Out [ 2 ] : 1 . 0
unum . u n i t s
Ipython.
import
[m]
5O
Unum.html.
http://home.scarlet.be/be052320/
160
In
[ 3 ] : a=3M
In
[ 4 ] : t =1 S
In
[ 5 ] : a/ t
4 Out [ 5 ] : 3 . 0
5
In
[m/ s ]
[ 6 ] : 1 / ( 3 M/ S )
6 Out [ 6 ] : 0 . 3 3 3 3 3 3 3 3 3 3 3 3
7
In
8 Out [ 7 ] : 2 5 . 0
9
In
[ m2 ]
[ 8 ] : ( 3 M)
10 Out [ 8 ] : 1 2 . 0
11
In
[ s /m]
[ 7 ] : 2 5 M 2
( 4 M)
[ m2 ]
[ 9 ] : 1 3 KGM/ S 2
12 Out [ 9 ] : 1 3 . 0
[ kg .m/ s 2 ]
In
[10]:(2
2 Out [ 1 0 ] : 6 . 0
M/ S )
(3
S /M)
[]
Agora que j aprendemos a operar com unidades, vamos implementar um simples modelo com unidades.
[ 1 1 ] : massa = 1 . 5 KG
In
In
[ 1 2 ] : v e l o c i d a d e =2M/ S
In
[ 1 3 ] : e n e r g i a _ c i n e t i c a =( massa v e l o c i d a d e
In
[ 1 4 ] : energia_cinetica
2 ) /2
5 Out [ 1 4 ] : 3 . 0
[ kg . m2/ s 2 ]
Evitando Erros
Utilizar unidades no apenas uma questao esttica, tambm pode
ajudar a evitar enganos:
161
[ 1 5 ] : e n e r g i a _ c i n e t i c a +3KG
In
DimensionError :
[ kg . m2/ s 2 ]
incompatible
with
[ kg ]
[ 1 6 ] :MKG
In
DimensionError :
unit
[ kg ]
unexpected
Vamos con-
In
[ 1 7 ] : e n e r g i a _ c i n e t i c a . as ( J )
2 Out [ 1 7 ] : 3 . 0
[J]
RAD(radianos)
ARCDEG(graus).
from
import
In
[18]:
In
[ 1 9 ] : l o g 1 0 (M/ANGSTROM)
math
pi , log10 ,
sin , cos
3 Out [ 1 9 ] : 1 0 . 0
4
In
[ 2 0 ] : c o s ( 1 8 0 ARCDEG)
5 Out [ 2 0 ] :
6
In
1.0
[ 2 4 ] : c o s ( p i RAD)
7 Out [ 2 4 ] :
1.0
In
[ 2 5 ] : f = 4 4 0 HZ
In
[ 2 6 ] : sin ( f )
10
DimensionError :
11
In
[ 2 7 ] : dt = 0 . 1
12
In
[ 2 8 ] : s i n ( f dt 2 p i )
13 Out [ 2 8 ] :
unit
[ Hz ]
unexpected
3 . 9 1 9 8 2 4 5 3 4 4 0 4 0 9 2 7 e 14
162
As unidade do
from
from
import
import
In
[1]:
In
[2]:
In
[ 3 ] : a= a r a n g e ( 1 0 ) M
In
[4]:a
unum . u n i t s
numpy
5 Out [ 4 ] :
6
array ( [ 0 . 0
4.0
[m] ,
[m] ,
7.0
1.0
5.0
[m] ,
[m] ,
[m] ,
8.0
2.0
6.0
[m] ,
[m] ,
3.0
[m] ,
[m] ,
9.0
[m ] ] ,
d t y p e=
object )
In
[ 5 ] : a 2
9 Out [ 5 ] :
10
array ( [ 0 . 0
] ,
11
[ m2 ] ,
16.0
1.0
[ m2 ] ,
36.0
[ m2 ] ,
[ m2 ] ,
25.0
49.0
[ m2 ] ] ,
4.0
[ m2 ] ,
9.0
[ m2
[ m2 ] ,
[ m2 ] ,
64.0
[ m2 ] ,
81.0
d t y p e=o b j e c t )
Por m, o Unum tambm simplica automticamente expresses de unidades. No exemplo abaixo, o
multiplicada por uma rea uma fora. Portanto, converte a unidade para Newtons (N).
In
[ 6 ] : f o r c a = PA
In
[ 7 ] : forca
3 Out [ 7 ] : 1 . 0
M 2
[N]
Conforme j mencionamos, tambm podemos criar novas unidades. Vejamos abaixo como fazer isso:
Listagem 6.4: Criando novas unidades.
from
import
In
[1]:
In
[ 2 ] : u n i t = Unum . u n i t
In
In
[ 4 ] : LEGUA
unum
Unum
163
[ legua ]
In
In
[ 6 ] : 2 0 KLEGUA+1LEGUA
8 Out [ 6 ] : 2 0 . 0 0 1
[ kilolegua ]
Suponha
T rabalho = P ress
ao V olume
Mas como saber se esta relao correta? Fazendo a anlise dimensional.
T rabalho(J) = P ress
ao V olume =
Esta denio de Trabalho (N
m),
N
m3 = N m = J
m2
Unum,
6 Lembre-se
de que Trabalho=Energia.
164
In
[ 8 ] : J == PA
M 3
2 Out [ 8 ] : True
Para que uma anlise dimensional funcione com unidades, devemos nos manter em um mesmo sistema de unidades. O sistema
utilizado em cincia o chamado Sistema Internacional (SI). As
unidades apresentadas nas tabelas 6.2 e 6.3 esto de acordo com o
SI.
Um detalhe em relao a unidades que frequentemente mal
entendido, a aplicao de fatores de escala normalmente expressos
como prexos s unidades (ver tabela 6.4). Devido a este fato o
SI frequentemente denominado sistema MKS (metro, kilograma,
segundo). Um outro sistema que frequentemente confundido com
o SI o CGS (centmetro, grama, segundo). Apesar deste ltimo se
diferenciar do SI apenas nos prexos, um sistema completamente
diferente.
MKS
vs.
CGS
Fora(MKS):
Newton (m
kg/s2 )
Fora(CGS):
Dyne (cm
g/s2 )
Ao adicionar ou modicar prexos de unidades estamos abandonando nosso sistema de unidades original e nossas equaes no
estaro mais equilibradas dimensionalmente, a menos que realizemos as correes necessrias nos demais termos da equao.
Para re-equilibrar dimensionalmente equaes cujas unidades
de uma ou mais de suas variveis tenham sido modicadas, precisamos incluir fatores de correo.
Consideremos a relao entre a massa corporal e a massa do
Corao:
Y = 0.006M
165
Fator
Prexo
Smbolo
Fator
yocto
deca
da
zepto
hecto
atto
femto
pico
nano
micro
mili
centi
deci
1024
1021
1018
1015
1012
109
106
103
102
101
10
102
103
106
109
1012
1015
1018
1021
1024
Prexo
kilo
mega
giga
tera
peta
exa
zetta
yotta
M =1M
se quisermos expressar a massa do corao em gramas (CGS), mantendo a massa corporal em kg (SI/MKS), basta apenas multiplicarmos o lado direito da equao por 1000 para reequilibrar a equao.
Assim, teramos:
Y = 6M
Contudo, nem sempre a determinao dos fatores de correo
to bvia. Vejamos a seguinte equao, que relaciona a massa do
fgado com a massa corporal (ambas em kg):
Mf = 0.082 Mc0.87
(6.2)
166
resultado:
Mf = 8.24
Este valor no seria correto nem em gramas e muito menos em
kg!
Mf = 0.020kg
este resultado (20g) parece mais realstico. Analisando dimensionalmente a equao, podemos entender o que deu errado em nossa
converso de unidades:
Mf
A res-
quadrado no igual a 1 metro. Para a equao ser vlida dimensionalmente, a constante 0.082 no pode ser adimensional.
Para
Mf
= 0.082
Mc0.87
e resolv-la com o
kg 0.13 .
In
Unum.
[ 1 3 ] : KG/KG 0 . 8 7
2 Out [ 1 3 ] : 1 . 0
[ kg0 . 1 3 ]
g ),
10000.13 .
Podemos ve-
Kg,
6.4. EXERCCIOS
1
In
167
[ 2 0 ] : 1 0 0 0 0 . 1 3 KG 0 . 1 3
1 0 0 0 0 . 8 7 KG
0.87
2 Out [ 2 0 ] : 1 0 0 0 . 0
3
In
[ kg ]
[21]:0.082(10000.13)
(2000.87)
4 Out [ 2 1 ] : 2 0 . 2 1 6 6 8 5 1 9 9 7 9 1 5 6 3
6.4 Exerccios
1. Determine as dimenses das seguintes grandezas (manualmente e depois utilizando o Unum):
a) Volume
b) Acelerao (velocidade/tempo)
c) Densidade (massa/volume)
d) Fora (massa
acelerao)
tempo)
distncia)
altura)
mgh =massa
ace-
Captulo 7
Teoria de Grafos
Breve introduo a teoria de grafos e sua representao
computacional. Introduo ao Pacote NetworkX, voltado para a manipulao de grafos. Pr-requisitos:
Programao orientada a objetos.
7.1 Introduo
A teoria de grafos uma disciplina da matemtica cujo objeto de
estudo se presta, muito bem, a uma representao computacional
como um objeto. Matematicamente, um grafo denido por um
conjunto nito de vrtices (V ) e por um segundo conjunto (A) de
relaes entre estes vrtices, denominadas arestas. Grafos tem aplicaes muito variadas, por exemplo: uma rvore genealgica um
grafo onde as pessoas so os vrtices e suas relaes de parentesco
so as arestas do grafo.
Um grafo pode ser denido de forma no ambgua, por sua lista
de arestas (A), que implica no conjunto de vrtices que compem
o grafo. Grafos podem ser descritos ou mensurados atravs de um
conjunto de propriedades:
direcionados
169
ou no;
170
ordem
tamanho
tas;
adjacentes ;
A
ordem
vizinhos
ou
nhos;
Um
caminho
ces;
Um
ciclo
vrtice;
acclico.
1 >>> g = { ' a ' : [ ' c ' , ' d ' , ' e ' ] , ' b ' : [ ' d ' , ' e ' ] , ' c '
: [ 'a ' , 'd ' ] , 'd ' : [ 'b ' , ' c ' , 'a ' ] , ' e ' : [ 'a ' , 'b
' ]}
7.1. INTRODUO
171
keys
1 >>> g . k e y s ( )
2
[ 'a ' ,
'c ' ,
'b ' ,
'e ' ,
'd ' ]
alcance aos nossos exemplos sobre teoria de grafos, vamos nos uti-
172
lizar do pacote
NetworkX1
7.2 NetworkX
NetworkX
O pacote
A, muito
{W, X, Y, Z}:
tas,
simples.
Seja um grafo
com vrtices
V =
1 # Disponivel
no
pacote
de
programas
como :
g r a p h 1 . py
import
networkx
a s NX
3
4 G = NX. Graph ( )
5 G . add_edges_from ( [ ( 'W' , ' Z ' ) , ( ' Z ' , 'Y ' ) , ( 'Y ' , '
X ' ) , ( 'X ' , ' Z ' ) ] )
G. n o d e s ( ) , G. e d g e s ( )
[0 Y 0 ,0 X 0 ,0 Z 0 ,0 W 0 ][(0 Y 0 ,0 X 0 ), (0 Y 0 ,0 Z 0 ), (0 X 0 ,0 Z 0 ), (0 Z 0 ,0 W 0 )]
Ao lidar com grafos, conveniente represent-los gracamente.
Vejamos como obter o diagrama do grafo da listagem 7.3:
Listagem 7.4: Diagrama de um grafo
1 https://networkx.lanl.gov/
7.2. NETWORKX
1 # Disponivel
173
no
pacote
de
programas
como :
g r a p h 2 . py
import
networkx
a s NX
3
4 G = NX. Graph ( )
5 G . add_edges_from ( [ ( 'W' , ' Z ' ) , ( ' Z ' , 'Y ' ) , ( 'Y ' , '
X ' ) , ( 'X ' , ' Z ' ) ] )
6
7
import
pylab
as P
NetworkX
bastante ampla.
Construindo Grafos
O
G=create_empty_copy(H)
tipo que H.
174
Manipulando Grafos
Uma vez de posse de um objeto grafo instanciado a partir de uma
das classes listadas anteriormente, de interesse poder manipul-lo
de vrias formas.
m:
G.add_node(n)
G.add_nodes_from(lista)
G.delete_node(n)
Remove o vrtice
G.delete_nodes_from(lista)
G.
de G.
7.2. NETWORKX
G.add_edge(u,v)
175
Adiciona a aresta
(u,v)
a G. Se G for um
G.add_edge((u,v)).
G.add_edges_from(lista)
G.delete_edge(u,v)
u v .
Remove a aresta
G.delete_edges_from(lista)
(u,v).
G.
G.add_path(listadevertices)
G.add_cycle(listadevertices)
O mesmo que
add_path,
exceto
G.clear()
G.copy()
G.subgraph(listadevertices)
lista de vrtices.
subgraph(G, listadevertices)
union(G1,G2)
Unio de grafos.
disjoint_union(G1,G2)
2 Uma
176
cartesian_product(G1,G2)
(Figura 7.3).
compose(G1,G2)
nome.
complement(G)
create_empty_copy(G)
Cpia vazia de G.
convert_to_undirected(G)
de G.
convert_to_directed(G)
de G.
convert_node_labels_to_integers(G)
Frequentemente, esta
1 # Disponivel
no
pacote
de
programas
g r a f o d i n . py
2
3
4
5
import
import
class
networkx
a s NX
t h r e a d i n g , random ,
Contagio :
pylab
as P
como :
7.2. NETWORKX
177
def
__init__ ( s e l f , nome ) :
s e l f . nome = nome
s e l f . doente = 0
9
10
11
12
13
def
s e l f . transmite ()
transmite ( s e l f ) :
if
for
G . d o e n t e s == G . o r d e r ( ) :
return
a l v o in
random . s a m p l e (G . n o d e s ( )
,3) :
14
15
16
i f not
alvo . doente :
G . add_edge ( ( s e l f , a l v o ) )
"%s
i n f e c t o u %s "%( s e l f
178
. nome ,
a l v o . nome )
17
t = t h r e a d i n g . Thread ( t a r g e t=
18
t . start ()
alvo . contraiu () )
19
def
contraiu ( s e l f ) :
20
s e l f . d o e n t e +=1
21
G . d o e n t e s +=1
22
s e l f . transmite ()
23
24 G = NX. XDiGraph ( )
25 G . d o e n t e s = 0
26
nos =
[ Contagio ( n )
for
in
xrange (80) ]
27 G . add_nodes_from ( n o s )
28
29
30
c a s o _ i n d i c e = G. n o d e s ( ) [ 0 ]
caso_indice . contraiu ()
" usamos %s
das
arestas
p o s s i v e i s "%(NX.
d e n s i t y (G) )
31
32
nomes = d i c t ( [ ( no , no . nome )
NX. d e g r e e _ h i s t o g r a m (G) , G . d o e n t e s
for
no
in
G. n o d e s
() ])
a l p h a = 0 . 7 , w i d t h =2 ,
n o d e _ s i z e =450 ,
font_size
=14)
Mdulo threading:
NetworkX
vrtice. Na listagem 7.5, nos valemos deste fato para colocar ins-
7.2. NETWORKX
tncias da classe
179
Contagio
G.
O grafo G
contraiu().
O vr-
transmite
transmite().
cioso, cada vrtice tem contatos efetivos com apenas dez outros
vrtices.
contraiu
em um th-
1 # Disponivel
no
pacote
mnet . py
2
3
import
import
email ,
sys
email . Errors
de
programas
como :
180
4
5
6
7
8
import m a i l b o x
import n e t w o r k x a s NX
from p y l a b import show
def
return e m a i l . m e s s a g e _ f r o m _ f i l e ( f p )
except e m a i l . E r r o r s . M e s s a g e P a r s e E r r o r :
return ' '
10
11
12
13
14
15
msgfactory ( fp ) :
try :
def
s t a r G ( mess , G) :
try :
7.2. NETWORKX
181
16
c e n t r o = me s s . g e t ( ' f r o m ' ) . s p l i t ( )
17
pontas =
1]. s t r i p (
for
'<> ' )
[ j . s p l i t () [
j
in
1]. s t r i p (
18
arestas =
'<> ' )
m es s . g e t _ a l l ( ' t o ' ) [ 0 ] .
[ ( centro , k)
for
in
pontas ]
19
G . add_edges_from ( a r e s t a s )
return G
except :
print ' f a l h o u '
20
21
22
23
24
25 # V e j a
documentacao
26 # p a r a
outros
tipo
do
de
modulo
27 mbox = m a i l b o x . M a i l d i r ( d i r ,
mailbox
do
mailbox
mailboxes .
msgfactory ) #
kmail
28 G = NX. DiGraph ( )
29
for
in
= mbox . n e x t ( )
30
31
32
xrange (50) :
s t a r G ( i , G)
G. n o d e s ( )
33 G = NX. c o n v e r t _ n o d e _ l a b e l s _ t o _ i n t e g e r s (G)
34 NX. draw (G,
w i d t h =2 ,
s t y l e= ' d o t t e d ' ,
alpha
=0.5)
35
show ( )
Na Listagem 7.6, usamos dois mdulos interessantes da bibli-
mailbox.
Mdulo email:
por emails.
e o mdulo mailbox.
182
Mdulo mailbox:
Maildir
mensagem.
Cada mensagem recebida processada para gerar um grafo do
tipo estrela, com o remetente no centro e todos os destinatrios
da mensagem nas pontas. Este grafo ento adicionado ao grafo
original, na forma de uma lista de arestas.
Depois de todas as
7.3 Exerccios
1. Determine o conjunto de arestas
V = {a, b, c, d, e}.
7.3. EXERCCIOS
183
Captulo 8
gerenciamento de dados no se constitui numa disciplina cientca per se. Entretanto, cada vez mais, permeia as atividades
bsicas de trabalho cientco. O volume crescente de dados e o aumento de sua complexidade h muito ultrapassou a capacidade de
gerenciamento atravs de simples planilhas.
Atualmente, muito comum a necessidade de se armazenar dados quantitativos, qualitativos e mdias dos mais diferentes formatos(imagens, vdeos, sons) em uma plataforma integrada de onde
possam ser facilmente acessados para ns de anlise, visualizaco
ou simplesmente consulta.
A linguagem Python dispe de solues simples para resolver
esta necessidade em seus mais distintos nveis de sosticao. Seguindo a losoa de baterias includas do Python, a sua biblioteca
185
186
pickle
cPickle,
implementam
In
In
3
4
import p i c k l e
[ 2 ] : class o i :
.2.:
def d i g a o i ( s e l f ) :
.2.:
print " o i "
pickle
[1]:
In
[ 3 ] : a= o i ( )
In
In
[ 5 ] : p i c k l e . dump ( a , f )
In
[ 6 ] : f . close ()
In
10
In
[ 8 ] : b=p i c k l e . l o a d ( f )
11
In
[ 9 ] : b . digaoi ()
12
oi
Como vemos na listagem 8.1, com o mdulo pickle podemos armazenar objetos em um arquivo, e recuper-lo sem problemas para uso
posterior.
pickle,
In
[10]:
.10.:
.10.:
class
def
oi :
d i g a o i ( s e l f , nome= ' f l a v i o ' ) :
' o i %s ! '%nome
4
5
In
In
In
[ 1 3 ] : b . digaoi ()
oi
flavio !
187
[ 1 2 ] : b=p i c k l e . l o a d ( f )
Desta forma, podemos modicar a classe, e a instncia armazenada reconhecer o novo cdigo ao ser restaurada a partir do
arquivo, como podemos ver acima.
que os
pickles
pickle
pickles).
dados, pura e simplesmente, mas de objetos computacionais complexos, que podem conter em si, dados. Apesar desta versatilidade,
peca por consistir em uma estrutura de armazenamento legvel apenas pelo prprio mdulo
pickle
em um programa Python.
SQL1 .
que disponibilizava
sqlite,
sqlite.
In
[1]:
1 SQL
sqlite3.
import
sqlite3
onal na interao com bancos de dados relacionais. Para saber mais, consulte
http://pt.wikipedia.org/wiki/SQL
188
In
[2]: c =
exemplo,
localizado no diretrio
/tmp.
sqlite
tambm
:memory:.
Para po-
In
[3]: c.
nome
text ,
altura
2 Out [ 3 ] : < s q l i t e 3 . C u r s o r
Note que os comandos
objeto
Connection,
real ,
table
especimes (
peso
object
at
mtodo
In
[4]: c.
into
especimes
insert
mais um comando
SQL
SQL
In
In
[ 6 ] : c . execute ( ' s e l e c t
where
nome=? ' , t )
from
especimes
In
189
[ 7 ] : c . fetchall ()
12.5 ,
2.2999999999999998) ]
fetchone.
operao descrita no exemplo anterior, com uma sequncia de tuplas representando a sequncia de registros que se deseja inserir.
In
In
[9]:
,42.4 ,10.3) )
for
.9.:
in
t :
c . execute ( ' i n s e r t
into
especimes
O objeto
cursor
In
[ 1 0 ] : c . execute ( ' s e l e c t
by
In
from
especimes
peso ' )
[11]:
for
r e g in c :
print r e g
12.5 ,
2.2999999999999998)
SQL.
190
digital que recolher informaes da web (Wikipedia ) e as armazenar em um banco sqlite via sqlobject.
Para este exemplo, precisaremos de algumas ferramentas que
vo alm do banco de dados.
biblioteca padro do Python para interagir com a internet, e vamos nos utilizar de um pacote externo para decodicar as pginas
obtidas.
Listagem 8.2: Mdulos necessrios
1 # disponivel
no
pacote
de
programas
como :
a r a n h a . py
2
3
4
import n e t w o r k x a s NX
from B e a u t i f u l S o u p import
from
BeautifulSoup
BeautifulSoup
as
SoupStrainer ,
BS
import
BeautifulStoneSoup
a s XS
5
6
import s y s , o s , u r l l i b 2 ,
from s q l o b j e c t import
2 http://www.sqlobject.org/
3 http://pt.wikipedia.org
urllib ,
re
BeautifulSoup4
191
um destrinchador de pginas da
BeautifulSoup;
ele ca-
BeautifulSoup,
urllib, urllib2
re.
sys, os,
ou
i f not
10
11
os . path . e x i s t s ( l a r a c n a d i r ) :
o s . mkdir ( l a r a c n a d i r )
sqlhub . p r o c e s s C o n n e c t i o n = connectionForURI (
' s q l i t e : / / '+l a r a c n a d i r+ ' / knowdb ' )
Na listagem 8.3, criamos o diretrio(os.mkdir) onde o banco
Utilizamos
os.path.exists
4 http://www.crummy.com/software/BeautifulSoup/
192
mos
os.path.expanduser
para substituir o
por
/home/usuario
16
class
ideia
do banco de dados.
I d e i a ( SQLObject ) :
17
nome = U n i c o d e C o l ( )
18
nlinks = IntCol ()
19
links
20
ender = StringCol ( )
= PickleCol ()
SQLObject.
Neste
UnicodeCol
PickleCol
IntCol corresponde
O mais in-
ascii.
Em
No
sqlobject,
no h limite para
UnicodeCol
StringCol
193
Crawler,
UrlFac
urllib2.
A funo
urlencode
Todos os artigos
href=.
BeautifulSoup.
15
16
urlatual =
class
' '
I d e i a ( SQLObject ) :
17
nome = U n i c o d e C o l ( )
18
nlinks = IntCol ()
19
links
20
ender = StringCol ( )
21
22
23
24
25
= PickleCol ()
class C r a w l e r :
def __init__ ( s e l f
try :
Ideia . createTable ()
27
except :
pass
28
s e l f . SU =
26
, s t a r t u r l , depth ) :
starturl
194
29
s e l f . depth = depth
30
s e l f . f i l a =[]
31
s e l f . depth = depth
32
s e l f . curdepth = 0
33
s e l f . started = 0
34
s e l f . nlinks = 0
35
s e l f . history =
36
s e l f . G = NX. Graph ( )
37
def
[]
parsePag ( s e l f , urlend ) :
38
urlatual = urlend
39
user_agent =
compatible ;
MSIE
5.5;
Windows NT
) '
40
41
42
43
Smith ' ,
user_agent
data =
' John
headers = {
44
u r l l i b . urlencode ( values )
45
" Abrindo
46
req =
u r l l i b 2 . Request ( u r l e n d , data ,
47
fd =
48
html = f d . r e a d ( )
",
urlend
headers )
return
49
50
51
u r l l i b 2 . urlopen ( req )
def
html
52
53
Verifica
54
55
se
resposta
e um
c o m p i l e ( ' ^/ w i k i / ' ) )
56
artlist
BS ( html ,
hit
for
ou
nao
h r e f=r e .
tag
in
p a r s e O n l y T h e s e=l n k a r t ) ]
57
195
58
59
self . curlinks =
artlist
61
self . curlinks =
artlist
62
I d e i a ( nome=n o m e a t u a l , n l i n k s =
else :
60
len ( a r t l i s t ) ,
links
a r t l i s t , ender = u r l a t u a l )
63
s e l f . G . add_edges_from ( [ (
for
nomeatual , i )
if
64
65
66
in
self .
curlinks ])
s e l f . curdepth >
return
s e l f . depth :
s e l f . f i l a . e x t e n d ( [ ' h t t p : / / '+
l a n g a t u a l+ ' . w i k i p e d i a . o r g ' +
for
67
68
69
70
71
72
73
in
artlist ])
s e l f . c u r d e p t h +=1
def
move ( s e l f ) :
i f not s e l f . f i l a :
i f not s e l f . s t a r t e d :
while
s e l f . f i l a . append ( s e l f . SU )
self . fila :
74
s e l f . started = 1
75
urlatual =
76
78
if
if
79
77
s e l f . f i l a . pop ( 0 )
":"
in
nomeatual :
nomeatual
in
s e l f . history :
" buscando
continue
continue
",
nomeatual ,
196
80
81
82
" Faltam
html =
",
len ( s e l f . f i l a )
s e l f . parsePag (
urlatual )
84
except :
continue
85
s e l f . ve rResp ( html )
86
s e l f . nlinks
87
s e l f . h i s t o r y . append ( n o m e a t u a l )
83
+=1
88
89
90
91
92
class U r l F a c :
def __init__ ( s e l f , l a n g= ' e n ' ) :
global l a n g a t u a l
93
s e l f . lang = lang
94
langatual = lang
def
95
u r l i f i c a ( s e l f , palavra ) :
96
nomeatual = p a l a v r a
97
98
urlatual = u
o r g / w i k i / "+p a l a v r a
return
99
100
101
if
__name__=="__main__" :
102
UF = U r l F a c ( ' p t ' )
103
u = UF . u r l i f i c a ( s y s . a r g v [ 1 ] )
104
Cr = C r a w l e r ( u , 1 )
105
Cr . move ( )
A listagem 8.5 mostra o restante do cdigo da aranha e o lei-
8.4. EXERCCIOS
197
8.4 Exerccios
1. Modique a aranha apresentada neste captulo, para guardar
os documentos varridos.
2. Crie uma classe capaz de conter os vrios aspectos (links,
guras, etc) de um artigo da wikipedia, e utilize a aranha para
criar instncias desta classe para cada artigo encontrado, a
partir de uma nica palavra chave. Dica: para simplicar a
persistncia, armazene o objeto artigo como um Pickle, no
banco de dados.
Captulo 9
Simulaes Estocsticas
este
tempo, o processo estocstico se manifestar como uma srie temporal. Processos estocsticos espaciais, geram os chamados campos
aleatrios
Exemplos de processo estocticos so sries temporais de preos
de aes, utuaes de populaes, distribuio espacial de poluio particulada.
Muitos processos estocsticos naturais possuem estrutura em
meio aleatoriedade. Muitas das tcnicas desenvolvidas para lidar
com estes processos visam encontrar esta estrutura.
200
numpy
ou o
scipy,
Neste captulo
Ento re-
da gura 9.2 .
Invertendo-se a funo de
x correspondentes.
ppf (percentile point
x,
1 Veja
no programa
lhsexp.py
201
stats do scipy.
rvs
ppf(ou percentile point function)
1 #! / u s r / b i n / p y t h o n
2 # Disponivel
no
pacote
de
programas
como :
202
x N (0, 1),
mos-
from
l h s . py
pylab
import
plot ,
f i g u r e , h i s t , show ,
savefig
4
5
6
7
import
import
def
scipy . stats
as
stats
numpy
lhs ( dist ,
parms ,
n =100) :
p e r c = numpy . a r a n g e ( 0 , 1 . , 1 . / n )
smp =
10
v =
[ s t a t s . uniform ( i , 1 . / n ) . rvs ( )
in
for
perc ]
11
12
13
if
203
14
c=l h s ( s t a t s . norm ,
15
hist (c)
16
n =
17
h i s t ( n . r a v e l ( ) , f a c e c o l o r= ' r ' , a l p h a
18
19
show ( )
[0 ,1] ,20)
s t a t s . norm . r v s ( s i z e =20)
=0.3)
Entre-
F.
A probabilidade condicional de
dada por:
P (E | F ) =
P (E F )
P (F )
P (E | F ) =
P (F | E)P (E)
P (F )
204
Se particionarmos o eventos
em
cludentes, pelo teorema da probabilidade total, chegaremos verso mais comumente utilizada da frmula de Bayes:
P (F | Ei )P (Ei )
P (Ei | F ) = Pn
i=1 P (F | Ei )P (Ei )
O teorema de Bayes nos permite calcular as probabilidades de um
conjunto de hipteses explanatrias (Ei ), dado que observamos certos fatos (F ):
P (Ei | F ).
ori
das hipteses
P (Ei )
a pri-
Dadas
P (Ei )
luz de
P (Ei | F ).
A denio acima reete uma situao em que temos um conjunto discreto de hipteses explanatrias (Ei ), sobre as quais desejamos realizar nossa inferncia.
X,
e os fatos ou da-
f (x | ),
p()
e os dados,
L(; x).
( | x) = R
p()L(; x)
L(; x)p()d
( | x)
seja igual a
1.
Isto
205
( | x) p()L(; x)
Logo, a densidade posterior de
a priori
Conforme vimos acima, a inferncia Bayesiana pode ser bastante intuitiva, conceitualmente. Na prtica, porm, quando queremos calcular a distribuio posterior dos parmetros, nos deparamos com vrios problemas numricos de considervel diculdade.
Para encontrar a constante de proporcionalidade mencionada
na seo anterior, precisamos integrar o produto da distribuio
a priori
.
2 Para
g(x)
f (y | x)
representa
a funo de densidade de
206
Z
J(y) =
Se
g(x)
X
= 1
J(y)
f (y | xi )
n i=1
onde
xi , . . . , xn g(x).
J(y).
y = x no intervalo [0, 1]. Pela frmula da rea do trin(base altura)/2 o resultado exato 0.5. Na listagem 9.2,
nosso g(x) passa a ser uma distribuio uniforme entre 0 e 1, visto
funo
gulo,
0.5
1
2
from
from
numpy
import
import
numpy . random
3 # desejamos
rea
4 # dada
funo
5 # ou
6
pela
seja :
y=x
0.5
x = uniform ( 0 , 1 , 5 0 0 0 )
7 # Seja
8
embaixo
f (y | x) = x
J = 1 . / 5 0 0 0 sum ( x )
d e uma
reta
x,
mais nossa
207
intervalo
[a, b],
tal que
p(x) m,
X U [a, b)
e
Y U [0, m)
Geramos
um valor de
X e
f (x)/m, caso contrrio
a partir do suporte de
este mtodo :
P (aceitar) = P ((X, Y ) A)
Z
P ((X, Y ) A | X = x)
=
a
1
f (x)
dx
m
b
a
a
Z b
1
=
f (x) dx
m(b a) a
1
m(b a)
1
dx
ba
208
Se a probabilidade de aceitao for muito baixa, devemos buscar um outro mtodo mais eciente. Especialmente para distribuies com suporte innito, a escolha de uma funo envelope mais
adequada, pode ajudar a aumentar a ecincia da amostragem.
Mtodo do Envelope
Suponhamos que desejemos simular
babilidade (PDF)
f ()
X ), cuja PDF
constante a tal que:
g().
(que
Suponhamos
f (x) ag(x), x
ou seja,
Aceitamos
f (x)/g(x).
g(), e U = u U [0, ag(y)].
de X se u < f (y)); caso contr-
Ento, amostramos
Y = y
de
f (x),
f (x).
P (U < f (Y ) | Y = y)g(y) dy
P (U < f (Y )) =
f (y)
g(y) dy
ag(y)
f (y)
dy
a
1
a
209
g(x)
de forma que
seja o
menor possvel.
Vamos ver como podemos representar estas idias em Python.
Listagem 9.3:
envelope
1 # Disponivel
2
3
4
5
6
from
from
from
def
no
pacote
de
import
numpy
import
pylab
amostra ( n ) :
"""
Esta
um v e t o r
funcao
amostra
mais
de
curto
"""
11
x=u n i f o r m ( 0 , 1 , n )
12
y=u n i f o r m ( 0 , 1 , n )
1.5
13
f x =6 x (1 x ) # x
tem
14
#r e t o r n a
so
seguinte
15
os
que
10
retorna
n.
distribuicao
valores
que
beta
satifazem
condicao :
s=c o m p r e s s ( y<f x , x )
return
16
18
como :
import
numpy . random
17
programas
e n v e l o p e . py
def
e f i c i e n c i a ( vector , n) :
19
"""
20
Testa
21
retorna
22
"""
23
24
prob =
25
diff
eficiencia
a
= len ( vector )
l / f l o a t (n)
= n l
da
amostragem .
probabilidade
de
aceitacao .
210
26
#n
necessario
para
obter
as
amostras
que
faltam
27
n2 = i n t ( d i f f / p r o b )
28
v e c 2 = a m o s t r a ( n2 )
29
30
#g e r a
31
nb ,
histograma
bins ,
patches =
hist (s ,
b i n s =50 ,
normed =0)
32
33
34
t i t l e ( ' Histograma
35
36
show ( )
return
37
38
39
def
40
de
testRS ( ) :
Esta
"""
43
n =100000
44
s a m p l e=a m o s t r a ( n )
45
e f i c i e n c i a ( sample , n )
48
d p i =400)
"""
42
47
n=%s '% n )
41
46
s:
if
funcao
__name__ ==
testa
modulo
'__main__ ' :
testRS ( )
a priori,
a ponto de poder
211
De posse destes elementos podemos invocar a tcnica de amostragem por rejeio para nos ajudar a amostrar da distribuio
posterior. Dado que:
() = p()L(; x)
temos que, sendo
LM ax
verossimilhana,
() p()LM ax
,
()
p()L(; x)
L(; x)
=
=
LM ax p()
LM ax p()
LM ax
212
.
Assim sendo, podemos utilizar o mtodo do envelope, amos-
a priori
trando da distribuio
babilidade igual a
L(;x)
LM ax .
1 # Disponivel
2
3
4
5
6
from
from
from
def
no
pacote
de
programas
como :
p o s t r e j . py
numpy
import
import
numpy . random
pylab
import
L i k e l i ( data ,
limits ,
nl ) :
n = l e n ( d a t a ) # Numero
( l l , ul ) =
de
l i m i t s #l i m i t e s
amostras
do
espaco
de
params .
s t e p = ( ul l l ) / f l o a t ( n l )
10
11
res =
12
s d = s t d ( d a t a ) #DP d o s
[]
#l i s t a
resultados
dados
for
mu
15
lik
= a r r a y ( r e s ) /max ( a r r a y ( r e s ) ) #
16
return
13
14
in
de
arange ( l l , ul , s t e p ) :
2) ) )
Verossimilhanca
17
18
19
def
lik
amostra ( n ,
d a t a , p l o t t e d =0) :
x=u n i f o r m ( 0 , 1 , n ) #s u p o r t e
20
limits
21
L= L i k e l i ( d a t a ,
22
f x =6 x (1 x ) # p r i o r i , b e t a ( 2 , 2 )
23
s=c o m p r e s s ( L [ : l e n ( x ) ] < f x , x ) #R e j e i c a o
24
i f not
= 0 ,1
plotted :
limits ,
n)
p1 =
26
p2 = p l o t ( s o r t ( x ) , L )
27
l e g e n d ( [ p1 , p2 ] , [ ' P r i o r i ' ,
return
28
29
30
def
213
scatter (x , fx )
'
Verossimilhanca ' ] )
s
e f i c i e n c i a ( vector , n ,
data ) :
31
32
prob =
33
diff
34
n2 = i n t ( d i f f / p r o b )
35
v e c 2 = a m o s t r a ( n2 , d a t a , p l o t t e d =1)
36
39
l / f l o a t (n)
= n l
return
37
38
= len ( vector )
def
40
s , prob
main ( ) :
n =90000
41
data = uniform ( 0 , 1 , 3 )
42
s a m p l e=a m o s t r a ( n ,
43
s , prob =
44
f i g u r e ( 2 ) #g e r a
data )
e f i c i e n c i a ( sample , n ,
data )
histograma
45
hist (s ,
46
47
48
,2) )
49
t i t l e ( ' Posterior :
50
51
show ( )
return
52
53
54
55
if
__name__ ==
main ( )
n=%s '% n )
'__main__ ' :
214
a priori
apresenta
215
Zt = Zt1 + t ,
t N (0, 2 )
(z).
Esta distri-
Entre-
(z).
(z),
pre-
Este perodo
1 # c o d i n g : l a t i n
2 # Disponivel
pacote
no
de
programas
como :
markov . py
3 #g e r a n d o uma c a d e i a
4
5
6
de
markov
7
8 n =10000
9
10
11
12
a l p h a =0.99
x=z e r o s ( 1 0 0 0 0 ,
for
in
Float )
xrange ( 1 , n ) :
x [ i ]= a l p h a x [ i
1]
+ exponential (1 ,1) [ 0 ]
13 # p l o t t i n g
14
subplot (211)
15
t i t l e ( ' Processo
16
plot (x)
17
18
19
subplot (212)
de
Markov ' )
216
20
h i s t ( x , b i n s =50)
21
22
23
24
show ( )
Executando o cdigo apresentado na listagem 9.5 obtm-se a
gura 9.5.
Como exerccio,
217
O Amostrador de Metropolis-Hastings
Este amostrador consiste em gerar amostras sequenciais de forma a
aproximar uma distribuio da qual no temos meios de amostrar
diretamente. Este algoritmo pode amostrar de qualquer distribuio de probabilidade
p(x),
possa ser
calculada.
Como qualquer cadeia de markov, o amostrador comea em um
dado valor arbitrrio para a varivel
e prossegue em um passeio
218
Se
u<
x0
se torna
xt+1 ,
caso contrrio
p(x0 )
p(xt )
xt+1 = xt .
1 # e n c o d i n g : l a t i n
2 # Disponivel
3
4
5
6
7
from
from
. py
numpy
no
pacote
import
scipy . stats
programas
como : MH
import
class A m o s t r a d o r :
def __init__ ( s e l f
de
alvo ,
proposta ) :
"""
Incializa
amostrador
10
alvo :
11
proposta :
12
"""
13
s e l f . a l v o = kde . g a u s s i a n _ k d e ( a l v o )
14
s e l f . prop = p r o p o s t a
dados
definindo
objeto
densidade
gerador
alvo
de
propostas .
15
16
def
Run ( s e l f , n , b u r n i n =100) :
17
18
Roda
19
20
amostra = z e r o s ( n , f l o a t )
21
alvo =
22
23
24
amostrador
por
passos
s e l f . alvo
= 0
while
i < n 1:
x = amostra [ i ]
25
inova =
26
can = x + i n o v a
s e l f . prop . r v s ( ) [ 0 ]
219
27
a p r o b = min ( [ 1 , a l v o . e v a l u a t e ( c a n
28
u = uniform . rvs ( ) [ 0 ]
if
29
u < aprob :
30
a m o s t r a [ i +1] = x = c a n
31
return
32
33
if
34
i += 1
amostra [ burnin : ]
__name__=="__main__" :
35
import
36
d a d o s = c o n c a t e n a t e ( ( norm . r v s ( s i z e =500) ,
37
a = A m o s t r a d o r ( d a d o s , norm ( 0 , 1 ) )
pylab
as P
norm . r v s ( 4 , 1 , s i z e =500) ) )
38
r e s = a . Run ( 1 0 0 0 0 )
39
P. p l o t ( arange (
( arange (
40
P . h i s t ( r e s , normed =1 , a l p h a = 0 . 5 )
41
42
43
P . show ( )
Normalmente, utiliza-se um amostrador como este para amostrar de distribuies das quais toda a informao que se tem provm de uma amostra.
gaussian_kde do Scipy.
para o amostrador.
Note que a distribuio de propostas passada para o objeto
Amostrador
oferecidos por
scipy.stats3 .
3 Estas classes podem ser chamadas diretamente com seus parmetros como
mostrado na linha 36 da listagem 9.6, retornando um objeto frozen com os
220
do amostrador aps a remoo de um nmero de amostras do incio da cadeia determinado pelo parmetro
burnin.
Esta remoo
O Amostrador de Gibbs
O amostrador de Gibbs foi desenvolvido para permitir a gerao de
amostras a partir de distribuies conjuntas de duas ou mais variveis. O amostrador de Gibbs um caso especial do amostrador
de Metropolis-Hastings. Na listagem 9.7, vemos uma implementamesmos mtodos mas com os parmetros xos
221
1 # Disponivel
no
pacote
de
programas
como :
g i b b s . py
2 # e n c o d i n g : l a t i n
3
4
5
6
7
from
from
import
numpy
numpy . random
zeros ,
class Amostra :
def __init__ ( s e l f
cormat ,
10
n , v a r l i s t , loc , scale ,
da
loc
scale
gerador
listas
em
varlist
geradores
normal ,
14
logistic ,
15
16
self .n = n
17
s e l f . vars =
18
s e l f . loc = loc
19
self . scale
20
s e l f . r o = cormat
23
def
funes
sao
13
22
de
do numpy
12
21
amostra
lista
geradoras
11
para
cada
testados :
beta ,
gamma ,
lognormal ,
gumbel
wald ,
laplace
varlist
scale
s e l f . burnin = burnin
Run ( s e l f ) :
results
. n) , f l o a t )
24
array
b u r n i n =1000) :
tamanho
varlist
sqrt ,
import
dp = s q r t (1 s e l f . r o
2)
222
25
ms =
26
dps =
27
ro =
for
28
29
s e l f . loc
self . scale
s e l f . ro
i in x r a n g e ( 1 , s e l f . n ) :
for n , j in e n u m e r a t e ( s e l f . v a r s ) :
30
results [n, i ]
= j ( ms [ n ]+ r o [ n ,
n 1 ] ( r e s u l t s [ n 1 , i
1]
ms [ n ] ) / d p s [ n 1 ] , d p s [ n ]
return
31
32
33
if
dp [ n , n 1 ] )
r e s u l t s [ : , s e l f . burnin : ]
__name__=="__main__" :
34
import
35
n = 10000
pylab
36
varlist
37
loc =
as P
= ( b e t a , gamma , n o r m a l )
(2. ,9. ,5 ,)
38
scale
39
cormat = z e r o s ( ( 3 , 3 ) , f l o a t )
40
#c o r m a t = a r r a y
(2 ,.5 ,1.)
41
s = Amostra ( n , v a r l i s t , l o c , s c a l e , c o r m a t )
42
r e s = s . Run ( )
43
44
45
P . l e g e n d ( [ ' Beta
Normal ' ] )
46
47
P . show ( )
O amostrador de Gibbs pode ser aplicado quando no se co-
223
xit+1
de todas outras variveis no tempo t. No exemplo mostrado na listagem 9.7, uma variante deste mtodo implementado, na qual as
variveis so calculadas a partir de uma estrutura de dependncia
circular(Figura 9.7).
xk
k = 0, 1, 2, 3, . . .
X (Figura
observaes sobre
yk [y0 , y1 , . . . , yk ]
o conjunto de
9.9).
xk
a partir da distri-
buio posterior
p(xk | y0 , y1 , . . . , yk )
ao passo que os mtodos MCMC, modelam a posterior completa:
p(x + 0, x1 , . . . , xk | y0 , y1 , . . . , yk )
224
p(xk | y0 , y1 , . . . , yk )
pondera-
1. Retiramos P amostras (x
) da distribuio
o de
X , p(xk | xk1 );
a priori
de transi-
225
2. Calculamos a
p(yk | xk )
4. Normalizamos W;
5. Re-amostramos P valores de
x
com probabilidades dadas por
W;
A re-amostra (distribuio posterior de
xk )passa
a ser a
a priori
1 # e n c o d i n g : l a t i n
2 # Disponivel
s i r . py
no
pacote
de
programas
como :
226
3
4
5
6
7
8
9
SMC:
"""
10
Monte
11
"""
12
def
Carlo
Sequencial
__init__ ( s e l f ,
usando
SIR
p r i o r t y p e , pars ,
range
, r e s o l u t i o n =512) :
13
14
Inicializa
15
priortype
Filtro .
deve
ser
um RNG d e
scipy .
stats
16
pars
17
18
self . priori
19
s e l f . pars = pars
20
s e l f . range = range
21
so
os
parmetros
da
priori .
= priortype
1./
resolution
22
self . likelihood
23
s e l f . p o s t e r i o r=a r r a y ( [ ] )
24
25
26
def
= None
__call__ ( s e l f , datum ) :
sc =
s e l f . pars [ 1 ]
27
m =
s e l f . range [ 0 ]
28
M =
s e l f . range [ 1 ]
29
step =
30
s u p = a r a n g e (m,M, s t e p )
31
lik
32
self . likelihood
s e l f . res
= e x p ( a r r a y ( [ l i k e . Normal ( datum , i
, sc )
for
in
=
sup ] ) )
l i k /sum ( l i k )
post =
return
34
35
36
37
def
c a l c P o s t e r i o r (1000)
post
calcPosterior ( self ,
n) :
"""
38
Calcula
39
"""
40
self .
227
if
41
distribuio
posterior
s e l f . p o s t e r i o r . any ( ) :
s =
s e l f . p r i o r i . r v s ( s i z e =n , l o c=
s e l f . pars [ 0 ] ,
s c a l e= s e l f .
pars [ 1 ] )
42
#p d e n s= k d e . g a u s s i a n _ k d e ( s e l f .
43
#s= p d e n s . r e s a m p l e ( n )
posterior )
44
else :
45
s =
s e l f . p r i o r i . r v s ( s i z e =n ,
l o c= s e l f . p a r s [ 0 ] ,
s c a l e=
s e l f . pars [ 1 ] )
46
m = array ( [ s e l f . range [ 0 ] ] )
47
M = array ( [ s e l f . range [ 1 ] ] )
48
step =
49
s u p p = a r a n g e (m,M, s t e p )
50
s = c o m p r e s s ( l e s s ( s . r a v e l ( ) ,M) &
51
d = u n i f o r m . r v s ( l o c =0 , s c a l e =1 , s i z e =s
52
if
s e l f . res
g r e a t e r ( s . r a v e l ( ) ,m) , s )
53
54
55
. size )
s e l f . p o s t e r i o r . any ( ) :
w=
else :
w =
s e l f . p r i o r i . p d f ( supp ) s e l f .
likelihood
s e l f . p r i o r i . p d f ( supp , l o c=
s e l f . p a r s [ 0 ] , s c a l e= s e l f . p a r s
[1])
56
w = w/sum (w)
self
. likelihood
228
57
s x = s e a r c h s o r t e d ( supp , s )
58
w = w [ s x 1]
59
w = w. r a v e l ( )
60
p o s t = c o m p r e s s ( d<w , s )
61
62
s e l f . p o s t e r i o r = post
return
63
64
65
if
post
__name__=="__main__" :
66
67
d a t a = 2 s i n ( a r a n g e ( 0 , 7 , . 2 ) ) +2#o n e s ( 1 0 )
68
sup = a r a n g e (
69
priori
70
P. ion ()
71
lin ,
72
pt ,
73
P. grid ()
74
10 ,15 ,25/512.)
for
= P . p l o t ( sup , p r i o r i )
= P . p l o t ( [ data [ 0 ] ] , [ 0 . 0 5 ] , ' o ' )
i
in
data :
75
est = pf ( [ i ] )
76
l i n . s e t _ y d a t a ( kde . g a u s s i a n _ k d e ( e s t ) .
77
pt . set_xdata ( [ i ] )
78
P . draw ( )
e v a l u a t e ( sup ) )
79
i , c o m p r e s s ( p f . l i k e l i h o o d==max (
pf . l i k e l i h o o d ) ,
s u p ) , median ( e s t )
__call__,
caracterstico
a priori
229
like.py.
priori,
A verossimilhana o
a priori
Varivel Discreta
Seja
{p ; }
X = (X1 , . . . , Xn ).
(x1 , . . . , xn ) dada por:
discretas
L( | x1 , . . . , xn ) , p (x1 , . . . , xn )
e uma funo de
(X1 , . . . , Xn ) = (x1 , . . . , xn ),
230
lhana apenas uma notao diferente para a funo de probabilidade. Contudo, conceitualmente existe uma distino importante:
Quando se estuda a funo de probabilidade, xa-se o parmetro e
obtm-se a variao da probabilidade em funo do valor da vari-
vel,
de
p, 0 < p < 1.
Pp
1.
x = 0,
L(p | 0) = 1 p
Para
x = 1,
L(p | 1) = p
L(p | x) = px (1 p)1x ,
x {0, 1}
1 >>>
from
import
in a r a n g e ( 0 , 1 , . 0 1 ) ]
pylab
2 >>> L=[1 p
for
igual a
0.
3 >>> p l o t ( a r a n g e ( 0 , 1 , . 0 1 ) , L )
4 >>> show ( )
Para mltiplas observaes independentes, a funo de verossimilhana caria assim:
L(p | x1 , . . . , xn )
= p
Pn
i
xi
Pn
(1 p)n
xi
(9.1)
231
um
loci,
podemos representar
esta comparao como uma varivel Bernoulli (Xi )que assume valor
para
loci
para
loci
1 # c o d i n g : l a t i n
2 # Disponivel
pacote
no
de
programas
como :
l i k 1 . py
from
a ="ATTAGCCCTTGGGAACATCCC"
pylab
import
5 b ="ATGAGCTCTTGGTTAAGACCC"
6 n = len (a)
7 # Comparando
as
sequncias :
8 comp = [ i n t ( a [ i ]==b [ i ] )
for
in
range ( len ( a
)) ]
9 # Contando nmero d e
10
correspondncias
11 # C a l c u l a n d o L
12 L = [ p soma (1 p ) ( nsoma )
(0 ,1 ,.01) ]
13
p l o t ( arange ( 0 , 1 , . 0 1 ) ,
14
15
show ( )
L)
for
in
arange
232
exemplo.
Analisando o cdigo da listagem 9.10, utilizamos a tcnica de
list comprehension
locus
locus
Como a
int
mente. Na linha
verossimilhana.
Figura 9.10:
sequncias de DNA.
233
Varivel Contnua
A funo de verossimilhana para variveis aleatrias contnuas
similar ao caso discreto apresentado acima. Para uma varivel contnua, substitumos a funo de probabilidade da denio discreta
pela funo de densidade de probabilidade. Se
g (x1 , . . . , xn ),
(X1 , . . . , Xn ),
ento
L( | x1 , . . . , xn ) =
n
Y
f (xi )
i=1
X1 , . . . , X n
se
das.
A ttulo de exemplo, vamos escrever a funo de verossimilhana
X com
. Dado
o nosso parmetro
(2)1/2 e(x)
/2
mdia
e varincia 1.
Xi
que a densidade de
L( | x1 , x2 , x3 ) = (2)3/2 e1/2
P3
1 (xi )
(9.2)
Log-verossimilhana
Na funo de verossimilhana, o termo que no depende de
de-
9.10.
4 Se
5 Modique
234
1 L [ 0 ] = L [ 1 ] #removendo o
zero
do
incio
da
lista
p l o t ( arange ( 0 , 1 , . 0 1 ) ,
show ( )
l o g ( array (L) ) )
?? e 9.11).
235
1 MLE = c o m p r e s s ( e q u a l ( L , max ( L ) ) , a r a n g e
(0 ,1 ,.01) )
MLE
0.67]
do mdulo
6 Importado,
pylab.
236
p(x),
teremos que faz-lo por meio de uma funo (se esta fun-
como argumento e
por exemplo um dicionrio. Naturalmente esta ltima representao se presta apenas a uma gama bastante limitada de variveis.
1 >>> # D i s t r i b u i o
dado
de
probabilidades
d e um
cbico
2 >>> dado =
{1:1/6. ,2:1/6. ,3:1/6. ,4:1/6. ,5:1/6. ,6:1/6.}
3 # copyright
4 # Licensed
5
6
2007
Flavio
Codeco
Coelho
u n d e r GPL v3
237
8
9
10
11
from
class
BayesVar :
"""
12
Bayesian
13
"""
14
import
scipy . stats
def
random
variate .
__init__ ( s e l f ,
p r i o r t y p e , pars ,
range
, r e s o l u t i o n =512) :
15
16
Inicializa
17
Adquire
varivel
mtodos
da
aleatria .
classe
priortype
18
priortype
deve
ser
um RNG d e
scipy .
stats
19
pars
20
21
s e l f . p r i o r n = p r i o r t y p e . name
22
s e l f . _ f l a v o r i z e ( p r i o r t y p e ( pars ) ,
23
s e l f . pars = pars
24
s e l f . range = range
25
so
os
parmetros
da
priori .
priortype )
1./
resolution
26
self . likefun
s e l f . _Likelihood ( s e l f
. priorn )
27
self . likelihood
= None
Esta classe deve solicitar estas informaes na sua inicializao(Listagem 9.14). O pacote
scipy.stats
238
priortype
a priori
_flavorize
(Listagem 9.15).
29
s e l f . p o s t e r i o r=a r r a y ( [ ] )
30
def
31
_ f l a v o r i z e ( s e l f , pt ,
32
33
add
34
35
s e l f . c d f = pt . c d f
36
methods
self . isf
if
37
38
40
else :
41
distribution
type
= pt . i s f
i s i n s t a n c e ( ptbase , rv_continuous ) :
elif
39
from
ptbase ) :
s e l f . pdf = pt . pdf
i s i n s t a n c e ( ptbase , r v _ d i s c r e t e ) :
s e l f . p d f = p t . pmf
sys . exit ( ' Invalid
distribution
object ' )
De acordo com o tipo de distribuio
a priori,
o mtodo Like-
239
return
100
101
102
def
[]
_ Li k e li h oo d ( s e l f , typ ) :
103
104
Define
familia
paramtrica
da
verossimilhana .
105
Retorna
106
typ
107
funo
deve
ser
de
uma
verossimilhana .
string .
if
108
t y p ==
109
elif
110
111
return lambda ( x ) : ( 1 . / x [ 2 ] ) x
[0]. size
e x p ( ( 1 . / x [ 2 ] ) sum (
x[0]) )
Durante a inicializao da varivel, uma lista vazia de dados
criada. Esta lista conter todos os conjuntos de dados independentes que forem atribudos varivel.
posterior.
addData,
cuja
_update(Listagem
9.17).
42
43
44
s e l f . ppf = pt . ppf
def
s e l f . r v s = pt . r v s
_update ( s e l f ) :
240
45
"""
46
Calculate
47
"""
if
48
likelihood
function
s e l f . data :
s e l f . data [ 1]
49
d =
50
sc =
s e l f . pars [ 1 ]
51
m =
s e l f . range [ 0 ]
52
M =
s e l f . range [ 1 ]
53
step =
54
s e l f . res
#s e l f . l i k e f u n
log
returns
likelihood
55
lik
= exp ( a r r a y ( [ s e l f . l i k e f u n ( ( d
for
, i , sc ) )
in
a r a n g e (m,M,
step ) ] ) )
56
self . likelihood
57
def
58
addData ( s e l f ,
59
"""
60
Adds
dataset
data =
to
l i k /sum ( l i k )
[]) :
variable ' s
data
store
61
"""
Os mtodos
getPriorSample
getPriorDist
a priori,
retornam amos-
respectivamente(Listagem
9.18).
Listagem 9.18: Classe Varivel Aleatria Bayesiana Amostras e
PDF da
a priori.
63
64
65
s e l f . _update ( )
def
getPriorSample ( s e l f , n) :
66
67
Returns
sample
distribution
from
the
prior
241
return
69
70
def
71
s e l f . r v s ( s i z e =n )
getPriorDist ( s e l f ) :
72
"""
73
Returns
the
prior
PDF .
getPosteriorSample
(Listagem 9.19). Este mtodo responsvel por atualizar a distribuio posterior da varivel sempre que se solicitar uma amostra.
Utiliza um mtodo de amostragem por importncia no qual se reamostra a distribuio
a priori
priori.
Vale no-
a priori.
74
"""
75
return
[ 0 ] , s e l f . range [ 1 ] , s e l f . r e s ) )
76
def
getPosteriorSample ( s e l f ,
77
"""
78
Return
sample
of
the
n) :
posterior
distribution .
79
"""
80
if
s e l f . p o s t e r i o r . any ( ) :#
posterior
as
Use
last
prior
81
k= k d e . g a u s i a n _ k d e ( s e l f .
82
s= k . r e s a m p l e ( n )
posterior )
83
else :
84
85
s =
if
s e l f . getPriorSample (n)
s e l f . data :
242
86
m =
s e l f . range [ 0 ]
87
M =
s e l f . range [ 1 ]
88
step =
89
s u p p = a r a n g e (m,M, s t e p )#s u p p o r t
90
s = c o m p r e s s ( l e s s ( s . r a v e l ( ) ,M) &
s e l f . res
g r e a t e r ( s . r a v e l ( ) ,m) , s )#
removing
o u t o f r a n g e
samples
91
d = u n i f o r m . r v s ( l o c =0 , s c a l e =1 ,
0 1
s i z e =l e n ( s ) )#U n i f o r m
samples
s e l f . p d f ( supp ) s e l f .
92
w =
93
w = w/sum (w) #n o r m a l i z i n g
94
s x = s e a r c h s o r t e d ( supp , s )
95
w = w [ s x 1]# s e a r c h
likelihood
weights
returns
96
sorted
1 b a s e d
binlist
p o s t = c o m p r e s s ( d<w , s )
97
s e l f . p o s t e r i o r = post
98
return
post
Este teste
= 3
e desvio padro
= 1.
Um pequeno
a priori,
da varivel(Figura 9.12).
Listagem 9.20: Classe Varivel Aleatria Bayesiana Cdigo de
teste.
113
return lambda ( x ) : l i k e . B e t a ( x
[0] ,x[1] ,x[2])
if
243
__name__=="__main__" :
bv = BayesVar ( norm , ( 3 , 1 ) , r a n g e = ( 0 , 5 ) )
117
data = ones ( 2 0 )
118
bv . addData ( d a t a )
119
p = bv . g e t P o s t e r i o r S a m p l e ( 2 0 0 0 0 0 )
120
P . p l o t ( a r a n g e ( bv . r a n g e [ 0 ] , bv . r a n g e [ 1 ] ,
121
P . p l o t ( a r a n g e ( bv . r a n g e [ 0 ] , bv . r a n g e [ 1 ] ,
122
P. hist (p ,
123
bv . r e s ) , bv . l i k e l i h o o d ,
' ro ' ,
l w =2)
244
Listagem 9.21:
completa
1 # e n c o d i n g : l a t i n
2 # Disponivel
no
pacote
de
programas
como :
B a y e s . py
3 # copyright
4 # Licensed
5
6
7
8
9
10
11
2007
Codeco
Coelho
BayesVar :
"""
12
Bayesian
13
"""
14
Flavio
u n d e r GPL v3
def
random
variate .
__init__ ( s e l f ,
p r i o r t y p e , pars ,
range
, r e s o l u t i o n =512) :
15
16
Inicializa
17
Adquire
varivel
mtodos
da
aleatria .
classe
priortype
18
priortype
deve
ser
um RNG d e
scipy .
stats
19
pars
20
21
s e l f . p r i o r n = p r i o r t y p e . name
22
s e l f . _ f l a v o r i z e ( p r i o r t y p e ( pars ) ,
23
s e l f . pars = pars
24
s e l f . range = range
25
so
os
parmetros
da
priori .
priortype )
resolution
1./
self . likefun
245
s e l f . _Likelihood ( s e l f
. priorn )
27
self . likelihood
28
s e l f . data =
29
s e l f . p o s t e r i o r=a r r a y ( [ ] )
30
31
def
= None
[]
_ f l a v o r i z e ( s e l f , pt ,
32
33
add
34
35
s e l f . c d f = pt . c d f
36
methods
self . isf
if
37
38
40
type
= pt . i s f
s e l f . pdf = pt . pdf
i s i n s t a n c e ( ptbase , r v _ d i s c r e t e ) :
else :
41
distribution
i s i n s t a n c e ( ptbase , rv_continuous ) :
elif
39
from
ptbase ) :
s e l f . p d f = p t . pmf
sys . exit ( ' Invalid
distribution
object ' )
42
43
44
45
s e l f . ppf = pt . ppf
def
s e l f . r v s = pt . r v s
_update ( s e l f ) :
"""
46
Calculate
47
"""
48
if
likelihood
function
s e l f . data :
s e l f . data [ 1]
49
d =
50
sc =
s e l f . pars [ 1 ]
51
m =
s e l f . range [ 0 ]
52
M =
s e l f . range [ 1 ]
53
54
step =
s e l f . res
#s e l f . l i k e f u n
returns
log
likelihood
55
lik
= exp ( a r r a y ( [ s e l f . l i k e f u n ( ( d
, i , sc ) )
for
in
a r a n g e (m,M,
246
step ) ] ) )
56
57
58
self . likelihood
def
addData ( s e l f ,
59
"""
60
Adds
dataset
data =
to
l i k /sum ( l i k )
[]) :
variable ' s
data
store
61
"""
62
s e l f . d a t a . append ( a r r a y ( d a t a ) )
63
s e l f . _update ( )
64
65
def
getPriorSample ( s e l f , n) :
66
67
Returns
sample
from
the
prior
distribution
68
return
69
70
71
def
72
getPriorDist ( s e l f ) :
"""
73
Returns
74
"""
return
75
76
s e l f . r v s ( s i z e =n )
def
the
prior
PDF .
[ 0 ] , s e l f . range [ 1 ] , s e l f . r e s ) )
getPosteriorSample ( s e l f ,
77
"""
78
Return
sample
of
the
n) :
posterior
distribution .
79
80
"""
if
s e l f . p o s t e r i o r . any ( ) :# Use
posterior
as
last
prior
81
k= k d e . g a u s i a n _ k d e ( s e l f .
82
s= k . r e s a m p l e ( n )
posterior )
247
else :
83
84
if
85
s =
s e l f . getPriorSample (n)
s e l f . data :
86
m =
s e l f . range [ 0 ]
87
M =
s e l f . range [ 1 ]
88
step =
89
s u p p = a r a n g e (m,M, s t e p )#s u p p o r t
90
s = c o m p r e s s ( l e s s ( s . r a v e l ( ) ,M) &
s e l f . res
g r e a t e r ( s . r a v e l ( ) ,m) , s )#
o u t o f r a n g e
removing
samples
91
d = u n i f o r m . r v s ( l o c =0 , s c a l e =1 ,
s i z e =l e n ( s ) )#U n i f o r m
0 1
samples
s e l f . p d f ( supp ) s e l f .
92
w =
93
w = w/sum (w) #n o r m a l i z i n g
94
s x = s e a r c h s o r t e d ( supp , s )
95
w = w [ s x 1]#s e a r c h
likelihood
weights
96
s e l f . p o s t e r i o r = post
return
98
else :
return
99
100
102
binlist
p o s t = c o m p r e s s ( d<w , s )
97
101
sorted
1 b a s e d
returns
def
post
[]
_ Li k e li h oo d ( s e l f , typ ) :
103
104
Define
familia
paramtrica
da
verossimilhana .
105
Retorna
106
typ
107
deve
funo
ser
de
uma
verossimilhana .
string .
248
if
108
t y p ==
109
elif
110
111
return lambda ( x ) : ( 1 . / x [ 2 ] ) x
[0]. size
elif
112
e x p ( ( 1 . / x [ 2 ] ) sum (
x[0]) )
t y p ==
return lambda ( x ) : l i k e . B e t a ( x
113
114
115
116
if
__name__=="__main__" :
bv = BayesVar ( norm , ( 3 , 1 ) , r a n g e = ( 0 , 5 ) )
117
data = ones ( 2 0 )
118
bv . addData ( d a t a )
119
p = bv . g e t P o s t e r i o r S a m p l e ( 2 0 0 0 0 0 )
120
P . p l o t ( a r a n g e ( bv . r a n g e [ 0 ] , bv . r a n g e [ 1 ] ,
121
P . p l o t ( a r a n g e ( bv . r a n g e [ 0 ] , bv . r a n g e [ 1 ] ,
122
P. hist (p ,
123
124
P. t i t l e ( ' Bayesian
125
126
P . show ( )
bv . r e s ) , bv . l i k e l i h o o d ,
' ro ' ,
l w =2)
9.10 Exerccios
1. Compare a acurcia do amostrador de Metropolis-Hastings
resample do objeto
gaussian kde. Teste com diferentes formas de
O mtodo resample uma mera amostragem
com reposio.
9.10. EXERCCIOS
249
a priori
gncia do algoritmo.
4. Utilize o mtodo do hipercubo latino ilustrado na listagem 9.1
para gerar amostras das distribuies
a priori
nos exemplos
Apndices
251
Introduo ao Console
Gnu/Linux
Guia de sobrevivncia no console do Gnu/Linux
console
racional DOS, ao qual comumente comparado. O console Gnu/Linux tem uma longa histria desde sua origem no Bourne shell,
distribuido com o Sistema operacional(SO) UNIX verso 7.
sua evoluo, deu origem a algumas variantes.
Em
A variante mais
Console Gnu/Linux
principalmente para usurios leigos.
Alm do Console e sua linguagem (bash), neste captulo vamos conhecer diversos aplicativos disponveis no sistema operacional Gnu/Linux, desenvolvidos para serem utilizados no console.
A linguagem BASH
A primeira coisa que se deve entender antes de comear a estudar
o shell do Linux, que este uma linguagem de programao bastante poderosa em si mesmo.
ls
pwd
Lista arquivos.
cp
Copia arquivos.
mv
completo).
rm
Apaga
arquivos
(de
dade!).
ln
ver-
mkdir
Cria um diretrio.
rmdir
Remove
Para
mente
de
254
um
diretrio.
remover
recursiva-
toda
diretrios
rf(cuidado!).
uma
use
rvore
rm
A linguagem BASH
cat
tail
Visualiza
tela.
less
Visualiza
arquivo
com
nl
Visualiza
nal
do
ar-
com
numerao
das linhas.
possibilidade de movimen-
head
quivo.
od
Visualiza
arquivo
binrio
em base octal.
xxd
Console Gnu/Linux
gv
Visualiza
arquivos
Posts-
locate
cript/PDF.
xdvi
arquivos
DVI
Conta
bytes/palavras/li-
nhas.
du
grep
Busca
em
texto
retor-
nando linhas.
Uso de espao em disco.
le
cut
Atualiza registro de l-
tima
atualizao
do
exista, criado.
chown
Altera
dono
do
ar-
quivo.
chgrp
quivo.
chmod
paste
Altera as permisses de
um arquivo.
chattr
que o gzip,
Altera
atributos
avan-
ados de um arquivo.
lsattr
Lista
atributos
dos do arquivo.
nd
quivo texto.
ar-
touch
256
por
quivos.
wc
arquivo
updatedb.
Visualiza
stat
Localiza
Localiza arquivos.
avana-
porm mais
lento.
zip
di
comm
uptime
nados.
cmp
Compara
ltimo boot,
arquivos
byte
por byte.
e carga do
sistema.
top
cuo.
md5sum Calcula checksums.
df Espao livre em todos os dis- free Mostra memria livre.
cos(pendrives e etc.) mon- kill Mata processos.
tados.
mount
vel.
fsck
nice
Ajusta a prioridade de um
processo.
renice
Altera a prioridade de
um processo.
Console Gnu/Linux
usurio utiliza estes canais com a nalidade de redirecionar dados
atravs de uma sequncia de passos de processamento. Como este
processo se assemelha ao modo como canalizamos gua para lev-la
de um ponto ao outro, Estas construes receberam o apelido de
pipelines"ou tubulaes onde cada segmento chamado de pipe".
Devido a essa facilidade, muitos dos utilitrios disponveis na
shell do Gnu/Linux foram desenvolvidos para fazer uma nica coisa
bem, uma vez que funes mais complexas poderiam ser obtidas
combinando programas atravs de pipelines".
Redirecionamento
Para redirecionar algum dado para o STDIN de um programa, utili-
<.
zamos o caracter
chamado
nomes
comando sort < nomes ir lanar na tela os nomes ordenados alfabeticamente. De maneira similar, podemos utilizar o caracter
>
nomes,
ordenado.
Pipelines
Podemos tambm redirecionar sadas de comandos para outros comandos, ao invs de arquivos, como vimos anteriormente. O caractere que usamos para isto o
258
d : f 1
ajaxterm
cut
avahi
a v a h i a u t o i p d
backup
beagleindex
bin
boinc
...
< / e t c / passwd
| sort
O simples exemplo apresentado d uma idia do poder dos pipelines, alm da sua convenincia para realizar tarefas complexas,
sem a necessidade de armazenar dados intermedirios em arquivos,
antes de redirecion-los a outros programas.
Gnu plotutils
O GNu Ploting Utilities uma suite de aplicativos grcos e
matemticos desenvolvidos para o console Gnu/Linux. So eles:
graph
7 Desenvolvidos
259
Console Gnu/Linux
plot
pic2plot
tek2plot
matos acima.
Estes aplicativos grcos podem criar e exportar grcos bi-
Aplicativos Matemticos:
ode
spline
graph
A cada vez que chamamos o programa
graph,
ele l um ou mais
O grco
graph
p l o t . png
Se o
echo
.1
.1
.9
C m
.9
.9
.9
.1
.1
.1
graph
0.3
(0.1,0.1),
-m indica
o tipo
A opo
-q
graph
O programa
spline
O programa funciona de forma similar ao
peito entradas e sadas.
graph
echo
spline
spline
|
graph
-d.
echo
graph
spline
a s
(0,1).
A opo
-d 2
indica que
261
Console Gnu/Linux
Figura 2: Usando
262
spline.
-a
indica que a
-s).
263
Console Gnu/Linux
ode
ode
O utilitrio
graph,
A sada de
ode
pode
dy
= y(t)
dt
(3)
y(t) = et
(4)
y(0) = 1,
at
t = 1
e
= 2.718282, com 7 algarismos
ode
2 y '= y
3
y=1
step
t ,y
0 ,1
1 2.718282.
Como
espervamos.
Para facilitar a re-utilizao dos modelos, podemos colocar os
comandos do exemplo 28 em um arquivo texto. Abra o seu editor
favorito, e digite o seguinte modelo:
264
1 # O modelo
de
Lorenz
, Um s i s t e m a
de
trs
EDOs a c o p l a d a s ,
2 # com um p a r m e t r o
3 x' =
4 y' =
5
z'
r.
3 (xy )
x z+r xy
x yz
6
7
r = 26
x = 0;
9
10
print
step
y = 1;
x,
0,
z = 0
y
200
lorenz.
ode <
20
lorenz
graph
C x 10
10
20
265
Console Gnu/Linux
266
ndice Remissivo
arange, 46
EDO, 258
aranha, 190
elif, 28
array, 46
else, 28
Emacs, 81
.shape, 46
enumerate, 30
bancos de dados, 185
break, 32
excees, 32
classe, 53
except, 32
atributos, 54
mtodos, 55
nally, 32
conjuntos, 27
for, 30
Console Python, 4
FORTRAN, 117
Controle de Verses, 86
funes, 34
lista de argumentos va-
Mercurial, 88
rivel, 36
Ctypes, 105
passando argumentos, 36
decoradores, 38
funoes
dicionrios, 24
argumentos opcionais, 35
mtodos, 25
geradores, 38
Editores, 80
Gibbs, 219
editores, 80
Gnu Nano, 81
267
ndice Remissivo
Grafos, 169
MCMC, 216
graph, 258
Mercurial, 88
Metropolis-Hastings, 217
Herana, 56
IDEs, 83
if, 28
import, 42
Inferncia Bayesiana, 203
Nmeros complexos, 10
Ipython, 73
NetworkX, 172
Comandos mgicos, 75
numpy, 45
iterao, 29
objetos, 52
Java, 125
operadores aritmticos, 8
Jedit, 81
Jython, 126
lambda, 37
LHS, 200
listas, 13
mtodos, 16
mdulo
numpy.linalg, 46
scipy, 46
Mdulos
pacotes, 44
Palavras reservadas, 4
pickle, 186
print, 46
pydoc, 47
Pyrex, 106
R, xix
return, 37
scipy, 46
BeautifulSoup, 190
Scite, 81
email, 181
Shedskin, 111
mailbox, 182
sqlite, 187
threading, 178
SQLObject, 190
mdulos, 41
numpy, 45
strings, 22
formatando, 23
Mathematica, xix
Matlab, xix
268
try, 32
tuplas, 19
unidades, 155
unum, 159
urllib, 193
urllib2, 193
uso interativo, 5
verossimilhana, 228
weave, 100
web-spider, 190
while, 29
zip, 31
269
Colophon
Este livro foi formatado usando