Este repositório contém o código-fonte completo do workshop. Você seguirá o guia passo a passo abaixo, completando todas as etapas enquanto trabalha com dados e o GitHub Copilot dentro do Codespaces.
[!NOTA] Este repositório tem como objetivo apresentar vários recursos do GitHub Copilot, como Copilot Chat e chat inline. Portanto, os guias passo a passo abaixo contêm a descrição geral do que precisa ser feito, e o Copilot Chat ou o chat inline podem ajudar você a gerar os comandos necessários.
Cada etapa (quando aplicável) também contém um
Cheatsheet
que pode ser usado para validar as sugestões do Copilot em relação ao comando correto.💡 Experimente diferentes prompts para ver como isso afeta a precisão das sugestões do GitHub Copilot. Por exemplo, ao usar o chat inline, você pode usar um prompt adicional para refinar a resposta sem precisar refazer todo o prompt.
Neste workshop, você trabalhará com dados de um arquivo CSV incluído neste repositório, além de um script em Python que interage com esse arquivo CSV. Aqui estão algumas das funcionalidades do projeto:
- Consumir um dataset em CSV e realizar transformações
- Identificar e implementar validações
- Criar uma ferramenta de linha de comando que pode ser usada em ambientes de CI/CD
Este repositório está pronto para Codespaces e já está pré-configurado para que você tenha todas as dependências instaladas, incluindo as extensões do Visual Studio Code necessárias para trabalhar com GitHub Copilot e Python:
- GitHub Copilot
- Extensão Python
- Dependências Python pré-instaladas com um Ambiente Virtual ativado
[!NOTA] Se você estiver usando este repositório na sua conta ou em uma organização que não seja do GitHub Universe, pode haver custos ou consumo de sua cota gratuita para Codespaces.
Progresso: [🟢⚪⚪⚪⚪⚪⚪⚪⚪⚪⚪⚪] 1/12 (8%)
⏳ ~2min
- Clique em
Use this template
👉Create a new repository
- Defina o proprietário como a organização GitHub Workshop:
githubuniverseworkshop
- Dê um nome
- Defina a visibilidade como
Private
- Clique em
Create repository
Progresso: [🟢🟢⚪⚪⚪⚪⚪⚪⚪⚪⚪⚪] 2/12 (16%)
⏳ ~3min
-
No repositório recém-criado, clique em
Code
👉Codespaces
👉[ellipsis menu]
👉New with options
👉 Certifique-se de queDev container configuration
esteja definido comoDefault project configuration
👉Create codespace
-
❗Se você estiver tendo problemas para iniciar o Codespace, também pode clonar o repositório e continuar do seu IDE:
git clone https://github.com/<SEU_NAMESPACE>/<SEU_REPO>.git cd <SEU_REPO>
📝 Nota: Não há necessidade de enviar (push) as alterações de volta ao repositório durante o workshop
Progresso: [🟢🟢🟢⚪⚪⚪⚪⚪⚪⚪⚪⚪] 3/12 (25%)
⏳ ~2min
- Use o palette de comandos para abrir o terminal (procure por "Create new terminal")
- Execute
which python
e certifique-se de que ele aponte para o Ambiente Virtual (home/vscode/venv/bin/python
) - Execute
which pip
e confirme que ele também aponte para o Ambiente Virtual (home/vscode/venv/bin/pip
)
Progresso: [🟢🟢🟢🟢⚪⚪⚪⚪⚪⚪⚪⚪] 4/12 (33%)
⏳ ~2min
-
Execute o script
main.py
e confirme se não ocorrem erros:python main.py
-
Execute o script
check.py
e confirme se não ocorrem erros:python check.py
Deve haver algumas linhas de OK e outras de FAIL:
[OK ] verify_drop_notes [FAIL] verify_high_ratings - Not all ratings are 90 or higher. [FAIL] verify_one_hot_encoding - The 'Red Wine' column was not one-hot encoded correctly. [OK ] verify_remove_newlines_carriage_returns [FAIL] verify_ratings_to_int - The 'ratings' column was not converted to integers correctly.
Progresso: [🟢🟢🟢🟢🟢⚪⚪⚪⚪⚪⚪⚪] 5/12 (41%)
⏳ ~2min
O GitHub Copilot se beneficia de ter contexto disponível. Uma forma de aprimorar o contexto é abrir os arquivos relevantes.
- Abra os arquivos
main.py
,check.py
,train.csv
etransformed_train.csv
Progresso: [🟢🟢🟢🟢🟢🟢⚪⚪⚪⚪⚪⚪] 6/12 (50%) - Metade do caminho!
⏳ ~5min
- Abra o GitHub Copilot Chat
- Use o agente
@workspace
para perguntar ao Copilot o que os arquivosmain.py
echeck.py
fazem - Novamente, com o agente
@workspace
, pergunte ao Copilot qual é a natureza dos dados com os quais você vai trabalhar
Progresso: [🟢🟢🟢🟢🟢🟢🟢⚪⚪⚪⚪⚪] 7/12 (58%)
⏳ ~3min
- Em
main.py
, localize a funçãoselect_high_ratings()
- Posicione seu cursor na assinatura ou em algum lugar do corpo da função
- Abra o chat inline com
Ctrl-i
ouCmd-i
(no Mac) - Prefixe seu prompt com o comando
/explain
- Pergunte por que essa função pode não estar funcionando e implemente as possíveis correções
- Recrie o arquivo
transformed_train.csv
executandopython main.py
- Verifique a correção executando
python check.py
, certificando-se de que essa função retorne umOK
Cheatsheet
/explain why this function might not be working correctly?
##### Output esperado
```sh
Based on the provided code, there are a few potential reasons why the `select_high_ratings` function might not be working correctly:
1. Erro de digitação no Nome da Coluna: A função verifica se o nome da coluna 'ratings' existe em df.columns. Se houver um erro de digitação, como 'rating' em vez de 'ratings', a condição `if 'ratings' in df.columns`
[!NOTA] Sinta-se à vontade para usar o GitHub Copilot Chat para implementar ou confirmar a correção
Progresso: [🟢🟢🟢🟢🟢🟢🟢🟢⚪⚪⚪⚪] 8/12 (66%)
⏳ ~3min
- Selecione a função
drop_and_one_hot_encode_red_wine()
e abra o chat inline (Ctrl-i/ Cmd-i) - Use o comando
/fix
para solicitar ao GitHub Copilot que sugira uma possível correção - Gere novamente o arquivo
transformed_train.csv
executandopython main.py
- Verifique a correção executando
python check.py
, certificando-se de que a função retorneOK
Cheatsheet
This function is not doing one-hot encoding on the variety column
def drop_and_one_hot_encode_red_wine(df):
"""
Create a 'Red_Wine' column that is 1 if 'variety' is 'Red Wine' and 0 otherwise.
Drop the original 'variety' column.
"""
if 'variety' in df.columns:
df['Red_Wine'] = df['variety'].apply(lambda x: 1 if x == 'Red Wine' else 0)
df = df.drop(columns=['variety'])
return df
Progresso: [🟢🟢🟢🟢🟢🟢🟢🟢🟢⚪⚪⚪] 9/12 (75%)
⏳ ~3min
- Se o check
verify_ratings_to_int
já estiver "OK", o Copilot pode ter solucionado o problema. Caso contrário, siga os passos. - Selecione a função
convert_ratings_to_int()
e abra o chat inline (Ctrl-i / Cmd-i). - Use o comando
/explain
para perguntar ao GitHub Copilot por que a função pode não funcionar corretamente. - Identifique o problema e implemente a correção.
- Regere
transformed_train.csv
executandopython main.py
. - Verifique a correção executando
python check.py
e certifique-se de que a função retornaOK
.
Cheatsheet
Esta função não está convertendo as avaliações para inteiros
def convert_ratings_to_int(df):
"""
Converte a coluna 'rating' de float para inteiro.
"""
if 'rating' in df.columns:
df['rating'] = df['rating'].astype(int)
return df
Um projeto Python robusto pode se beneficiar de testes. Você adicionará alguns testes unitários e descobrirá mais sobre como executar esses testes com a ajuda do GitHub Copilot.
Certifique-se de ter o terminal aberto executando o comando palette e digitando toggle terminal
.
Progresso: [🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢⚪⚪] 10/12 (83%)
⏳ ~5min
- Este projeto tem o Pytest test runner e framework pré-instalados, certifique-se de que está disponível executando
pytest --version
. - Execute os testes enquanto estiver no diretório
workshop
usando o seguinte comando:pytest -v
.
A saída deve mostrar uma falha.
Progresso: [🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢⚪] 11/12 (91%)
⏳ ~5min
- Selecione a saída no terminal e cole-a no GitHub Copilot Chat, prefixando com uma solicitação de correção e explicação.
- Use a saída do chat para implementar uma correção em
test_main.py
.
Cheatsheet
Corrija o teste e explique sua correção:
// Copie e cole a saída do terminal aqui
O erro ocorre porque a função drop_notes provavelmente está modificando o DataFrame no local, em vez de retornar um novo DataFrame com a coluna 'notes' removida. Para corrigir o teste, precisamos garantir que a função drop_notes retorne um novo DataFrame sem a coluna 'notes' e, em seguida, verificar as colunas desse novo DataFrame.
Aqui está a função de teste corrigida:
def test_drop_notes_column_dropped():
# Crie um DataFrame de amostra com a coluna 'notes'
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'notes': ['note1', 'note2', 'note3']})
# Chame a função drop_notes e obtenha o resultado
result = main.drop_notes(df)
# Verifique se a coluna 'notes' no DataFrame resultante foi removida
columns = result.columns.to_list()
assert columns == ['A', 'B']
Armazenando o resultado da função drop_notes em uma nova variável e verificando suas colunas, garantimos que o teste verifique corretamente o comportamento da função.
Progresso: [🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢] 12/12 (100%) - 🎉 Celebre!
⏳ ~5min
- Certifique-se de que o
python check.py
tenha todas as saídas OK, caso contrário, esta etapa pode não funcionar. - Selecione a função
drop_and_one_hot_encode_red_wine
emmain.py
. - Abra o chat inline com
Ctrl-i
/Cmd-i
. - Use o comando
/tests
para obter sugestões de testes. - Revise a saída, aceite-a e verifique com o comando
pytest -v
. Todos os testes devem passar, e você deve ter mais testes do que antes. Às vezes, o Copilot indenta os testes sugeridos incorretamente (aninhando-os dentro de uma função de teste existente), então certifique-se de que os testes estão corretamente indentados antes de executá-los.
Cheatsheet
/tests
def test_drop_and_one_hot_encode_red_wine_coluna_red_wine_criada():
# Crie um DataFrame de amostra com a coluna 'variety'
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'variety': ['Red Wine', 'White Wine', 'Red Wine']})
# Chame a função drop_and_one_hot_encode_red_wine
result = main.drop_and_one_hot_encode_red_wine(df)
# Verifique se a coluna 'Red_Wine_Red Wine' foi criada
assert 'Red_Wine_Red Wine' in result.columns
def test_drop_and_one_hot_encode_red_wine_coluna_red_wine_codificada():
# Crie um DataFrame de amostra com a coluna 'variety'
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'variety': ['Red Wine', 'White Wine', 'Red Wine']})
# Chame a função drop_and_one_hot_encode_red_wine
result = main.drop_and_one_hot_encode_red_wine(df)
# Verifique se a coluna 'Red_Wine_Red Wine' foi codificada corretamente
assert result['Red_Wine_Red Wine'].tolist() == [1, 0, 1]
def test_drop_and_one_hot_encode_red_wine_coluna_variety_removida():
# Crie um DataFrame de amostra com a coluna 'variety'
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'variety': ['Red Wine', 'White Wine', 'Red Wine']})
# Chame a função drop_and_one_hot_encode_red_wine
result = main.drop_and_one_hot_encode_red_wine(df)
# Verifique se a coluna 'variety' foi removida
assert 'variety' not in result.columns
def test_drop_and_one_hot_encode_red_wine_dataframe_inalterado():
# Crie um DataFrame de amostra com a coluna 'variety'
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'variety': ['Red Wine', 'White Wine', 'Red Wine']})
# Chame a função drop_and_one_hot_encode_red_wine
result = main.drop_and_one_hot_encode_red_wine(df)
# Verifique se a forma do DataFrame não foi alterada
assert result.shape == (3, 3)
# Verifique se o DataFrame original não foi modificado
assert 'variety' in df.columns
assert df.shape == (3, 3)
def main():
parser = argparse.ArgumentParser(description="CLI de manipulação de DataFrame")
subparsers = parser.add_subparsers(dest="command")
subparsers.add_parser("drop_notes", help="Remove a coluna 'notes' do DataFrame")
subparsers.add_parser("select_high_ratings", help="Seleciona linhas onde a coluna 'rating' é 90 ou maior")
subparsers.add_parser("drop_and_one_hot_encode_red_wine", help="Codifica 'Red Wine' como one-hot e remove a coluna 'variety'")
subparsers.add_parser("remove_newlines_carriage_returns", help="Remove quebras de linha e retornos de carro das colunas de string")
subparsers.add_parser("convert_ratings_to_int", help="Converte a coluna 'rating' de float para inteiro")
args = parser.parse_args()
# Carregue seu DataFrame aqui
df = pd.read_csv('workshop/train.csv')
if args.command == "drop_notes":
df = drop_notes(df)
elif args.command == "select_high_ratings":
df = select_high_ratings(df)
elif args.command == "drop_and_one_hot_encode_red_wine":
df = drop_and_one_hot_encode_red_wine(df)
elif args.command == "remove_newlines_carriage_returns":
df = remove_newlines_carriage_returns(df)
elif args.command == "convert_ratings_to_int":
df = convert_ratings_to_int(df)
else:
parser.print_help()
# Salva o DataFrame transformado
df.to_csv('workshop/transformed_train.csv', index=False)
if __name__ == "__main__":
main()
Este projeto fornece uma interface de linha de comando (CLI) para manipular um DataFrame usando várias operações. A CLI é construída usando a biblioteca padrão do Python e não requer dependências externas.
-
Clone o repositório:
sh git clone https://github.com/seuusuario/seu-repo.git cd seu-repo
-
Configure um ambiente virtual:
sh python3 -m venv venv source venv/bin/activate
-
Instale os pacotes necessários:
sh pip install -r workshop/requirements.txt
Para usar a CLI, navegue até o diretório workshop
e execute o script main.py
com o comando desejado.
drop_notes
: Remove a coluna 'notes' do DataFrame.select_high_ratings
: Seleciona linhas onde a coluna 'rating' é 90 ou maior.drop_and_one_hot_encode_red_wine
: Codifica 'Red Wine' como one-hot e remove a coluna 'variety'.remove_newlines_carriage_returns
: Remove quebras de linha e retornos de carro das colunas de string.convert_ratings_to_int
: Converte a coluna 'rating' de float para inteiro.
-
Remover a coluna 'notes':
sh python main.py drop_notes
-
Selecionar linhas com altas avaliações:
sh python main.py select_high_ratings
-
Codificar 'Red Wine' como one-hot e remover a coluna 'variety':
sh python main.py drop_and_one_hot_encode_red_wine
-
Remover quebras de linha e retornos de carro das colunas de string:
sh python main.py remove_newlines_carriage_returns
-
Converter a coluna 'rating' para inteiro:
sh python main.py convert_ratings_to_int
Os dados usados neste projeto estão armazenados em arquivos CSV localizados no diretório workshop
. O arquivo principal é train.csv
, que contém as seguintes colunas:
notes
: Notas de texto sobre os dados.ratings
: Avaliações numéricas dos dados.variety
: A variedade dos dados (por exemplo, 'Red Wine').
Os dados transformados são salvos em transformed_train.csv
após a aplicação dos comandos da CLI.
Contribuições são bem-vindas! Por favor, siga estes passos para contribuir:
- Faça um fork do repositório.
- Crie um novo branch (
git checkout -b feature-branch
). - Faça suas alterações.
- Faça commit das suas alterações (
git commit -m 'Adicionar nova funcionalidade'
). - Faça push para o branch (
git push origin feature-branch
). - Abra um pull request.
Este projeto está licenciado sob a Licença MIT. Veja o arquivo LICENSE para mais detalhes.
⏳ ~1min
Antes de excluir, se desejar, você pode enviar suas alterações. Lembre-se de que os repositórios do workshop também são temporários.
Vá para https://github.com/codespaces e encontre seu Codespace em execução para excluí-lo.
Se você deseja aprender mais sobre como usar o GitHub Copilot, confira estes recursos:
- Documentação do GitHub Copilot
- Série de vídeos do VS Code: GitHub Copilot
- Blog: Melhores práticas para orientar o Copilot
Confira também o roteiro de aprendizagem GitHub Foundations para mais recursos sobre GitHub e GitHub Copilot.
A Microsoft e quaisquer colaboradores concedem a você uma licença para a documentação da Microsoft e outros conteúdos neste repositório sob a Creative Commons Attribution 4.0 International Public License, veja LICENSE e concedem a você uma licença para qualquer código no repositório sob a MIT License, consulte LICENSE-CODE
Microsoft, Windows, Microsoft Azure e/ou outros produtos e serviços da Microsoft referenciados na documentação podem ser marcas registradas ou marcas registradas da Microsoft nos Estados Unidos e/ou em outros países. As licenças para este projeto não concedem a você direitos de uso de quaisquer nomes, logotipos ou marcas registradas da Microsoft. As diretrizes gerais de marcas registradas da Microsoft podem ser encontradas em http://go.microsoft.com/fwlink/?LinkID=254653.
As informações de privacidade podem ser encontradas em https://privacy.microsoft.com/en-us/
A Microsoft e quaisquer colaboradores reservam todos os outros direitos, sejam sob seus respectivos direitos autorais, patentes, ou marcas registradas, seja por implicação, estoppel ou de outra forma.