Desafio 2 (python)

Quarto

library(reticulate) #abrindo o pacote reticulate
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
    df_filtered = input_df[                       # cria um novo DataFrame filtrado
        (input_df["AIRLINE"].isin(["AA", "DL", "UA", "US"])) &  # mantém apenas as companhias desejadas
        (input_df["ARRIVAL_DELAY"].notna())                     # remove linhas onde ARRIVAL_DELAY é NA
    ]
    
    # Agrupar e resumir
    result = (                                      # cria um novo DataFrame resumido
        df_filtered
        .groupby(["AIRLINE", "DAY", "MONTH"], as_index=False)   # agrupa por companhia, dia e mês
        .agg(                                       # aplica agregações nos grupos
            n=("ARRIVAL_DELAY", "size"),            # conta quantos voos existem em cada grupo (número de linhas)
            atrasos=("ARRIVAL_DELAY", lambda x: (x > 10).sum()) # conta quantos atrasos > 10 minutos em cada grupo
        )
    )
    
    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
ini = time.time()          # registra o tempo inicial (antes da leitura e processamento)

# Leitura em chunks de 100 mil registros
chunksize = 10**5          # define o tamanho de cada pedaço a ser lido do CSV (100.000 linhas)
for chunk in pd.read_csv("flights.csv.zip",   # lê o arquivo comprimido em ZIP
                         compression="zip",   # especifica que o arquivo está compactado em ZIP
                         usecols=['AIRLINE', 'DAY', 'MONTH', 'ARRIVAL_DELAY'],  
                         # lê apenas as colunas necessárias do arquivo
                         chunksize=chunksize):  
                         # lê o arquivo em blocos (chunks) de 100.000 linhas por vez
    gesStats(chunk)        # chama a função gesStats para processar cada pedaço lido
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
fim = time.time()          # registra o tempo final (após todo o processamento)
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 = 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)

    grouped = (             # agrupa os dados para calcular estatísticas
        df.groupby(["AIRLINE", "DAY", "MONTH"], as_index=False)  # agrupa por companhia, dia e mês
          .agg({"atrasos": "sum", "n": "sum"})                   # soma total de atrasos e total de voos
    )

    grouped["Perc"] = grouped["atrasos"] / grouped["n"]   # calcula a porcentagem de atrasos

    grouped["DATA"] = pd.to_datetime(                     # cria coluna de datas reais
        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
ini = time.time()       # guarda o tempo inicial para medir duração da execução

chunksize = 10**5       # define o tamanho de cada pedaço (100.000 linhas) a ser lido do CSV
results = []            # inicializa lista vazia para armazenar os resultados dos chunks

for chunk in pd.read_csv(                     # lê o CSV compactado em pedaços (chunks)
    "flights.csv.zip",                        # arquivo de dados (compactado em zip)
    compression="zip",                        # informa que o arquivo está zipado
    usecols=["AIRLINE", "DAY", "MONTH", "ARRIVAL_DELAY"],  # lê apenas colunas necessárias
    chunksize=chunksize                       # lê em pedaços de 100.000 linhas
):
    stats = computeStats(chunk)   # aplica a função computeStats a cada pedaço lido
    results.append(stats)         # armazena o resultado na lista de resultados

if results:  # só concatena se tiver algum resultado
    in5 = pd.concat(results, ignore_index=True)   # junta todos os pedaços em um único DataFrame
else:
    in5 = pd.DataFrame(columns=["AIRLINE", "DATA", "Perc"])  # se não tiver dados, cria DataFrame vazio

fim = time.time()    # guarda o tempo final da execução
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
reticulate::py_install(c("matplotlib", "calplot")) #istalando os pacotes de python (alem do pandas) que vamos usar a seguir
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
cmap = LinearSegmentedColormap.from_list("custom", ["#4575b4", "#d73027"])

# 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
    input_df = stats[stats["AIRLINE"] == cia]

    # Cria uma série com DATA no índice e Perc como valores
    serie = pd.Series(input_df["Perc"].values, index=input_df["DATA"])

    # Cria o gráfico de calendário usando calplot
    fig, ax = calplot.calplot(
        serie,              # série de dados com datas no índice
        cmap=cmap,          # aplica o colormap azul-vermelho
        colorbar=True,      # adiciona barra de cores
        suptitle=titulo,    # adiciona título ao gráfico
        linewidth=0.5,      # define a espessura das linhas entre os dias
        figsize=(10, 3)     # define o tamanho do gráfico (largura x altura)
    )

    # Ajusta título do gráfico para fonte maior e negrito
    plt.suptitle(titulo, fontsize=14, weight="bold")

    # Exibe o gráfico na tela
    plt.show()

# Gera gráficos de calendário para cada companhia aérea
baseCalendario(in5, "AA", "Percentual de Atraso - AA")  # American Airlines
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.

baseCalendario(in5, "DL", "Percentual de Atraso - DL")  # Delta Airlines
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.

baseCalendario(in5, "UA", "Percentual de Atraso - UA")  # United Airlines
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.

baseCalendario(in5, "US", "Percentual de Atraso - US")  # US Airways
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.