Saída de Dados Estruturados para Análise de Dados

Intermediate

This tutorial is from open-source community. Access the source code

Introdução

Esta seção é um ligeiro desvio, mas quando você trabalha com dados, frequentemente deseja produzir uma saída estruturada (tabelas, etc.). Por exemplo:

      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
Este é um Lab Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível intermediário com uma taxa de conclusão de 75%. Recebeu uma taxa de avaliações positivas de 80% dos estudantes.

Formatação de Strings

Uma maneira de formatar strings no Python 3.6+ é com f-strings.

>>> name = 'IBM'
>>> shares = 100
>>> price = 91.1
>>> f'{name:>10s} {shares:>10d} {price:>10.2f}'
'       IBM        100      91.10'
>>>

A parte {expressão:formato} é substituída.

É comumente usado com print.

print(f'{name:>10s} {shares:>10d} {price:>10.2f}')

Códigos de Formato

Códigos de formato (após o : dentro de {}) são semelhantes ao printf() em C. Códigos comuns incluem:

d       Decimal integer
b       Binary integer
x       Hexadecimal integer
f       Float as [-]m.dddddd
e       Float as [-]m.dddddde+-xx
g       Float, but selective use of E notation
s       String
c       Character (from integer)

Modificadores comuns ajustam a largura do campo e a precisão decimal. Esta é uma lista parcial:

:>10d   Integer right aligned in 10-character field
:<10d   Integer left aligned in 10-character field
:^10d   Integer centered in 10-character field
:0.2f   Float with 2 digit precision

Formatação de Dicionários

Você pode usar o método format_map() para aplicar formatação de strings a um dicionário de valores:

>>> s = {
    'name': 'IBM',
    'shares': 100,
    'price': 91.1
}
>>> '{name:>10s} {shares:10d} {price:10.2f}'.format_map(s)
'       IBM        100      91.10'
>>>

Ele usa os mesmos códigos que f-strings, mas pega os valores do dicionário fornecido.

Método format()

Existe um método format() que pode aplicar formatação a argumentos ou argumentos de palavra-chave (keyword arguments).

>>> '{name:>10s} {shares:10d} {price:10.2f}'.format(name='IBM', shares=100, price=91.1)
'       IBM        100      91.10'
>>> '{:>10s} {:10d} {:10.2f}'.format('IBM', 100, 91.1)
'       IBM        100      91.10'
>>>

Francamente, format() é um pouco verboso. Eu prefiro f-strings.

Formatação no Estilo C

Você também pode usar o operador de formatação %.

>>> 'The value is %d' % 3
'The value is 3'
>>> '%5d %-5d %10d' % (3,4,5)
'    3 4              5'
>>> '%0.2f' % (3.1415926,)
'3.14'

Isso requer um único item ou uma tupla à direita. Os códigos de formatação também são modelados após o printf() em C.

Nota: Esta é a única formatação disponível em strings de bytes.

>>> b'%s has %d messages' % (b'Dave', 37)
b'Dave has 37 messages'
>>> b'%b has %d messages' % (b'Dave', 37)  ## %b may be used instead of %s
b'Dave has 37 messages'
>>>

Exercício 2.8: Como formatar números

Um problema comum ao imprimir números é especificar o número de casas decimais. Uma maneira de corrigir isso é usar f-strings. Experimente estes exemplos:

>>> value = 42863.1
>>> print(value)
42863.1
>>> print(f'{value:0.4f}')
42863.1000
>>> print(f'{value:>16.2f}')
        42863.10
>>> print(f'{value:<16.2f}')
42863.10
>>> print(f'{value:*>16,.2f}')
*******42,863.10
>>>

A documentação completa sobre os códigos de formatação usados em f-strings pode ser encontrada aqui. A formatação também é, por vezes, realizada usando o operador % de strings.

>>> print('%0.4f' % value)
42863.1000
>>> print('%16.2f' % value)
        42863.10
>>>

A documentação sobre vários códigos usados com % pode ser encontrada aqui.

Embora seja comumente usado com print, a formatação de strings não está ligada à impressão. Se você quiser salvar uma string formatada, basta atribuí-la a uma variável.

>>> f = '%0.4f' % value
>>> f
'42863.1000'
>>>

Exercício 2.9: Coletando Dados

