Módulo 3: Leitura e Escrita em Arquivos + Combinando Tabelas


Tutorial

Imports para a Aula


In [ ]:
import os
import pandas as pd

Operações com Arquivos

Criando os Arquivos

Criando Estrutura de Pastas


In [ ]:
try:
    os.makedirs(os.path.join("data", "tutorial"))
    print("Pasta criada.")
except OSError:
    print("Pasta já existe!")

Dataset orders.csv


In [ ]:
""" nome do arquivo """
file_name = os.path.join("data", "tutorial", "orders.csv")

In [ ]:
""" criação do DataFrame """
df = pd.DataFrame(
    columns=["user_id", "store_id", "product_id"],
    data=[
        [1, 1, 1],
        [1, 2, 6],
        [3, 2, 7],
        [2, 2, 3],
        [3, 2, 3],
        [4, 3, 2],
        [2, 3, 1],
        [1, 1, 3],
        [1, 3, 3],
        [5, 1, 4],
        [5, 1, 1],
        [3, 2, 1],
        [1, 2, 1],
        [2, 2, 2],
        [3, 2, 2],
        [4, 2, 3],
        [4, 1, 5],
        [5, 1, 6],
        [3, 1, 6],
        [2, 3, 7],
    ]
)
df

In [ ]:
""" salvando o DataFrame """
df.to_csv(file_name, sep=",")

Dataset stores.csv


In [ ]:
""" nome do arquivo """
file_name = os.path.join("data", "tutorial", "stores.csv")

In [ ]:
""" criação do DataFrame """
df = pd.DataFrame(
    columns=["store_id", "store_name"],
    data=[
        [1, "Pão de Açúcar"],
        [2, "Dia"],
        [3, "Extra"],
    ]
).set_index("store_id")
df

In [ ]:
""" salvando o DataFrame """
df.to_csv(
    file_name,          # nome do arquivo
    sep="\t",           # separador TAB
    encoding="utf-8"    # encoding: garante formato correto de strings no arquivo
)

Dataset product.csv


In [ ]:
""" nome do arquivo """
file_name = os.path.join("data", "tutorial", "products.csv")

In [ ]:
""" criação do DataFrame """
df = pd.DataFrame(
    columns=["product_id", "product_name"],
    data=[
        [1, "Leite"],
        [2, "Ovos"],
        [3, "Arroz"],
        [4, "Feijão"],
        [5, "Carne"],
        [6, "Frango"],
        [7, "Peixe"]
    ]
).set_index("product_id")  # set_index: usa a coluna especificada como índice
df

In [ ]:
""" salvando o DataFrame """
df.to_csv(
    file_name,          # nome do arquivo
    sep=";",            # separador ;
    encoding="utf-8"    # encoding: garante formato correto de strings no arquivo
)

Leitura de Arquivos

Parâmetros default


In [ ]:
file_name = os.path.join("data", "tutorial", "orders.csv")

In [ ]:
pd.read_csv(file_name)

Parâmetro index_col

  • define a coluna que contém o index
  • valores esperados: inteiro ou lista de inteiros
  • valor default: None

In [ ]:
""" definindo index_col para a primeira coluna """
pd.read_csv(file_name, index_col=0)

In [ ]:
""" definindo index_col para a segunda coluna """
pd.read_csv(file_name, index_col=1)

Parâmetro sep

  • define o separador de colunas.
  • valores esperados: caractere
  • valor default: ","

In [ ]:
""" Modificando o parâmetro sep"""
pd.read_csv(file_name, sep=";")

In [ ]:
""" Usando explicitamente o valor default de sep """
pd.read_csv(file_name, sep=",")

Parâmetro header

  • define a linha que contém as colunas
  • valores esperados: inteiro ou lista de inteiros ou None
  • valor default: 0

In [ ]:
""" Usando header = None """
pd.read_csv(file_name, header=None)

In [ ]:
""" Usando outra linha como header; nota-se que as linhas acima são eliminadas """
pd.read_csv(file_name, header=1)

In [ ]:
""" Usando múltiplass linhas como header """
pd.read_csv(file_name, header=[0,1,2])

Parâmetro usecols

  • define quais colunas serão lidas, permitindo carregar apenas os dados desejados
  • valores esperados: lista de nomes ou None
  • valor default: None

In [ ]:
""" lendo apenas duas colunas """
pd.read_csv(file_name, usecols=["product_id", "store_id"])

Agrupando DataFrames

Carregando as Tabelas dos Arquivos


In [ ]:
orders = pd.read_csv(
    os.path.join("data", "tutorial", "orders.csv"),
    sep=",",
    index_col=0
)

In [ ]:
stores = pd.read_csv(
    os.path.join("data", "tutorial", "stores.csv"),
    sep="\t",
    index_col=0,
    encoding="utf-8"
)

In [ ]:
products = pd.read_csv(
    os.path.join("data", "tutorial", "products.csv"),
    sep=";",
    index_col=0,
    encoding="utf-8"
)

Estruturas Homogêneas

Adicionando Linhas

  • método: append
  • concatena DataFrames no sentido das linhas

