Julia inclui muitos pacotes que podem ser usados em pesquisa operacional e otimização em geral. Este artigo serve como uma breve introdução aos diferentes pacotes disponíveis no ecossistema da Julia. Vou me concentrar em dois pacotes que são trampolins em trabalhos futuros: DataFrames.jl e PyPlots. DataFrames.jl fornece um conjunto de ferramentas para trabalhar com dados tabulares semelhantes aos Pandas em Python. O módulo PyPlots fornece uma interface Julia para a biblioteca de plotagem Matplotlib do Python. Embora o PyPlots seja uma distribuição de Python e matplotlib, Julia pode instalar uma distribuição privada que não pode ser acessada fora do ambiente de Julia.
Adicionando os pacotes necessários
Abra uma nova janela de terminal e execute Julia. Use o código abaixo para adicionar os pacotes necessários para este artigo.
julia> using Pkg
julia> Pkg.add("DataFrames")
julia> Pkg.add("CSV")
julia> Pkg.add("Arrow")
Abra uma nova janela de terminal e execute Julia. Inicialize a variável de ambiente PYTHON:
julia> ENV["PYTHON"] = ""
""
Instale o PyPlot:
julia> using Pkg
julia> Pkg.add("PyPlot")
Depois de adicionar todos os pacotes necessários usando Julia REPL, o código a seguir é usado para importar os pacotes no editor Jupyter (ou seja, Jupyter Notebook).
using DataFrames
using CSV
using Arrow
using PyPlot
Usando DataFrames em Julia
- Documentação de DataFrames
- Repositório do DataFrame GitHub
- Curso DataFrame na academia Julia
DataFrames requer alguns pacotes no backend como CSV e Arrow para completar suas operações corretamente. Assim, esses pacotes foram adicionados inicialmente na seção anterior.
Usando PyPlots em Julia
- Documentação do Matplotlib
- Repositório do GitHub do Matplotlib
- Tutorial Matplotlib no GeeksforGeeks
Como o PyPlots é uma interface para matplotlib em Julia, toda a documentação está disponível na página principal do matplotlib.
Mostra Covid-19 usando Julia
O primeiro caso de covid-19 foi detectado no dia 17 de novembro de 2019. Embora tenham passado dois anos desde o início da pandemia, o vírus ainda persiste e os casos estão aumentando exponencialmente. Assim, a análise de dados é importante para entender o crescimento de casos ao redor do mundo. Usarei um arquivo .csv contendo dados sobre os casos no país X. O arquivo está disponível em um repositório público na minha página do GitHub, para que eu possa copiá-lo para uma planilha do Excel e movê-lo para o arquivo de diretório onde está o notebook Jupyter está localizado. Além disso, posso importar os dados da Web usando o Excel e anexar o link do formato bruto do banco de dados no GitHub. Em ambos os casos, salvar o arquivo como time.csv é necessário para se adequar ao código em estágios posteriores.
Aqui estou mostrando o banco de dados, no formato csv, que abri via excel na minha área de trabalho.
Vou ler o arquivo csv, no notebook Jupyter, usando o bloco de código abaixo:
df = CSV.File("time.csv") |> DataFrame;
# lendo o arquivo csv usando o pacote CSV e alterando-o para um DataFrame usando a operação de seta|>
df[1:5,:] # saída das primeiras cinco linhas
A importação de arquivos de dados é mais fácil usando DataFrames. Algumas das operações presentes nos blocos de código abaixo são explicadas em uma postagem anterior apresentando Julia. A plotagem é outra ferramenta importante para entender os dados e visualizá-los melhor. O Matplotlib é apresentado antes no blog, mas em Python.
O bloco de código abaixo cria um gráfico de barras que mostra o número de testes cumulativos e casos negativos cumulativos em um período de seis dias do DataFrame, df, importado acima.
y1 = df[20:25,2];
y2 = df[20:25,3];
x = df[20:25,1];
fig = plt.figure()
ax = plt.subplot()
ax.bar(x, y1, label="cumulative tests",color="black")
ax.bar(x, y2, label="cumulative negative cases",color="grey")
ax.set_title("Covid-19 data in Country X",fontsize=18,color="green")
ax.set_xlabel("date",fontsize=14,color="red")
ax.set_ylabel("number of cases",fontsize=14,color="red")
ax.legend(fontsize=10)
ax.grid(b=1,color="blue",alpha=0.1)
plt.show()
O gráfico de barras acima pode ser melhorado alocando uma barra para cada categoria. Isso é feito usando o bloco de código abaixo.
barWidth = 0.25
br1 = 1:1:length(x)
br2 = [x + barWidth for x in br1]
fig = plt.figure()
ax = plt.subplot()
ax.bar(br1, y1,color="r", width=barWidth, edgecolor ="grey",label="cumulative tests")
ax.bar(br2, y2,color ="g",width=barWidth, edgecolor ="grey", label="cumulative negative cases")
ax.set_title("Covid-19 data in Country X",fontsize=18,color="green")
ax.set_xlabel("date", fontweight ="bold",fontsize=14)
ax.set_ylabel("number of cases", fontweight ="bold",fontsize=14)
ax.legend(fontsize=10)
ax.grid(b=1,color="blue",alpha=0.1)
plt.xticks([r + barWidth for r in br1], ["2/8/2020", "2/9/2020", "2/10/2020", "2/11/2020", "2/12/2020","2/13/2020"])
plt.legend()
plt.show()
Compreender o crescimento exponencial associado ao covid19 requer traçar todo o conjunto de dados que está ao longo de 44 dias. Portanto, o próximo bloco de código visa mostrar os casos de covid do dataset completo.
days = 1:1:44
days_array = collect(days)
confirmed_cases = df[:,4]
fig = plt.figure(figsize=(10,10))
ax = plt.subplot()
ax.bar(days_array,confirmed_cases , color ="blue",width = 0.4)
ax.set_title("A bar chart showing cumulative confirmed covid-19 cases in country X",fontsize=22,color="darkgreen")
ax.set_xlabel("day number",fontsize=16,color="darkgreen")
ax.set_ylabel("number of cases",fontsize=16,color="darkgreen")
ax.xaxis.set_ticks_position("none")
ax.yaxis.set_ticks_position("none")
ax.xaxis.set_tick_params(pad = 5)
ax.yaxis.set_tick_params(pad = 10)
ax.grid(b = 1, color ="grey",linestyle ="-.", linewidth = 0.5,alpha = 0.2)
fig.text(0.3, 0.8, "SCDA-JaafarBallout", fontsize = 10,color ="grey", ha ="right", va ="bottom",alpha = 0.6)
plt.show()
Embora os gráficos de barras sejam poderosos no nosso caso, ainda é bom observar a curva exponencial. Para isso, um bloco de código é apresentado abaixo para traçar a curva de crescimento dos casos confirmados.
fig = plt.figure(figsize=(10,10))
ax = plt.subplot()
ax.plot(days_array,confirmed_cases , color ="blue",marker="o",markersize=6, linewidth=2, linestyle ="--")
ax.set_title("A bar chart showing cumulative confirmed covid-19 cases in country X",fontsize=22,color="darkgreen")
ax.set_xlabel("day number",fontsize=16,color="darkgreen")
ax.set_ylabel("number of cases",fontsize=16,color="darkgreen")
ax.grid(b = 1, color ="grey",linestyle ="-.", linewidth = 0.5,alpha = 0.2)
fig.text(0.3, 0.8, "SCDA-JaafarBallout", fontsize = 10,color ="grey", ha ="right", va ="bottom",alpha = 0.6)
plt.xticks(size=16, color ="black")
plt.yticks(size=16, color ="black")
plt.show()
Realizando um meme! (com Júlia)
Recentemente, esse meme se tornou viral. Portanto, é bom descobrir as funções ausentes plotando.
fig, axs = plt.subplots(2, 2);
fig.tight_layout(pad=4);
x1 = range(-10, 10, length=1000);
y1 = range(1, 1,length =1000);
axs[1].plot(x1, y1, color="blue", linewidth=2.0, linestyle="-");
axs[1].set_xlabel("x1");
axs[1].set_ylabel("y1");
axs[1].set_title("Constant");
x2 = range(-10, 10, length=1000);
y2 = x2.^3;
axs[2].plot(x2, y2, color="blue", linewidth=2.0, linestyle="-");
axs[2].set_xlabel("x2");
axs[2].set_ylabel("y2");
axs[2].set_title("Y = X^(3)");
x3 = range(-10, 10, length=1000);
y3 = x2.^2;
axs[3].plot(x3, y3, color="blue", linewidth=2.0, linestyle="-");
axs[3].set_xlabel("x3");
axs[3].set_ylabel("y3");
axs[3].set_title("Y = X^(2)");
x4 = range(-5, 5, length=1000);
y4 = cos.(x4);
axs[4].plot(x4, y4, color="blue", linewidth=2.0, linestyle="-");
axs[4].set_xlabel("x4");
axs[4].set_ylabel("y4");
axs[4].set_title("Y = cos(X)");
Fazer gráficos de redes manualmente ou com software tradicional parece exaustivo. Em posts futuros, demonstrarei como desenhar redes complicadas usando Julia e suas dependências. Em seguida, resolverei o problema de rede usando o pacote JuMP.
Leave a Reply