<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Módulo 3
Step1:  Operações com Arquivos
Criando os Arquivos
Criando Estrutura de Pastas
Step5:  Dataset orders.csv
Step9:  Dataset stores.csv
Step13:  Dataset product.csv
Step14:  Leitura de Arquivos
Parâmetros default
Step17:  Parâmetro index_col
define a coluna que contém o index
valores esperados
Step20:  Parâmetro sep
define o separador de colunas.
valores esperados
Step24:  Parâmetro header
define a linha que contém as colunas
valores esperados
Step26:  Parâmetro usecols
define quais colunas serão lidas, permitindo carregar apenas os dados desejados
valores esperados
Step27:  Agrupando DataFrames
Carregando as Tabelas dos Arquivos
Step30:  Estruturas Homogêneas
Adicionando Linhas
método
Step31:  Observações
Step33:  Adicionando Colunas
método
Step40:  Observações
Step41:  Observação
Step45:  Estruturas Heterogêneas
método merge
construção de tabelas que compartilham uma ou mais variáveis
sufixos
Step46:  Desafio
Objetivo
Step47:  Arquivo de Resposta
Step49:  Construção do Dataset
Referência
Step51:  products
colunas
Step53:  aisles
colunas
Step55:  department
colunas
Step57:  order_products
colunas
Step59:  Construção do Dataset
Junte todos os DataFrames usando os métodos apropriados
O dataset final deve conter apenas as seguintes colunas
Step60:  Visualização do Dataset
Step62:  Salvando o Dataset
<ASSISTANT_TASK:>
Python Code:
import os
import pandas as pd
Explanation: Módulo 3: Leitura e Escrita em Arquivos + Combinando Tabelas
Tutorial
Imports para a Aula
End of explanation
try:
    os.makedirs(os.path.join("data", "tutorial"))
    print("Pasta criada.")
except OSError:
    print("Pasta já existe!")
Explanation: Operações com Arquivos
Criando os Arquivos
Criando Estrutura de Pastas
End of explanation
 nome do arquivo 
file_name = os.path.join("data", "tutorial", "orders.csv")
 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
 salvando o DataFrame 
df.to_csv(file_name, sep=",")
Explanation: Dataset orders.csv
End of explanation
 nome do arquivo 
file_name = os.path.join("data", "tutorial", "stores.csv")
 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
 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
)
Explanation: Dataset stores.csv
End of explanation
 nome do arquivo 
file_name = os.path.join("data", "tutorial", "products.csv")
 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
 salvando o DataFrame 
df.to_csv(
    file_name,          # nome do arquivo
    sep=";",            # separador ;
    encoding="utf-8"    # encoding: garante formato correto de strings no arquivo
)
Explanation: Dataset product.csv
End of explanation
file_name = os.path.join("data", "tutorial", "orders.csv")
pd.read_csv(file_name)
Explanation: Leitura de Arquivos
Parâmetros default
End of explanation
 definindo index_col para a primeira coluna 
pd.read_csv(file_name, index_col=0)
 definindo index_col para a segunda coluna 
pd.read_csv(file_name, index_col=1)
Explanation: Parâmetro index_col
define a coluna que contém o index
valores esperados: inteiro ou lista de inteiros 
valor default: None
End of explanation
 Modificando o parâmetro sep
pd.read_csv(file_name, sep=";")
 Usando explicitamente o valor default de sep 
pd.read_csv(file_name, sep=",")
Explanation: Parâmetro sep
define o separador de colunas.
valores esperados: caractere
valor default: ","
End of explanation
 Usando header = None 
pd.read_csv(file_name, header=None)
 Usando outra linha como header; nota-se que as linhas acima são eliminadas 
pd.read_csv(file_name, header=1)
 Usando múltiplass linhas como header 
pd.read_csv(file_name, header=[0,1,2])
Explanation: Parâmetro header
define a linha que contém as colunas
valores esperados: inteiro ou lista de inteiros ou None
valor default: 0
End of explanation
 lendo apenas duas colunas 
