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

Intermediate

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
Это Guided Lab, который предоставляет пошаговые инструкции, чтобы помочь вам учиться и практиковаться. Внимательно следуйте инструкциям, чтобы выполнить каждый шаг и получить практический опыт. Исторические данные показывают, что это лабораторная работа уровня средний с процентом завершения 75%. Он получил 80% положительных отзывов от учащихся.

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

Одним из способов форматирования строк в 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, чтобы улучшить свои навыки.