Julia para Otimização - Exemplo 12

« voltar para “Julia para Otimização”

Objetivo: tabelar resultados usando DataFrames.

Vimos no Exemplo 9 como escrever uma tabela de resultados em arquivo TXT. Essa forma rústica assemelha-se à estratégia comumente adotada em programas C ou Fortran. Porém, o Julia oferece um recurso mais inteligente para lidar com dados tabelados: o objeto DataFrame. Este recurso está presente no pacote DataFrames.jl, e é muito parecido com o pandas do Python. Consulte a página do pacote.

Basicamente, um dataframe é uma tabela com recursos de adição e exclusão de linhas e colunas, ordenamento e filtragem de linhas. Além disso, é possível exportar um dataframe para arquivos CSV ou mesmo salvar em arquivos binários. Veja o Exemplo 11 para detalhes.

Criando o dataframe vazio chamado resultados, com as colunas Problema, iter e f:

julia> using DataFrames
julia> resultados = DataFrame(Problema=[],iter=[],f=[])

O comando push! (não esqueça da exclamação) adiciona linhas:

julia> push!(resultados, ("prob1", 13, 1.0e-5) )
julia> texto = "prob2"
julia> it = 213
julia> f = 9.5e+6
julia> push!(resultados, (texto, it, f) )
julia> push!(resultados, ("outra linha", it*2, f/2) )

Note que os dados têm tipos diferentes (texto, inteiro, float). Um dataframe aceita qualquer tipo de dado texto ou numérico.

Ao exibir o dataframe resultados, você verá algo como

julia> resultados
3×3 DataFrame
│ Row │ Problema    │ iter │ f      │
│     │ Any         │ Any  │ Any    │
├─────┼─────────────┼──────┼────────┤
│ 1   │ prob1       │ 13   │ 1.0e-5 │
│ 2   │ prob2       │ 213  │ 9.5e6  │
│ 3   │ outra linha │ 426  │ 4.75e6 │

Os comandos head(resultados,N) (ou first) e tail(resultados,N) (ou last) exibem os N primeiros e últimos registros, respectivamente.

Você pode deletar linhas. O código a seguir deleta a segunda linha de resultados:

julia> delete!(resultados, 2)

O trecho a seguir organiza resultados pela 3 coluna em ordem crescente, gravando o resultado no próprio dataframe:

julia> sort!(resultados, 3)

Você pode ainda exibir um dataframe resultante de uma busca. O trecho a seguir exibe o dataframe cujas linhas são aquelas de resultados com coluna iter menor que 400:

julia> filter(row -> row[:iter] < 400, resultados)

O mesmo efeito é obtido com resultados[(resultados["iter"] .< 400),:] ou resultados[(resultados.iter .< 400),:].

Obs: a exclamação significa que o resultado do comando é gravado no próprio dataframe. Os comandos push! e delete! necessitam da exclamação pois gravam no dataframe. Já nos comandos sort e filter, a exclamação é opcional. Se não estiver presente, o resultado é mostrado em tela, mas o dataframe original não é modificado. Isso é útil quando você quer copiar um dataframe mantendo o original.

Finalmente, você pode gravar o dataframe em arquivo CSV:

julia> using CSV
julia> CSV.write("resultados.csv", resultados)

Exercício

No Exemplo 9, refaça o arquivo testesSIF.jl eliminando todas as saídas tabeladas em TXT, gravando-as em um DataFrame. Grave o resultado em arquivos CSV e binário.