Usando DataFrames e pyplot em Julia

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

Deixe um comentário

O seu endereço de e-mail não será publicado.

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

Close

Meta