Структурный вывод данных для анализа данных

PythonPythonBeginner
Практиковаться сейчас

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Этот раздел представляет собой небольшое отступление, но когда вы работаете с данными, вы часто хотите получать структурированный вывод (таблицы и т.д.). Например:

      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

Форматирование строк

Одним из способов форматирования строк в Python 3.6+ являются f-строки.

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

Часть {expression:format} заменяется.

Она обычно используется с print.

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

Форматирование строк

Коды форматирования (после : внутри {}) похожи на printf() в C. Общие коды включают:

d       Десятичное целое число
b       Двоичное целое число
x       Шестнадцатеричное целое число
f       Число с плавающей точкой в формате [-]m.dddddd
e       Число с плавающей точкой в формате [-]m.dddddde+-xx
g       Число с плавающей точкой, но с выборочным использованием экспоненциальной записи
s       Строка
c       Символ (из целого числа)

Общие модификаторы настраивают ширину поля и десятичную точность. Это частичный список:

:>10d   Целое число выравнивается по правому краю в поле шириной 10 символов
:<10d   Целое число выравнивается по левому краю в поле шириной 10 символов
:^10d   Целое число центрируется в поле шириной 10 символов
:0.2f   Число с плавающей точкой с точностью до 2 знаков после запятой

Форматирование словаря

Вы можете использовать метод format_map() для применения форматирования строк к словарю значений:

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

Он использует те же коды, что и f-строки, но берет значения из предоставленного словаря.

Метод format()

Существует метод format(), который может применять форматирование к позиционным или именованным аргументам.

>>> '{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'
>>>

Честно говоря, format() немного избыточный. Я предпочитаю f-строки.

Форматирование в стиле C

Вы также можете использовать оператор форматирования %.

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

Для этого требуется единичный элемент или кортеж справа. Форматирование кода также моделируется по printf() в C.

Примечание: это единственное форматирование, доступное для байтовых строк.

>>> b'%s has %d messages' % (b'Dave', 37)
b'Dave has 37 messages'
>>> b'%b has %d messages' % (b'Dave', 37)  ## %b может использоваться вместо %s
b'Dave has 37 messages'
>>>

Упражнение 2.8: Как форматировать числа

Одной из распространенных проблем при печати чисел является указание количества десятичных знаков. Одним из способов решения этой проблемы является использование f-строк. Попробуйте эти примеры:

>>> 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
>>>

Подробная документация по кодам форматирования, используемым в f-строках, доступна здесь. Форматирование также иногда выполняется с использованием оператора % для строк.

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

Документация по различным кодам, используемым с %, доступна здесь.

Хотя форматирование строк обычно используется с print, оно не связано с печатью. Если вы хотите сохранить отформатированную строку, просто присвойте ее переменной.

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

Упражнение 2.9: Сбор данных

В упражнении 2.7 вы написали программу под названием report.py, которая вычисляла прибыль/убыток портфеля акций. В этом упражнении вы будете начинать ее модифицировать, чтобы получить таблицу такого вида:

      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

В этом отчете "Price" - это текущая цена одной акции, а "Change" - это изменение цены акции от начальной цены покупки.

Для генерации вышеуказанного отчета вы сначала захотите собрать все данные, показанные в таблице. Напишите функцию make_report(), которая принимает список акций и словарь цен в качестве входных данных и возвращает список кортежей, содержащих строки вышеуказанной таблицы.

Добавьте эту функцию в файл report.py. Вот, как это должно работать, если вы попробуете его интерактивно:

>>> 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)
...
>>>
✨ Проверить решение и практиковаться

Упражнение 2.10: Печать отформатированной таблицы

Повторите цикл for из упражнения 2.9, но измените инструкцию print для форматирования кортежей.

>>> 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
...
>>>

Вы также можете развернуть значения и использовать f-строки. Например:

>>> 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
...
>>>

Возьмите вышеуказанные инструкции и добавьте их в программу report.py. Пусть ваша программа получает вывод функции make_report() и печатает красиво отформатированную таблицу, как показано выше.

✨ Проверить решение и практиковаться

Упражнение 2.11: Добавление заголовков

Предположим, у вас есть кортеж имен заголовков, такой как:

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

Добавьте в программу код, который берет вышеуказанный кортеж заголовков и создает строку, в которой каждое имя заголовка выравнивается по правому краю в поле шириной в 10 символов, а каждый столбец разделяется одним пробелом.

'      Name     Shares      Price      Change'

Напишите код, который берет заголовки и создает строку-разделитель между заголовками и последующими данными. Эта строка состоит из набора символов "-" под каждым именем поля. Например:

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

После завершения работы программа должна выводить таблицу, показанную в начале этого упражнения.

      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
✨ Проверить решение и практиковаться

Упражнение 2.12: Вызов к формату

Как бы вы модифицировали свой код, чтобы цена включала символ валюты ($), и вывод выглядел так:

      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
✨ Проверить решение и практиковаться

Резюме

Поздравляем! Вы завершили лабораторную работу по форматированию. Вы можете практиковаться в других лабораторных работах в LabEx, чтобы улучшить свои навыки.