Julia 101
Numa miríade de posts eu usei uma linguagem de programação chamada Julia. Entretanto, eu nunca escrevi um post introduzindo o Julia, o que parece injusto. Este post corrige essa injustiça explicando o básico e o sistema de pacotes, bem como interfaces para o Julia.
Instalando
Primeiramente, o site do Julia é este aqui. O download é óbvio e funciona sem mistérios, bem como a instalação. Se voce usa alguma distribuição de Linux, você também pode baixar pela “loja” do linux.
Atualmente o próprio Julia oferece uma IDE. Ela é só o Atom disfarçado, mas já vem com os pacotes necessários instalados, então é extremamente conveniente. O Pedro só conseguiu usar o Julia “via Atom” assim.
Outra opção é usar o Atom, que tem um plugin que faz funcionar o Atom funcionar como uma IDE. Basta abrir o config (ctrl + ,), ir em install e buscar por julia - o que interessa é o julia-client e o julia-language. Você também deve instalar o juno. Em geral, vai demorar um pouco. Ele deve instalar uma meia duzia de outros pacotes importantes e pedir para reiniciar o Atom. Se tudo funcionar, vai aparecer uma barrinha na esquerda do Atom com vários ícones, incluindo um botão de play, pause e stop. Para abrir uma seção iterativa do Julia, desloque o mouse até a barra embaixo. Vai aparecer uma setinha para cima - ou vá no menu Julia e escolha Open Console. Clica nele e enter e o deve aparecer uma mensagem em inglês “aperte enter para iniciar o Julia”. Você sabe o que fazer.
Em alguns casos, você pode precisar de instalar o pacote atom no Julia para o Julia e o Atom se entenderem. Para isso, vá no próprio Atom, no menu Julia e escolha Open Terminal. Lá, você deve instalar o pacote Atom e o pacote Juno (eu explico como instalar pacotes mais abaixo).
O primeiro ícone na barra a esquerda do Atom abre um arquivo em Julia. Você pode escrever o código lá e dar ctrl + enter na linha para o Julia rodar. Se o Julia ainda não tiver sido iniciado, ele será iniciado automaticamente.
Também é possível usar o Julia no Jupyter. Para isso, basta instalar o pacote no próprio Julia chamado IJulia. Uma vez carregado, use notebok()
para abrir um notebook do jupyter no seu browser.
E é claro que você pode usar o Julia no terminal.
Usando online
Você não necessariamente precisa instalar o Julia. O Julia box permite você usar o Julia direto do navegador sem instalar nada. Ele se parece muito com o Jupyter e tem suporte para pacotes também, mas são instalados de maneira diferente que a descrita nas linhas abaixo.
Pacotes
O repositório de pacotes do Julia é o Julia Observer
Instalar pacotes no Julia é interessante. Numa seção interativa do Julia voce deve digitar ] (não é um typo). Isso ativa a interface de instalação de pacotes. Para instalar, basta digitar add nome_do_pacote
. Por exemplo, para instalar o pacote de otimização, bastaria fazer add optim
. Para fazer update, na mesma interface, basta digitar update
.
(Na versão 1.0.2, a mais recente quando esse post foi escrito, o Julia tem um bug que impede de instalar qualquer pacote. Para corrigir, no próprio julia digite rm(joinpath(homedir(), ".julia", "registries"); recursive=true)
. Retirado daqui).
Alguns pacotes importantes são o Optim e o Plots (os nomes são auto explicativos). O Plots é especialmente importante porque o Julia não tem nenhum suporte nativo à gráficos, e o Plots tem uma interface extremamente amigável e faz gráficos bonitos. O próprio help do pacote já é suficiente para usar ele.
Para carregar um pacote, basta digitar using nome_do_pacote
. Se eu quiser carregar o pacote Plots, por exemplo, eu faria using Plots
O Julia Observer conta com uma enorme variedade de pacotes, mas dado o quão nova é a linguagem, ela ainda não chega perto do Python ou do R.
Matemática básica e matrizes
O básico de matemática com o Julia é obvio: 2+2
retorna 4 etc. O Julia usa ^
para potenciação, ao contrário do infame **
do Python.
Criar matrizes no Julia é muitissimo parecido com o matlab (a ponto de você poder copiar um código que criar uma matriz no Julia para o matlab e vice versa). Para exemplificar, vamos construir a matriz identidade:
[[1 0];[0 1]]
Espaço separa elementos dentro da mesma linha, e ponto e vírgula “pula” a linha. Felizmente, para a matriz identidade, o Julia fornece o comando Matrix{Float64}(I,dim1,dim2)
onde dim1
é o número de linhas e dim2
é o número de colunas. Veja que podemos criar matrizes de zeros com o comando zeros
, de 1s com o comando ones
e matrizes com elementos iid de uma normal de média zero e variância 1 com o randn
. Mais ainda, podemos zerar arrays que são matrizes com mais dimensões, usando os mesmos comandos, mas adicionando mais argumentos.
Transposto (e transposta conjugada) são obtidos usando '
. Logo a transporta da matriz A
é A'
. A inversa é obtida usando usando inv()
.
Outra operação muito comum é aplicar uma função a todos os elementos do array. A sintaxe geral disso para o Julia é foo.()
. Então, se quisermos o valor absoluto dos elementos da matriz A, fariamos abs.(A)
. Essa notação com ponto é tão geral que se aplica a operadores matemáticos. Suponha que temos dois vetores \(v\) e \(h\), e queremos dividir um vetor elemento a elemento: bastaria fazer v ./ h
. Isso também funciona para operadores lógicos (x .< 0
para ver quais elementos do vetor x são menores que 0)
Fors e ifs
Como qualquer linguagem que se preze, Julia tem for
e if
. Um exemplo de for seria:
for i = 1:100
println(i)
end
Isso faria os números de 1 a 100 serem exibidos no console, um em cada linha - o print usual mostraria eles todos juntos. Veja que não há necessidade de parêntese e de chaves para delimitar as coisas. O fim do for
é indicado pela keyword end
. Um if
segue a mesmissa ideia: coloque a condição e termine com um end
.
Funções
Existem duas maneiras básicas de criar uma função no Julia. Se a sua função é meramente matemática, você pode definir como você faria no papel:
f(x)=x^2
Mas as vezes queremos construir funções que ocupam várias linhas. Nesse caso, fariamos:
function nome_da_função
código aqui
end
Plots
Representar visualmente nossos resultados é importante. O pacote Plots é a melhor biblioteca disponível - em part por ela ser uma interface para várias outras. Vamos gerar alguns números aleatórios e usar o plot para ilustrar:
using Plots
x = randn(500)
plot(x)
Nós poderíamos querer plotar os pontos, e neste caso o comando é scatter
scatter(x)
Podemos sobrepor plots simplesmente usando plot!
depois do primeiro plot. Por exemplo, eu vou sobrepor duas “séries” cointegradas:
x = randn(200)
x = cumsum(x)
y = 0.5*x + randn(200)
z = x + randn(200)
plot(y)
plot!(z)
Optim
Existe vários pacotes para fazer otimização no Julia: Optim, JuMP, Nlopt. O Optim é o mais simples deles; o JuMP permite escrever problemas complicados com restrição de maneira elegante e resolver - de certa forma é um pacote muito mais completo do que o Optim. O Nlopt chama um pacote externo para resolver problemas de otimização não lineares que aceita restrição. EU vou ilustrar apenas o caso de uso do optim.
Suponha que queremos encontrar o mínimo de \(f(x,y) = x^2+3x*y\). Vamos definir a função do Julia. Veja que ela vai receber um único argumento, que é um vetor, onde a segunda posição do vetor é o y:
using Optim
f(x) = x[1]^2+3*x[1]*x[2]
O comando do Optim é optimize
. Ela exige a função e um chute inicial:
sol = optimize(f,zeros(2))
Optim.minimizer(sol)
O Optim vem com diferentes algoritmos de solução, e podemos definir qual usar. Por padrão, ele usa o Nelder-Mead, queé o mesmo padrão que o R usa. Vamos testar o LBFGS:
sol2 = optimize(f,zeros(2),LBFGS())
Optim.minimizer(sol2)
Julia Markdown
O Julia já tem pacotes que permitem escrever um documento markdown com chuncks em Julia. Se você já usou o RMarkdown, a ideia é igual, mas ao invés de se usar ```{r}, usamos ```{julia}. O pacote que permite compilar o documento é o Weave. O documento deve ser salvo com a extensão .jmd. Compilar ele é uma simples questão de weave("caminho do documento")
. O pacote dá várias opções de como compilar, e você deve olhar a documentação dele para ver a mais adequada.
Conclusão
O Julia é bastante versátil, eficiente e com uma comunidade ativa e crescente. Ele também é de graça, e o Thomas Sargent mantém um site com lições de uma tonelada de coisas de economia moderna para o Julia. Esta rápida introdução deve permitir você fazer coisas básicas no Julia. Muitos dos pacotes tem documentação,que apesar de não ser tão acessível quanto a do R (que vai direto pelo RStudio), ela é de grande ajuda.