# Python para oceanógrafos/Colinha

BREVE GUIA DE PYTHON ESCRITO POR AMADOR
Observação importante: Neste guia podem (!) conter informações erradas.

## INTRODUÇÃO

Tipos de variáveis:
Objetos importantes:
Observações dos objetos:
Uso do help: help(<comando>) Ajuda também: <comando>? Para ver o código de uma função: <comando>??
* --> Comentário.

## ESPECIFICAÇÕES INICIAIS E IMPORTAÇÃO DE BIBLIOTECAS

"# -*- coding: utf-8 -*-" --> (Sem aspas, na primeira linha do algoritmo) possibilita a utilização de acentos gráficos no algoritmo. from __future__ import division # Razão entre inteiros se torna real. from pylab import * # Não é recomendável importar tudo da biblioteca; escrevi para lembrar! import numpy as np # Numerical Python. from matplotlib import pyplot as plt # Matplotlib.
u'string' --> Leitura do string como unicode. r'string' --> Leitura do string como raw. Obs: Dá pra usar os comandos do Latex na escrita de textos!
& --> E. | --> Ou. = --> Atribuição. == --> Comparação de igualdade. != --> Comparação de diferença.
* LIMPEZA DA CASA:
* del a, b, c # Descomentar para apagar possíveis variáveis.
plt.close('all') # Fechamento das figuras abertas. clear # Limpeza da linha de comando.

## COMANDOS GERAIS

run script.py --> Roda o algoritmo no Terminal. paste --> Idem a Ctrl+V. who --> Lista de variáveis. whos --> Lista de variáveis com descrição.
print('Texto') --> Escreve o texto na linha de comando. str(3) --> Idem ao num2str do Matlab. str1 + str2 --> Concatenação de strings. 'exemplo %d de string' % 4 --> Isso tudo é o string: 'exemplo 4 de string'; usar o formato "string % variável". %6.2f --> 2 algarismos depois da vírgula (já arredondado) e ocupando 6 caracteres ao todo. \n --> Mudar de linha. Obs: Dá pra usar os comandos do Latex na escrita de textos!
a[-1] --> Refere-se ao último elemento de a. b = a[:] --> b vira uma cópia de a ("a == b" retorna True e "a is b" retorna False). "a = 3; b = 4;" --> Pode ir na mesma linha. Dá pra fazer por tuple também.
range(a) --> Lista de 0 até (a-1) de 1 em 1. range(a, b) --> Lista de a até (b-1) de 1 em 1. range(a, b, n) --> Lista de a até b de n em n (exclusive b). np.arange(a, b, n) --> Matriz de a até b de n em n (exclusive b). np.linspace(a, b, n) --> Matriz de a até b com n elementos (b incluso). np.array([1, 2, 3]) --> Matriz unidimensional. np.array([[1, 2],[3, 4]]) --> Matriz bidimensional.
m.sum == np.sum(m) --> Quando 'm' é matriz. m.shape --> Retorna um tuple com as dimensões da matriz. m.size --> Retorna o número de elementos de uma matriz.
if, elif e else --> Começar com if; usar quantos elif quiser; else é opcional.
for <variável> in <lista>: --> Loop. Não há um "end". Uso da identação!
np.savez('vars', x, y, z) dat = np.load('vars.npz') a = dat['arr_0'] b = dat['arr_1'] c = dat['arr_2'] (a, b, c) = (dat['arr_0'], dat['arr_1'], dat['arr_2']) x, y, z podem ser números, matrizes, listas ou strings; o np.load sempre retornará matrizes (a, b, c serão matrizes). Deve ter um jeito mais inteligente de se fazer isso. Obs: Não sei se é com esse mesmo procedimento, mas é possível ler arquivos .mat.
p = np.loadtxt(<string do caminho do arquivo>, skiprows = 20, usecols = (2,)) --> Leitura de arquivo ASCII.
plt.show --> Mostra figura em questão. plt.close --> Fecha a figura em questão. fig = gcf --> Faz um handle da figura em questão. ax = gca --> Faz um handle do eixo em questão.

## EXEMPLO DE CONFECÇÃO DE FUNÇÃO

def pitagoras(a, b): c = np.sqrt(a**2 + b**2) return c
Obs: A ser colocada no início dos algoritmos.