In [ ]:
""" novos dados de 'orders' """
new_orders = pd.DataFrame(
    columns=["user_id", "store_id", "product_id"],
    data=[
        [1, 1, 1],
        [2, 1, 2],
        [3, 2, 1],
        [2, 1, 3],
        [1, 2, 1],
    ]
)

new_orders

In [ ]:
""" adicionando no 'orders' original """
temp_orders = orders.append(new_orders)

temp_orders

Observações:

  • append não verifica índices, podendo repetir existentes
  • Caso um dos DataFrames tenha uma coluna a mais, o outro replica essa coluna, preenchida com NaNs

In [ ]:
new_orders.append(
    pd.DataFrame(
        columns=list(new_orders.columns) + ["new_column"],
        data=[
            [1, 2, 1, 51],
            [1, 2, 1, 15]
        ]
    )
)

Adicionando Colunas

  • método: join
  • concatena DataFrames no sentido das colunas
  • junta DataFrames usando como base o index

In [ ]:
new_stores = pd.DataFrame(
    index=stores.index,
    columns=["opens", "closes"],    
    data=[
        ["9:00", "22:00"],
        ["8:00", "18:00"],
        ["11:00", "21:00"],
    ]
)
new_stores

In [ ]:
""" concatenando estruturas compatíveis  """
temp_stores = stores.join(new_stores)

temp_stores

Observações:

  • Tipos de join:
    • inner
    • outer
    • left
    • right
  • comportamento default: left join

In [ ]:
""" modificando índices para exemplos """
new_stores.index = [3, 4, 5]

In [ ]:
""" concatenando estruturas com índices diferentes """
stores.join(new_stores)

In [ ]:
""" explicitando 'how=left' """
stores.join(new_stores, how="left")

In [ ]:
""" right join """
stores.join(new_stores, how="right")

In [ ]:
""" concatenando estruturas com índices diferentes """
stores.join(new_stores, how="outer")

In [ ]:
""" concatenando estruturas com índices diferentes """
stores.join(new_stores, how="inner")
Observação:

Em DataFrames com nomes de coluna iguais, deve-se especificar sufixos para diferenciar as colunas.


In [ ]:
new_stores.join(new_stores, lsuffix="_original")

In [ ]:
new_stores.join(new_stores, rsuffix="_copycat")

In [ ]:
new_stores.join(new_stores, lsuffix="_original", rsuffix="_copycat")

Estruturas Heterogêneas

  • método merge
  • construção de tabelas que compartilham uma ou mais variáveis
  • sufixos: idêntico a join
  • todos os tipos de join (inner, outer, left e right) são suportados
  • simplificando: join onde se escolhe uma coluna em vez do index

In [ ]:
""" reset_index para liberar as variáveis para o merge """
stores = stores.reset_index()
products = products.reset_index()

In [ ]:
""" adicionando store_name"""
df = pd.merge(
    left=orders,
    right=stores,
    on="store_id"
)
df

In [ ]:
""" adicionando product_name"""
df = pd.merge(
    left=df,
    right=products,
    on="product_id"
)
df

Desafio

Objetivo:

Construir um dataset a partir de tabelas de diferentes formatos contidas em arquivos separados.

Solução

Arquivos das Tabelas

Arquivos de Referência


In [ ]:
path = os.path.join("data", "desafio")

In [ ]:
input_file = {
    "aisles": os.path.join(path, "aisles.csv"),
    "departments": os.path.join(path, "departments.csv"),
    "order_products": os.path.join(path, "order_products.csv"),
    "orders": os.path.join(path, "orders.csv"),
    "products": os.path.join(path, "products.csv")
}

Arquivo de Resposta


In [ ]:
output_file = os.path.join(path, "dataset.csv")

Construção do Dataset

Referência:

Leitura dos Arquivos

  • sep = ',' para todos os arquivos
  • o nome da variável deverá ser o mesmo do dicionário. Exemplo:
    aisles = pd.read_csv(input_file["aisles"])
  • carregar do aqrquivo apenas as colunas especificadas em cada item
orders
  • colunas:
    • order_id
    • user_id
    • order_dow
  • sep: ','

In [ ]:
""" Entre com o Código aqui """
products
  • colunas:
    • product_id
    • product_name
    • aisle_id
    • department_id
      • sep: ','

In [ ]:
""" Entre com o Código aqui """
aisles
  • colunas:
    • aisle_id
    • aisle
  • sep: ','

In [ ]:
""" Entre com o Código aqui """
department
  • colunas:
    • department_id
    • department
  • sep: ','

In [ ]:
""" Entre com o Código aqui """
order_products
  • colunas:
    • order_id
    • product_id
  • sep: ','

In [ ]:
""" Entre com o Código aqui """

Construção do Dataset

  • Junte todos os DataFrames usando os métodos apropriados
  • O dataset final deve conter apenas as seguintes colunas:
    • order_id
    • user_id
    • order_dow
    • department
    • aisle
    • product_name

In [ ]:
""" Entre com o Código aqui """

Visualização do Dataset


In [ ]:
dataset.head(7)

In [ ]:
dataset.tail(3)

Salvando o Dataset


In [ ]:
""" Entre com o Código aqui """