pd.read_csv(file_name, usecols=["product_id", "store_id"])
Explanation: 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
End of explanation
orders = pd.read_csv(
    os.path.join("data", "tutorial", "orders.csv"),
    sep=",",
    index_col=0
)
stores = pd.read_csv(
    os.path.join("data", "tutorial", "stores.csv"),
    sep="\t",
    index_col=0,
    encoding="utf-8"
)
products = pd.read_csv(
    os.path.join("data", "tutorial", "products.csv"),
    sep=";",
    index_col=0,
    encoding="utf-8"
)
Explanation: Agrupando DataFrames
Carregando as Tabelas dos Arquivos
End of explanation
 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
 adicionando no 'orders' original 
temp_orders = orders.append(new_orders)
temp_orders
Explanation: Estruturas Homogêneas
Adicionando Linhas
método: append
concatena DataFrames no sentido das linhas
End of explanation
new_orders.append(
    pd.DataFrame(
        columns=list(new_orders.columns) + ["new_column"],
        data=[
            [1, 2, 1, 51],
            [1, 2, 1, 15]
        ]
    )
)
Explanation: 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
End of explanation
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
 concatenando estruturas compatíveis  
temp_stores = stores.join(new_stores)
temp_stores
Explanation: Adicionando Colunas
método: join
concatena DataFrames no sentido das colunas
junta DataFrames usando como base o index
End of explanation
 modificando índices para exemplos 
new_stores.index = [3, 4, 5]
 concatenando estruturas com índices diferentes 
stores.join(new_stores)
 explicitando 'how=left' 
stores.join(new_stores, how="left")
 right join 
stores.join(new_stores, how="right")
 concatenando estruturas com índices diferentes 
stores.join(new_stores, how="outer")
 concatenando estruturas com índices diferentes 
stores.join(new_stores, how="inner")
Explanation: Observações:
* Tipos de join: 
    * inner 
    * outer
    * left
    * right
* comportamento default: left join
End of explanation
new_stores.join(new_stores, lsuffix="_original")
new_stores.join(new_stores, rsuffix="_copycat")
new_stores.join(new_stores, lsuffix="_original", rsuffix="_copycat")
Explanation: Observação:
Em DataFrames com nomes de coluna iguais, deve-se especificar sufixos para diferenciar as colunas.
End of explanation
 reset_index para liberar as variáveis para o merge 
stores = stores.reset_index()
products = products.reset_index()
 adicionando store_name
df = pd.merge(
    left=orders,
    right=stores,
    on="store_id"
)
df
 adicionando product_name
df = pd.merge(
    left=df,
    right=products,
    on="product_id"
)
df
Explanation: 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
End of explanation
path = os.path.join("data", "desafio")
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")
}
Explanation: Desafio
Objetivo:
Construir um dataset a partir de tabelas de diferentes formatos contidas em arquivos separados.
Solução
Arquivos das Tabelas
Download dos Arquivos
Link: <a href="https://drive.google.com/open?id=0BzHr4OwCpy_haWdqWlBFODVKOHc" target=_blank> https://drive.google.com/open?id=0BzHr4OwCpy_haWdqWlBFODVKOHc </a>
Arquivos de Referência
End of explanation
output_file = os.path.join(path, "dataset.csv")
Explanation: Arquivo de Resposta
End of explanation
 Entre com o Código aqui 
Explanation: Construção do Dataset
Referência: 
* The Instacart Online Grocery Shopping Dataset 2017”, Accessed from https://www.instacart.com/datasets/grocery-shopping-2017 on October 20, 2017.
* Descrição dos Campos: <a href="https://gist.github.com/jeremystan/c3b39d947d9b88b3ccff3147dbcf6c6b" target=_blank> https://gist.github.com/jeremystan/c3b39d947d9b88b3ccff3147dbcf6c6b </a>
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: ','
End of explanation
 Entre com o Código aqui 
Explanation: products
colunas: 
product_id
product_name
aisle_id
department_id
sep: ','
End of explanation
 Entre com o Código aqui 
Explanation: aisles
colunas: 
aisle_id
aisle
sep: ','
End of explanation
 Entre com o Código aqui 
Explanation: department
colunas: 
department_id
department
sep: ','
End of explanation
 Entre com o Código aqui 
Explanation: order_products
colunas:
order_id
product_id
sep: ','
End of explanation
 Entre com o Código aqui 
Explanation: 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
End of explanation
dataset.head(7)
dataset.tail(3)
Explanation: Visualização do Dataset
End of explanation
 Entre com o Código aqui 
Explanation: Salvando o Dataset
End of explanation
<END_TASK>