No Exercício 2.7, você escreveu um programa chamado report.py que calculava o ganho/perda de uma carteira de ações. Neste exercício, você começará a modificá-lo para produzir uma tabela como esta:

      Name     Shares      Price     Change
---------- ---------- ---------- ----------
        AA        100       9.22     -22.98
       IBM         50     106.28      15.18
       CAT        150      35.46     -47.98
      MSFT        200      20.89     -30.34
        GE         95      13.48     -26.89
      MSFT         50      20.89     -44.21
       IBM        100     106.28      35.84

Neste relatório, "Price" (Preço) é o preço atual da ação e "Change" (Mudança) é a mudança no preço da ação em relação ao preço de compra inicial.

Para gerar o relatório acima, você primeiro precisará coletar todos os dados mostrados na tabela. Escreva uma função make_report() que recebe uma lista de ações e um dicionário de preços como entrada e retorna uma lista de tuplas contendo as linhas da tabela acima.

Adicione esta função ao seu arquivo report.py. Veja como ela deve funcionar se você tentar interativamente:

>>> portfolio = read_portfolio('/home/labex/project/portfolio.csv')
>>> prices = read_prices('/home/labex/project/prices.csv')
>>> report = make_report(portfolio, prices)
>>> for r in report:
        print(r)

('AA', 100, 9.22, -22.980000000000004)
('IBM', 50, 106.28, 15.180000000000007)
('CAT', 150, 35.46, -47.98)
('MSFT', 200, 20.89, -30.339999999999996)
('GE', 95, 13.48, -26.889999999999997)
...
>>>

Exercício 2.10: Imprimindo uma tabela formatada

Refaça o loop for no Exercício 2.9, mas altere a instrução print para formatar as tuplas.

>>> for r in report:
        print('%10s %10d %10.2f %10.2f' % r)

          AA        100       9.22     -22.98
         IBM         50     106.28      15.18
         CAT        150      35.46     -47.98
        MSFT        200      20.89     -30.34
...
>>>

Você também pode expandir os valores e usar f-strings. Por exemplo:

>>> for name, shares, price, change in report:
        print(f'{name:>10s} {shares:>10d} {price:>10.2f} {change:>10.2f}')

          AA        100       9.22     -22.98
         IBM         50     106.28      15.18
         CAT        150      35.46     -47.98
        MSFT        200      20.89     -30.34
...
>>>

Pegue as instruções acima e adicione-as ao seu programa report.py. Faça com que seu programa pegue a saída da função make_report() e imprima uma tabela bem formatada, conforme mostrado.

Exercício 2.11: Adicionando alguns cabeçalhos

Suponha que você tenha uma tupla de nomes de cabeçalho como esta:

headers = ('Name', 'Shares', 'Price', 'Change')

Adicione código ao seu programa que pegue a tupla de cabeçalhos acima e crie uma string onde cada nome de cabeçalho seja alinhado à direita em um campo de 10 caracteres de largura e cada campo seja separado por um único espaço.

'      Name     Shares      Price      Change'

Escreva código que pegue os cabeçalhos e crie a string separadora entre os cabeçalhos e os dados a seguir. Esta string é apenas um monte de caracteres "-" sob cada nome de campo. Por exemplo:

'---------- ---------- ---------- -----------'

Quando terminar, seu programa deverá produzir a tabela mostrada no início deste exercício.

      Name     Shares      Price     Change
---------- ---------- ---------- ----------
        AA        100       9.22     -22.98
       IBM         50     106.28      15.18
       CAT        150      35.46     -47.98
      MSFT        200      20.89     -30.34
        GE         95      13.48     -26.89
      MSFT         50      20.89     -44.21
       IBM        100     106.28      35.84

Exercício 2.12: Desafio de Formatação

Como você modificaria seu código para que o preço inclua o símbolo de moeda ($) e a saída se pareça com isto:

      Name     Shares      Price     Change
---------- ---------- ---------- ----------
        AA        100      $9.22     -22.98
       IBM         50    $106.28      15.18
       CAT        150     $35.46     -47.98
      MSFT        200     $20.89     -30.34
        GE         95     $13.48     -26.89
      MSFT         50     $20.89     -44.21
       IBM        100    $106.28      35.84

Resumo

Parabéns! Você concluiu o laboratório de Formatação. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.