Introdução
Neste laboratório, você aprenderá a aprimorar uma classe Stock projetada para representar participações acionárias. Você adicionará novos métodos e funcionalidades a esta classe, tornando-a mais versátil e útil.
Os objetivos deste laboratório incluem adicionar um método sell à classe Stock existente, criar uma função para ler dados de carteira de ações de um arquivo CSV e outra função para exibir os dados da carteira em uma tabela formatada. O arquivo a ser modificado é stock.py.
Adicionando um Método sell à Classe Stock
Nesta etapa, vamos aprimorar a classe Stock adicionando um novo método. Um método é como uma função especial que pertence a uma classe e pode trabalhar com os objetos criados a partir dessa classe. Criaremos um método chamado sell(nshares) que nos ajudará a simular a ação de vender ações de uma ação. Quando você vende ações, o número de ações que você possui diminui, e este método lidará com essa redução para nós.
O que é um Método?
Vamos primeiro entender o que é um método. Um método é uma função que é definida dentro de uma classe. Ele é projetado para operar em instâncias (que são como cópias individuais) dessa classe. Quando um método é chamado em um objeto, ele pode acessar todos os atributos (características) desse objeto. Ele faz isso através do parâmetro self. O parâmetro self é uma referência ao objeto no qual o método está sendo chamado. Portanto, quando você usa self dentro de um método, você está se referindo ao objeto específico em que o método está atuando.
Instruções de Implementação
- Primeiro, precisamos abrir o arquivo
stock.pyno editor. Para fazer isso, usaremos a linha de comando. Abra seu terminal e execute o seguinte comando. Este comando altera o diretório para a pastaprojectonde o arquivostock.pyestá localizado.
cd ~/project
Depois de abrir o arquivo
stock.py, você precisa encontrar um comentário específico na classeStock. Procure o comentário## TODO: Add sell(nshares) method here. Este comentário é um espaço reservado que indica onde devemos adicionar nosso novo métodosell.Agora, é hora de adicionar o método
sell. Este método receberá um parâmetro chamadonshares, que representa o número de ações que você deseja vender. O trabalho principal deste método é diminuir o atributosharesdo objetoStockpelo número de ações que você está vendendo.
Aqui está o código para o método sell que você precisa adicionar:
def sell(self, nshares):
self.shares -= nshares
Neste código, self.shares se refere ao atributo shares do objeto Stock. O operador -= subtrai o valor de nshares do valor atual de self.shares.
Depois de adicionar o método
sell, você precisa salvar o arquivostock.py. Você pode fazer isso pressionandoCtrl+Sno seu teclado ou selecionando "File > Save" no menu do seu editor.Para garantir que nosso método
sellfuncione corretamente, criaremos um script de teste. Crie um novo arquivo Python chamadotest_sell.pye adicione o seguinte código a ele:
## test_sell.py
from stock import Stock
## Create a stock object
s = Stock('GOOG', 100, 490.10)
print(f"Initial shares: {s.shares}")
## Sell 25 shares
s.sell(25)
print(f"Shares after selling: {s.shares}")
Neste script, primeiro importamos a classe Stock do arquivo stock.py. Em seguida, criamos um objeto Stock chamado s com o símbolo da ação GOOG, 100 ações e um preço de 490.10. Imprimimos o número inicial de ações. Depois disso, chamamos o método sell no objeto s para vender 25 ações. Finalmente, imprimimos o número de ações após a venda.
- Agora, executaremos o script de teste para ver se nosso método
sellestá funcionando como esperado. Abra seu terminal novamente e execute o seguinte comando:
python3 test_sell.py
Se tudo estiver funcionando corretamente, você deverá ver uma saída semelhante a esta:
Initial shares: 100
Shares after selling: 75
Esta saída confirma que nosso método sell está funcionando corretamente. Ele reduziu com sucesso o número de ações pela quantidade que especificamos.
Lendo uma Carteira de um Arquivo CSV
Nesta etapa, vamos criar uma função que lê dados de ações de um arquivo CSV e retorna uma lista de objetos Stock. Um objeto Stock representa uma participação acionária e, ao final desta etapa, você poderá ler uma carteira de ações de um arquivo CSV.
Entendendo Arquivos CSV
CSV, que significa Valores Separados por Vírgula (Comma-Separated Values), é um formato muito comum para armazenar dados tabulares. Pense nisso como uma planilha simples. Cada linha em um arquivo CSV representa uma linha de dados, e as colunas dentro dessa linha são separadas por vírgulas. Normalmente, a primeira linha de um arquivo CSV contém cabeçalhos. Esses cabeçalhos descrevem que tipo de dados está em cada coluna. Por exemplo, em um CSV de carteira de ações, os cabeçalhos podem ser "Nome", "Ações" e "Preço".
Instruções de Implementação
Primeiro, abra o arquivo
stock.pyno seu editor de código. Se já estiver aberto, ótimo! Caso contrário, encontre-o e abra-o. É aqui que adicionaremos nossa nova função.Depois que o arquivo
stock.pyestiver aberto, procure o comentário## TODO: Add read_portfolio(filename) function here. Este comentário é um espaço reservado que nos diz onde colocar nossa nova função.Abaixo desse comentário, adicione a seguinte função. Esta função é chamada
read_portfolioe recebe um nome de arquivo como argumento. O objetivo desta função é ler o arquivo CSV, extrair os dados das ações e criar uma lista de objetosStock.
def read_portfolio(filename):
"""
Read a CSV file containing portfolio data and return a list of Stock objects.
Args:
filename (str): Path to the CSV file
Returns:
list: A list of Stock objects
"""
portfolio = []
with open(filename, 'r') as f:
headers = next(f).strip().split(',') ## Skip the header line
for line in f:
row = line.strip().split(',')
name = row[0]
shares = int(row[1])
price = float(row[2])
## Create a Stock object and add it to the portfolio list
stock = Stock(name, shares, price)
portfolio.append(stock)
return portfolio
Vamos detalhar o que essa função faz. Primeiro, ela cria uma lista vazia chamada portfolio. Em seguida, ela abre o arquivo CSV no modo de leitura. A instrução next(f) pula a primeira linha, que é a linha do cabeçalho. Depois disso, ela percorre cada linha do arquivo. Para cada linha, ela divide a linha em uma lista de valores, extrai o nome, o número de ações e o preço, cria um objeto Stock e o adiciona à lista portfolio. Finalmente, ela retorna a lista portfolio.
Depois de adicionar a função, salve o arquivo
stock.py. Você pode fazer isso pressionandoCtrl+Sno seu teclado ou selecionando "File > Save" no menu do seu editor de código. Salvar o arquivo garante que suas alterações sejam preservadas.Agora, precisamos testar nossa função
read_portfolio. Crie um novo script Python chamadotest_portfolio.py. Este script importará a funçãoread_portfoliodo arquivostock.py, lerá a carteira de um arquivo CSV e imprimirá informações sobre cada ação na carteira.
## test_portfolio.py
from stock import read_portfolio
## Read the portfolio from the CSV file
portfolio = read_portfolio('portfolio.csv')
## Print information about each stock
for stock in portfolio:
print(f"Name: {stock.name}, Shares: {stock.shares}, Price: ${stock.price:.2f}")
## Print the total number of stocks in the portfolio
print(f"\nTotal number of stocks in portfolio: {len(portfolio)}")
Neste script, primeiro importamos a função read_portfolio. Em seguida, chamamos a função com o nome do arquivo portfolio.csv para obter a lista de objetos Stock. Depois disso, percorremos a lista e imprimimos informações sobre cada ação. Finalmente, imprimimos o número total de ações na carteira.
- Para executar o script de teste, abra seu terminal ou prompt de comando, navegue até o diretório onde o arquivo
test_portfolio.pyestá localizado e execute o seguinte comando:
python3 test_portfolio.py
Se tudo estiver funcionando corretamente, você deverá ver uma saída que lista todas as ações do arquivo portfolio.csv, juntamente com seus nomes, número de ações e preços. Você também deverá ver o número total de ações na carteira.
Name: AA, Shares: 100, Price: $32.20
Name: IBM, Shares: 50, Price: $91.10
Name: CAT, Shares: 150, Price: $83.44
Name: MSFT, Shares: 200, Price: $51.23
Name: GE, Shares: 95, Price: $40.37
Name: MSFT, Shares: 50, Price: $65.10
Name: IBM, Shares: 100, Price: $70.44
Total number of stocks in portfolio: 7
Esta saída confirma que sua função read_portfolio está lendo corretamente o arquivo CSV e criando objetos Stock a partir de seus dados.
Formatação e Impressão dos Dados da Carteira
Nesta etapa, vamos criar uma função que nos ajudará a exibir os dados da carteira em uma tabela bem organizada. Uma carteira é uma coleção de ações, e é importante apresentar esses dados de forma clara e legível. É aí que a função print_portfolio(portfolio) entra em ação. Esta função receberá uma carteira como entrada e a exibirá em uma tabela com cabeçalhos e alinhamento adequado.
Formatação de Strings em Python
Em Python, existem várias maneiras de formatar strings. A formatação de strings é uma habilidade crucial, pois permite que você apresente dados de maneira mais organizada e amigável ao usuário.
- O operador
%é um estilo mais antigo de formatação de strings. É como um modelo onde você pode inserir valores em locais específicos em uma string. - O método
str.format()é outra maneira. Ele oferece mais flexibilidade e uma sintaxe mais limpa para formatar strings. - f-strings são um recurso introduzido no Python 3.6 e posterior. Eles são muito convenientes, pois permitem que você incorpore expressões dentro de literais de string.
Para este exercício, usaremos o operador %. Ele é particularmente útil quando você deseja criar colunas de largura fixa, que é exatamente o que precisamos para nossa tabela de carteira.
Instruções de Implementação
Primeiro, abra o arquivo
stock.pyno seu editor. Se já estiver aberto, ótimo. Este arquivo é onde escreveremos nossa funçãoprint_portfolio.Depois que o arquivo estiver aberto, procure o comentário
## TODO: Add print_portfolio(portfolio) function here. Este comentário é um marcador que nos diz onde adicionar nossa nova função.Abaixo desse comentário, adicione a seguinte função:
def print_portfolio(portfolio):
"""
Print the portfolio data in a nicely formatted table.
Args:
portfolio (list): A list of Stock objects
"""
## Print the header row
print('%10s %10s %10s' % ('name', 'shares', 'price'))
## Print a separator line
print('-' * 10 + ' ' + '-' * 10 + ' ' + '-' * 10)
## Print each stock in the portfolio
for stock in portfolio:
print('%10s %10d %10.2f' % (stock.name, stock.shares, stock.price))
Esta função primeiro imprime a linha de cabeçalho da tabela, depois uma linha separadora e, finalmente, percorre cada ação na carteira e imprime seus detalhes de forma formatada.
Depois de adicionar a função, salve o arquivo. Você pode fazer isso pressionando
Ctrl+Sou selecionando "File > Save" no menu. Salvar o arquivo garante que suas alterações sejam preservadas.Agora, precisamos testar nossa função. Crie um novo arquivo chamado
test_print.py. Este arquivo será nosso script de teste. Adicione o seguinte código a ele:
## test_print.py
from stock import read_portfolio, print_portfolio
## Read the portfolio from the CSV file
portfolio = read_portfolio('portfolio.csv')
## Print the portfolio as a formatted table
print_portfolio(portfolio)
Este script importa as funções read_portfolio e print_portfolio do arquivo stock.py. Em seguida, ele lê os dados da carteira de um arquivo CSV e usa nossa função print_portfolio recém-criada para exibi-los.
- Finalmente, execute o script de teste. Abra seu terminal e digite o seguinte comando:
python3 test_print.py
Se tudo estiver funcionando corretamente, você deverá ver uma saída como esta:
name shares price
---------- ---------- ----------
AA 100 32.20
IBM 50 91.10
CAT 150 83.44
MSFT 200 51.23
GE 95 40.37
MSFT 50 65.10
IBM 100 70.44
Esta saída confirma que sua função print_portfolio está funcionando conforme o esperado. Ela formata e exibe os dados da carteira em uma tabela com cabeçalhos e colunas alinhadas, tornando-a fácil de ler.
Entendendo a Formatação de Strings
Vamos analisar mais de perto como a formatação de strings funciona na função print_portfolio.
%10sé usado para formatar uma string. O10indica a largura do campo, e ossignifica string. Ele alinha a string à direita dentro de um campo com largura 10.%10dé para formatar um inteiro. O10é a largura do campo, edrepresenta um inteiro. Ele também alinha o inteiro à direita em um campo com largura 10.%10.2fé usado para formatar um float. O10é a largura do campo, e o.2especifica que queremos exibir o float com 2 casas decimais. Ele alinha o float à direita em um campo com largura 10.
Essa formatação garante que todas as colunas em nossa tabela sejam devidamente alinhadas, o que torna a saída muito mais fácil de ler e entender.
Resumo
Neste laboratório, você aprendeu como aprimorar uma classe Stock com novas funcionalidades. Você adicionou um método sell para simular a venda de ações, criou uma função read_portfolio para ler dados de ações de um arquivo CSV e convertê-los em objetos Stock, e desenvolveu uma função print_portfolio para exibir dados da carteira em uma tabela bem formatada.
Essas habilidades, incluindo a definição de métodos em uma classe, o trabalho com arquivos e a análise de dados, e a formatação da saída para melhor legibilidade, são fundamentais para a programação orientada a objetos em Python. Agora você pode aplicar esses conceitos para criar classes e utilitários mais complexos em seus programas Python.