## EXEMPLO DE UM PLOT SIMPLES BEM FEITO

fig, ax = plt.subplots(figsize=(7, 5)) ax.plot(x, y, '--b', label='Seno', linewidth=2) # Label é a legenda. ax.plot(2, 1, 'or', label='Cosseno', markersize=12) # Label é a legenda. legend(loc='upper left')
xlim(-5, 5) xticks([-np.pi, 0, np.pi], [r'$-\pi$', r'$0$', r'$\pi$']) ylim(-10, 10) yticks(linspace(-1, 1, 3), [r'$-1$', r'$0$', r'$1$'])
ax.set_title('Título') ax.set_ylabel('Imagem') ax.set_xlabel('Dominio') fig.savefig('name.png', transparent=True)
5.1 Mudança na posição dos eixos (origem):
ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') ax.xaxis.set_ticks_position('bottom') ax.spines['bottom'].set_position(('data',0)) ax.yaxis.set_ticks_position('left') ax.spines['left'].set_position(('data',0))
5.2 Alternativa para definição do tamanho da figura: usar o comando fig.get_size_inches.
5.3 Inversão de eixos (para plotagens de perfis!): ax.invert_yaxis
5.4 Plotando circulos: plt.scatter(x, y, <tamanho>, 'k', edgecolor = 'none', alpha = 0.5)

## EXEMPLOS DE COMANDOS ESPECÍFICOS

6.1 Trabalhando com tempo:
from datetime import datetime, timedelta
d1 = datetime(1991, 7, 30) d2 = datetime(1995, 2, 15) dt = d2 - d1 --> dt será datetime.timedelta(1296)
dt = timedelta(days = 2, hours = 3)
6.2 Trabalhando com mapas:
Google: "matplotlib basemap" from mpl_toolkits.basemap import Basemap help(Basemap) --> Há um exemplo! map = Basemap([...]) --> Lembrar que map é um objeto e que "map."+TAB é útil.

## BIBLIOTECAS

Padrão: from __future__ import division # Razão entre inteiros se torna real. import numpy as np # Numerical Python. from matplotlib import pyplot as plt # Matplotlib.
Módulos da "Standard library" do Python: import os # Operation System. from glob import glob # "Globbing" de arquivos.
Manipulação de netCDF (local/remoto): from netCDF4 import Dataset
Mapas: from mpl_toolkits.basemap import Basemap, shiftgrid, cm
OBS: Não usar a seawater, ela está obsoleta! Usar a gsw (GibbsSeaWater).

## INSTALAÇÃO

O Python já vem com o Ubuntu. Baixar (via Ubuntu Software Center): Ipython, Matplotlib, Numpy, Scipy, Basemap.
A biblioteca básica para oceanografia é a gsw (GibbsSeaWater).
Opcional: atualizar o .bashrc com o exemplo abaixo:
* Ipython alias:
alias py='ipython'
8.1 Baixar pacotes (roteiro usado somente para o EPD?):
1. Criar a pasta "modules" na pasta do Python. 2. Escrever no .bashrc: "export PYTHONPATH=$PYTHONPATH$HOME/softwares/python/modules". 3. Google: python seawater (por exemplo). 4. No site certo, clicar em "Source" e copiar o "command line access" para o Terminal. 5. (Precisa ter o Mercurial instalado.) 6. Fazer um link simbólico com: "$ ln -s /home/usuario/softwares/python/modules/python-seawater/seawater /home/usuario/python/modules/seawater". 7. Conferir se o link simbólico foi feito.

## EXEMPLO DE COMEÇO DE ALGORITMO

* -*- coding: utf-8 -*-
** PLOTAGEM DE PERFIL DE OXIGÊNIO DISSOLVIDO
** Autor: [...]
** Data: 22/jan/2013
** E-mail: [...]
* IMPORTAÇÃO DE BIBLIOTECAS:
from __future__ import division # Razão entre inteiros se torna real. import numpy as np # Numerical Python. from matplotlib import pyplot as plt # Matplotlib.
* LIMPEZA DA CASA:
* del a, b, c # Descomentar para apagar possíveis variáveis.
plt.close('all') # Fechamento das figuras abertas. clear # Limpeza da linha de comando.