데이터 분석을 위한 구조화된 데이터 출력

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
이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 중급 레벨의 실험이며 완료율은 75%입니다.학습자들로부터 80%의 긍정적인 리뷰율을 받았습니다.

문자열 서식 지정 (String Formatting)

Python 3.6 이상에서 문자열 서식을 지정하는 한 가지 방법은 f-string을 사용하는 것입니다.

>>> 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}')

서식 코드 (Format codes)

서식 코드 ( {} 안의 : 뒤) 는 C 의 printf()와 유사합니다. 일반적인 코드는 다음과 같습니다.

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)

일반적인 수정자는 필드 너비와 소수점 정밀도를 조정합니다. 다음은 부분 목록입니다.

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

딕셔너리 서식 지정 (Dictionary Formatting)

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-string과 동일한 코드를 사용하지만, 제공된 딕셔너리에서 값을 가져옵니다.

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-string 을 선호합니다.

C 스타일 서식 지정 (C-Style Formatting)

서식 지정 연산자 %를 사용할 수도 있습니다.

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

이 방식은 오른쪽에 단일 항목 또는 튜플을 필요로 합니다. 서식 코드 또한 C 의 printf()를 모델로 합니다.

참고: 바이트 문자열에서 사용 가능한 유일한 서식 지정 방식입니다.

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

연습 문제 2.8: 숫자를 서식 지정하는 방법

숫자를 출력할 때 흔히 발생하는 문제는 소수점 자릿수를 지정하는 것입니다. 이를 해결하는 한 가지 방법은 f-string 을 사용하는 것입니다. 다음 예제를 시도해 보세요.

>>> 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-string 에서 사용되는 서식 코드에 대한 전체 문서는 여기에서 찾을 수 있습니다. 서식 지정은 문자열의 % 연산자를 사용하여 수행되기도 합니다.

>>> 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: 서식 지정된 표 출력

연습 문제 2.9 의 for-loop 를 다시 수행하되, 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-string 을 사용할 수도 있습니다. 예를 들어:

>>> 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 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.