library(reticulate) #abrindo o pacote reticulate
Desafio 2 (python)
Quarto
virtualenv_create("r-reticulate", python = "C:/Program Files/Python312/python.exe") #criando um ambiente virtual pra usar python
virtualenv: r-reticulate
use_virtualenv("r-reticulate", required = TRUE) #manda usar o ambiente virtual criado
py_config() # mostra as informações de configuração do Python que o reticulate está usando
python: \\smb/ra237599/Documentos/.virtualenvs/r-reticulate/Scripts/python.exe
libpython: C:/Program Files/Python312/python312.dll
pythonhome: \\smb/ra237599/Documentos/.virtualenvs/r-reticulate
version: 3.12.0 (tags/v3.12.0:0fb18b0, Oct 2 2023, 13:03:39) [MSC v.1935 64 bit (AMD64)]
Architecture: 64bit
numpy: \\smb/ra237599/Documentos/.virtualenvs/r-reticulate/Lib/site-packages/numpy
numpy_version: 2.3.2
NOTE: Python version was forced by use_python() function
py_install("pandas", envname = "r-reticulate") #instalando o pandas
Using virtual environment "r-reticulate" ...
+ //smb/ra237599/Documentos/.virtualenvs/r-reticulate/Scripts/python.exe -m pip install --upgrade --no-user pandas
py_install("numpy", envname = "r-reticulate") #instalando o numpy
Using virtual environment "r-reticulate" ...
+ //smb/ra237599/Documentos/.virtualenvs/r-reticulate/Scripts/python.exe -m pip install --upgrade --no-user numpy
#ai sempre rodar library(reticulate) use_virtualenv(“r-reticulate”, required = TRUE)
#1 estatisticas suficientes sao #a) numero total de voos (pada cada dia/mes/cia) #b) numero de voos (dentre os apontados acima) que tem a coluna arrival_delay > 10
#2
import pandas as pd # importa a biblioteca pandas para manipulação de dados
def getStats(input_df, pos=None): # define a função getStats que recebe um DataFrame de entrada (input_df)
# o argumento pos não é usado aqui (pode servir em leitura em chunks)
# Filtrar companhias e remover NA
= input_df[ # cria um novo DataFrame filtrado
df_filtered "AIRLINE"].isin(["AA", "DL", "UA", "US"])) & # mantém apenas as companhias desejadas
(input_df["ARRIVAL_DELAY"].notna()) # remove linhas onde ARRIVAL_DELAY é NA
(input_df[
]
# Agrupar e resumir
= ( # cria um novo DataFrame resumido
result
df_filtered"AIRLINE", "DAY", "MONTH"], as_index=False) # agrupa por companhia, dia e mês
.groupby([# aplica agregações nos grupos
.agg( =("ARRIVAL_DELAY", "size"), # conta quantos voos existem em cada grupo (número de linhas)
n=("ARRIVAL_DELAY", lambda x: (x > 10).sum()) # conta quantos atrasos > 10 minutos em cada grupo
atrasos
)
)
return result # retorna o DataFrame com estatísticas por companhia/dia/mês
#3
import pandas as pd # importa a biblioteca pandas, usada para leitura e manipulação de dados
import time # importa a biblioteca time, usada para medir o tempo de execução
# Função callback equivalente ao gesStats (exemplo genérico)
def gesStats(chunk): # define a função gesStats que recebe um pedaço (chunk) do DataFrame
# aqui você faz o processamento do pedaço do dataframe como contar os valores de AIRLINES
print(chunk['AIRLINE'].value_counts().head())
# conta quantas vezes cada companhia aparece no pedaço (chunk) e mostra apenas os 5 primeiros
# Cronometrar
= time.time() # registra o tempo inicial (antes da leitura e processamento)
ini
# Leitura em chunks de 100 mil registros
= 10**5 # define o tamanho de cada pedaço a ser lido do CSV (100.000 linhas)
chunksize for chunk in pd.read_csv("flights.csv.zip", # lê o arquivo comprimido em ZIP
="zip", # especifica que o arquivo está compactado em ZIP
compression=['AIRLINE', 'DAY', 'MONTH', 'ARRIVAL_DELAY'],
usecols# lê apenas as colunas necessárias do arquivo
=chunksize):
chunksize# lê o arquivo em blocos (chunks) de 100.000 linhas por vez
# chama a função gesStats para processar cada pedaço lido gesStats(chunk)
AIRLINE
WN 21160
DL 13156
EV 10810
OO 10475
AA 9449
Name: count, dtype: int64
AIRLINE
WN 21163
DL 13764
EV 10789
OO 10230
AA 9351
Name: count, dtype: int64
AIRLINE
WN 21368
DL 13751
EV 10479
OO 10194
AA 9390
Name: count, dtype: int64
AIRLINE
WN 21177
DL 14124
EV 10529
OO 10155
AA 9332
Name: count, dtype: int64
AIRLINE
WN 21385
DL 13760
EV 10358
OO 10130
AA 9428
Name: count, dtype: int64
AIRLINE
WN 21290
DL 14088
EV 10417
OO 10198
AA 9333
Name: count, dtype: int64
AIRLINE
WN 21206
DL 13845
EV 10420
OO 10116
AA 9395
Name: count, dtype: int64
AIRLINE
WN 20687
DL 14480
EV 10760
OO 10376
AA 9191
Name: count, dtype: int64
AIRLINE
WN 20821
DL 14461
EV 10587
OO 10351
AA 9125
Name: count, dtype: int64
AIRLINE
WN 20678
DL 14995
EV 10840
OO 10033
AA 9019
Name: count, dtype: int64
AIRLINE
WN 21998
DL 14626
EV 10856
OO 9850
AA 9090
Name: count, dtype: int64
AIRLINE
WN 21928
DL 14629
EV 10724
OO 9897
AA 9144
Name: count, dtype: int64
AIRLINE
WN 21857
DL 14661
EV 10687
OO 9926
AA 9127
Name: count, dtype: int64
AIRLINE
WN 21887
DL 14634
EV 10689
OO 9952
AA 9173
Name: count, dtype: int64
AIRLINE
WN 22327
DL 14190
EV 10308
OO 9886
AA 9421
Name: count, dtype: int64
AIRLINE
WN 21801
DL 14980
OO 10111
EV 10036
AA 9328
Name: count, dtype: int64
AIRLINE
WN 21776
DL 15013
OO 10242
EV 10119
AA 9208
Name: count, dtype: int64
AIRLINE
WN 22001
DL 15038
OO 10285
EV 10205
AA 9018
Name: count, dtype: int64
AIRLINE
WN 21796
DL 15180
OO 10271
EV 10130
AA 9154
Name: count, dtype: int64
AIRLINE
WN 21818
DL 15092
OO 10203
EV 9948
AA 9115
Name: count, dtype: int64
AIRLINE
WN 21964
DL 14841
EV 9973
OO 9904
UA 9075
Name: count, dtype: int64
AIRLINE
WN 21619
DL 15167
EV 10034
OO 9976
UA 9084
Name: count, dtype: int64
AIRLINE
WN 21335
DL 14920
OO 10045
EV 9601
AA 9168
Name: count, dtype: int64
AIRLINE
WN 21593
DL 15250
OO 10024
EV 9979
UA 8980
Name: count, dtype: int64
AIRLINE
WN 21439
DL 15428
OO 10043
EV 9861
UA 9092
Name: count, dtype: int64
AIRLINE
WN 21979
DL 15454
OO 10020
EV 9789
UA 9204
Name: count, dtype: int64
AIRLINE
WN 21720
DL 15533
OO 10011
EV 9745
UA 9233
Name: count, dtype: int64
AIRLINE
WN 21795
DL 15373
OO 9974
EV 9668
UA 9082
Name: count, dtype: int64
AIRLINE
WN 22085
DL 14914
OO 9858
AA 9615
EV 9508
Name: count, dtype: int64
AIRLINE
WN 21942
AA 15835
DL 15122
OO 9959
EV 9399
Name: count, dtype: int64
AIRLINE
WN 21758
AA 15582
DL 15549
OO 10142
EV 9835
Name: count, dtype: int64
AIRLINE
WN 21805
AA 15612
DL 15508
OO 10178
EV 9743
Name: count, dtype: int64
AIRLINE
WN 21814
DL 15654
AA 15528
OO 10110
EV 9789
Name: count, dtype: int64
AIRLINE
WN 21817
AA 15655
DL 15641
OO 10117
EV 9624
Name: count, dtype: int64
AIRLINE
WN 21752
AA 15555
DL 15538
OO 10257
EV 9580
Name: count, dtype: int64
AIRLINE
WN 21204
DL 15720
AA 15710
OO 10333
EV 9563
Name: count, dtype: int64
AIRLINE
WN 20568
DL 15834
AA 15800
OO 10402
EV 9689
Name: count, dtype: int64
AIRLINE
WN 21192
DL 16127
AA 15478
OO 10390
EV 9371
Name: count, dtype: int64
AIRLINE
WN 21252
DL 16019
AA 15567
OO 10286
EV 9422
Name: count, dtype: int64
AIRLINE
WN 21269
AA 15729
DL 15624
OO 10321
EV 9389
Name: count, dtype: int64
AIRLINE
WN 22101
AA 16325
DL 14689
OO 9992
EV 8977
Name: count, dtype: int64
AIRLINE
WN 21469
DL 15888
AA 15575
OO 10361
EV 9627
Name: count, dtype: int64
AIRLINE
WN 21798
DL 15776
AA 15673
OO 10272
EV 9540
Name: count, dtype: int64
AIRLINE
WN 21500
DL 15648
AA 15507
OO 10275
EV 9581
Name: count, dtype: int64
AIRLINE
WN 21446
AA 15727
DL 15702
OO 10033
UA 9463
Name: count, dtype: int64
AIRLINE
WN 21386
AA 15846
DL 15671
OO 9986
EV 9493
Name: count, dtype: int64
AIRLINE
WN 21401
AA 15807
DL 15684
OO 10088
EV 9455
Name: count, dtype: int64
AIRLINE
WN 21446
AA 15960
DL 15685
OO 10061
UA 9371
Name: count, dtype: int64
AIRLINE
WN 21795
AA 16144
DL 15048
OO 10095
UA 9382
Name: count, dtype: int64
AIRLINE
WN 22177
AA 15905
DL 15524
OO 10112
EV 9157
Name: count, dtype: int64
AIRLINE
WN 21884
AA 15871
DL 15763
OO 10182
EV 9192
Name: count, dtype: int64
AIRLINE
WN 22124
AA 15749
DL 15706
OO 10142
EV 9295
Name: count, dtype: int64
AIRLINE
WN 22950
AA 15701
DL 14639
OO 9874
UA 8800
Name: count, dtype: int64
AIRLINE
WN 22408
AA 15655
DL 15459
OO 10057
UA 9428
Name: count, dtype: int64
AIRLINE
WN 22653
AA 15646
DL 15285
OO 9751
UA 9139
Name: count, dtype: int64
AIRLINE
WN 22594
AA 15632
DL 15232
OO 9895
EV 9228
Name: count, dtype: int64
AIRLINE
WN 21866
AA 16283
DL 14460
OO 10148
EV 9472
Name: count, dtype: int64
AIRLINE
WN 22704
AA 16328
DL 13772
OO 9942
EV 9076
Name: count, dtype: int64
AIRLINE
WN 4127
AA 3226
DL 2567
OO 1856
UA 1688
Name: count, dtype: int64
= time.time() # registra o tempo final (após todo o processamento)
fim print(f"Importado com 100 mil registros por vez em {fim - ini:.2f} segundos.")
Importado com 100 mil registros por vez em 10.18 segundos.
# mostra quanto tempo total levou para ler e processar os dados em pedaços
#4
import pandas as pd # importa a biblioteca pandas para manipulação de dados
import time # importa a biblioteca time para medir tempo de execução
def computeStats(df): # define a função computeStats que recebe um DataFrame (df)
# cria colunas auxiliares (igual no R: atrasos/n)
= df.copy() # faz uma cópia do DataFrame para não modificar o original
df "n"] = 1 # cria uma coluna 'n' com valor 1 (para contar linhas)
df["atrasos"] = (df["ARRIVAL_DELAY"] > 0).astype(int) # cria coluna binária (1 se atraso > 0, senão 0)
df[
= ( # agrupa os dados para calcular estatísticas
grouped "AIRLINE", "DAY", "MONTH"], as_index=False) # agrupa por companhia, dia e mês
df.groupby(["atrasos": "sum", "n": "sum"}) # soma total de atrasos e total de voos
.agg({
)
"Perc"] = grouped["atrasos"] / grouped["n"] # calcula a porcentagem de atrasos
grouped[
"DATA"] = pd.to_datetime( # cria coluna de datas reais
grouped[dict(year=2015, month=grouped["MONTH"], day=grouped["DAY"]) # monta a data a partir de ano fixo + mês + dia
)
return grouped[["AIRLINE", "DATA", "Perc"]] # retorna apenas as colunas relevantes
# Cronometrar
= time.time() # guarda o tempo inicial para medir duração da execução
ini
= 10**5 # define o tamanho de cada pedaço (100.000 linhas) a ser lido do CSV
chunksize = [] # inicializa lista vazia para armazenar os resultados dos chunks
results
for chunk in pd.read_csv( # lê o CSV compactado em pedaços (chunks)
"flights.csv.zip", # arquivo de dados (compactado em zip)
="zip", # informa que o arquivo está zipado
compression=["AIRLINE", "DAY", "MONTH", "ARRIVAL_DELAY"], # lê apenas colunas necessárias
usecols=chunksize # lê em pedaços de 100.000 linhas
chunksize
):= computeStats(chunk) # aplica a função computeStats a cada pedaço lido
stats # armazena o resultado na lista de resultados
results.append(stats)
if results: # só concatena se tiver algum resultado
= pd.concat(results, ignore_index=True) # junta todos os pedaços em um único DataFrame
in5 else:
= pd.DataFrame(columns=["AIRLINE", "DATA", "Perc"]) # se não tiver dados, cria DataFrame vazio
in5
= time.time() # guarda o tempo final da execução
fim print(f"Importado e processado em chunks em {fim - ini:.2f} segundos.") # mostra quanto tempo levou
Importado e processado em chunks em 9.13 segundos.
print(in5.head()) # exibe as primeiras linhas do DataFrame final
AIRLINE DATA Perc
0 AA 2015-01-01 0.496945
1 AA 2015-01-02 0.589644
2 AA 2015-01-03 0.687543
3 AA 2015-01-04 0.737940
4 AA 2015-01-05 0.632507
::py_install(c("matplotlib", "calplot")) #istalando os pacotes de python (alem do pandas) que vamos usar a seguir reticulate
Using virtual environment "\\smb/ra237599/Documentos/.virtualenvs/r-reticulate" ...
+ "\\smb/ra237599/Documentos/.virtualenvs/r-reticulate/Scripts/python.exe" -m pip install --upgrade --no-user matplotlib calplot
#5
import pandas as pd # Biblioteca para manipulação de dados (DataFrames e séries)
import matplotlib.pyplot as plt # Biblioteca para criar gráficos
import calplot # Biblioteca para criar gráficos de calendário
from matplotlib.colors import LinearSegmentedColormap # Permite criar colormaps (gradientes de cores) personalizados
# Colormap idêntico ao do R, do azul para o vermelho
= LinearSegmentedColormap.from_list("custom", ["#4575b4", "#d73027"])
cmap
# Função para criar gráfico de calendário de atrasos por companhia aérea
def baseCalendario(stats, cia, titulo):
# Filtra apenas as linhas do DataFrame da companhia desejada
= stats[stats["AIRLINE"] == cia]
input_df
# Cria uma série com DATA no índice e Perc como valores
= pd.Series(input_df["Perc"].values, index=input_df["DATA"])
serie
# Cria o gráfico de calendário usando calplot
= calplot.calplot(
fig, ax # série de dados com datas no índice
serie, =cmap, # aplica o colormap azul-vermelho
cmap=True, # adiciona barra de cores
colorbar=titulo, # adiciona título ao gráfico
suptitle=0.5, # define a espessura das linhas entre os dias
linewidth=(10, 3) # define o tamanho do gráfico (largura x altura)
figsize
)
# Ajusta título do gráfico para fonte maior e negrito
=14, weight="bold")
plt.suptitle(titulo, fontsize
# Exibe o gráfico na tela
plt.show()
# Gera gráficos de calendário para cada companhia aérea
"AA", "Percentual de Atraso - AA") # American Airlines baseCalendario(in5,
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
"DL", "Percentual de Atraso - DL") # Delta Airlines baseCalendario(in5,
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
"UA", "Percentual de Atraso - UA") # United Airlines baseCalendario(in5,
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
"US", "Percentual de Atraso - US") # US Airways baseCalendario(in5,
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.
findfont: Font family 'Helvetica' not found.