[누구나 따라 하는 금융 데이터 분석] - 핵심 파이썬 기본기 I

알파프라임

앞으로 진행될 금융 데이터 분석 콘텐츠에서는 주피터 노트북(공식 홈페이지)을 활용합니다. 이번 콘텐츠에서는 데이터 분석에 꼭 필요한 핵심적인 파이썬 기초 문법과 연산, 자료구조에 대해서 간단하게 정리해 보았습니다. 주피터 노트북 환경에서 작성한 문서이기 때문에 주피터 노트북을 켜고 따라서 실습해 보시면 쉽게 이해하실 수 있습니다. 주피터 노트북의 기초적인 활용법은 아래 콘텐츠에 정리되어 있습니다. 참고하여 진행해 주시면 되겠습니다.

[누구나 따라 하는 금융 데이터 분석] - 주피터 노트북 기초 활용법

주석 코드(code comments)

주석 코드는 프로그래머가 프로그램의 소스코드 상에 남기는 메모입니다. 주석의 목적은 소스 코드를 명확히 하는 것과 더불어 다른 사람들이 코드를 쉽게 따라갈 수 있도록 안내해주는 역할을 합니다. 코드가 실행될 때 주석 처리된 모든 내용은 무시됩니다. 파이썬에서 주석은 # 을 통해 작성할 수 있습니다(# 주석 내용). #이 포함된 줄은 어떤 내용을 입력해도 주석 처리됩니다.

In [ ]:

# 주석 처리 연습

# 이 줄들은 프로그램상에 전혀 영향을 주지 않습니다.

# 이후의 어떤 내용이 와도 코드로 실행되지 않습니다.

큰따옴표 세 개를 사용한 주석(""" 이곳에 입력된 텍스트 """)을 보신 분들도 있을 겁니다. 여러 줄의 주석 처리를 할 때 사용되기도 하지만 정확하게 말하자면 이는 docstring 이라 불리는 문자열 타입(string)의 특수한 형태입니다. docstring은 함수의 목적과 기능을 설명하는데 주로 사용됩니다.

In [ ]:

"""docstring : special string"""

주석 처리가 되어있는 부분이 있다면 항상 잘 살펴보는 습관을 가지는 것이 중요합니다.

변수(Variables)

변수는 값에 이름을 붙여 사용할 수 있도록 해줍니다. 어떤 값을 저장해놓고 나중에 반복적으로 사용하게 될 경우, 그 값에 이름을 붙여 변수에 저장할 수 있습니다. 프로그래밍에서의 변수 사용은 기본적으로 수학에서의 사용과 유사하다고 생각하시면 됩니다. 하지만 파이썬은 추가적으로 변수마다 다른 데이터 타입을 제공합니다.

오늘 살펴볼 가장 기본적인 변수 타입들은 integers(정수형), floating point numbers(소수점), booleans(참/거짓), 그리고 strings(문자열)이 있습니다.

integers(정수형)은 수학에서의 정수와 같습니다. 파이썬 내장 함수인 print 함수를 통해 변수의 값과 타입을 출력해 볼 수 있습니다.

In [3]:

my_integer = 50

print(my_integer, type(my_integer))

50

타입에 관계없이 변수는 등호 기호(=)를 통해 값을 할당할 수 있습니다. 변수 이름은 대/소문자를 구분하기에 대/소문자를 변경할 경우 완전히 다른 변수가 됩니다.

In [4]:

one = 1

print(One)

---------------------------------------------------------------------------

NameError Traceback (most recent call last)

in ()

1 one = 1

----> 2 print(One)

NameError: name 'One' is not defined

첫 글씨가 대문자인 One이라는 변수는 값이 할당되지 않았기 때문에 오류가 발생합니다.

float 이라 불리는 변수 타입은 수학에서 실수(real number)를 나타낸다고 생각하시면 됩니다. float 변수를 선언하기 위해서는 소수점(.)을 찍어주시거나 할당하려는 값이 float 임을 나타내 주어야 합니다.

In [6]:

my_float = 1.0

print(my_float, type(my_float))

my_float = float(1)

print(my_float, type(my_float))

1.0

1.0

int 형태의 변수들은 소수점을 잘라내 버리는 반면 float 형태는 특별한 지시가 없다면 소수점을 반올림하거나 잘라내지 않습니다. 따라서 수치 계산에 있어서는 float 형태의 변수가 더 적합하다고 할 수 있습니다.

참고) 이전에 데이터 값이 float 형태임을 나타내기 위해 float()이라는 함수를 사용하였습니다. 이와 마찬가지로 int() 함수를 사용하여 데이터 값을 강제로 int 형태로 처리하도록 할 수 있습니다. 이때, 소수점은 무조건 버려집니다.

In [11]:

my_int = int(3.14159)

print(my_int, type(my_int))

3

이를 응용하여 다음과 같이 반올림 함수를 만들 수 있습니다.

In [15]:

x = 3.49

int(x + 0.5)

Out[15]:

3

In [16]:

x = 3.5

int(x + 0.5)

Out[16]:

4

Strings(문자열) 타입은 텍스트 값을 저장할 수 있습니다. 작은따옴표('')나 큰따옴표("")를 사용하여 문자열 변수를 할당할 수 있습니다.

In [18]:

my_string = 'This is a string with single quotes'

print(my_string)

my_string = "This is a string with double quotes"

print(my_string)

This is a string with single quotes

This is a string with double quotes

작은따옴표와 큰따옴표 모두 사용할 수 있기에 다음과 같이 작은따옴표나 큰따옴표 자체를 문자열에 저장할 수 있습니다.

In [19]:

my_string = '"Jabberwocky", by Lewis Carroll'

print(my_string)

my_string = "'Twas brillig, and the slithy toves / Did gyre and gimble in the wabe;"

print(my_string)

"Jabberwocky", by Lewis Carroll '

Twas brillig, and the slithy toves / Did gyre and gimble in the wabe;

Booleans, 또는 bools 타입은 이진 변수입니다. bool 타입은 True(참)False(거짓) 중 하나의 값만 가질 수 있습니다. 그렇기 때문에 이진 변수라고 불리는 것입니다. 이런 bool 타입은 프로그래밍에서 Logical Operators라는 이름으로 활용되는데 자세한 내용은 추후 다루도록 하겠습니다.

In [20]:

my_bool = True

print(my_bool, type(my_bool))

True

파이썬에는 위에서 살펴본 데이터 타입 이외에도 많은 타입들이 있지만 이것들이 가장 기본적인 데이터 타입이기에 살펴보았습니다. 이번 튜토리얼을 진행하면서 추가적으로 몇 가지의 타입들을 더 살펴보도록 하겠습니다.

기초 수학 연산(Basic Math)

파이썬은 기본적으로 내장된 수학 함수들을 제공합니다. math 패키지를 불러와서 추가적인 수학 함수들을 사용할 수도 있습니다.

+, -, /, 그리고 * 와 같은 기본 4칙연산이 지원되며 지수 계산은 **, 나머지(modular) 연산은 % 기호로 계산이 가능합니다.

In [23]:

print('Addition: ', 2 + 2)

print('Subtraction: ', 7 - 4)

print('Multiplication: ', 2 * 5)

print('Division: ', 10 / 2)

print('Exponentiation: ', 3**2)

# 15를 4로 나눈 나머지

print('Modulo:', 15 % 4)

Addition: 4

Subtraction: 3

Multiplication: 10

Division: 5.0

Exponentiation: 9

Modulo: 3

이런 연산은 물론 변수에게도 적용이 가능합니다.

In [25]:

first_integer = 4

second_integer = 5

print(first_integer * second_integer)

20

In [30]:

first_integer = 11

second_integer = 3

print(first_integer / second_integer)

3.6666666666666665

이외에 파이썬에서 자주 쓰이는 수학 함수들은 다음과 같습니다.

abs()

round()

max()

min()

sum()

함수 이름에서 유추할 수 있듯 각각의 기능을 수행합니다. abs() 는 absolute value 함수로써 절댓값을 반환합니다. round() 는 반올림 함수로 지정된 소수점 자릿수에 맞게 반올림된 값을 반환합니다. Default 값은 0입니다. max()min() 함수는 숫자열(collection of numbers)에 대해 각각 최댓값과 최솟값을 반환합니다. sum() 함수는 숫자열에 대한 합을 반환합니다. 숫자열을 파이썬에서 어떻게 표현하는지는 곧 살펴보도록 하겠습니다.

이외 추가적인 수학 함수는 math 패키지를 통해 불러올 수 있습니다.

In [1]:

import math

math 라이브러리에는 다양한 수학 함수들이 구축되어 있습니다. 자세한 내용은 documentation을 통해 확인 가능합니다.

In [38]:

print('Pi: ',math.pi)

print("Euler's Constant: ", math.e)

Pi: 3.141592653589793

Euler's Constant: 2.718281828459045

In [2]:

print('Cosine of pi: ', math.cos(math.pi))

Cosine of pi: -1.0

기초 자료구조

리스트(Lists)

파이썬에서 사용되는 list(리스트)는 순서가 있는 객체의 모음(ordered collection of objects)으로 어떤 데이터 타입이라도 담을 수 있습니다. 리스트는 대괄호( [ ] )를 통해 선언할 수 있습니다.

In [3]:

my_list = [1, 2, 3]

print(my_list)

[1, 2, 3]

대괄호 안에 인덱스를 입력하여 리스트 안의 내용(element)에 접근할 수 있습니다.

In [4]:

print(my_list[0])

print(my_list[2])

1

3

파이썬에서 인덱싱은 숫자 0부터 시작합니다. 길이가 n인 리스트가 있다면 처음 내용물은 인덱스 번호 0번에 저장되고 다음 내용물은 인덱스 번호 1번에 저장됩니다. 따라서 마지막 내용물은 n−1 번 인덱스 상에 저장되게 됩니다. 존재하지 않는 인덱스에 접근할 경우 에러 메시지가 출력되게 됩니다.

In [5]:

print('The first, second, and third list elements: ',

my_list[0], my_list[1], my_list[2])

print('Accessing outside the list bounds causes an error: ',

my_list[3])

The first, second, and third list elements: 1 2 3

---------------------------------------------------------------------------

IndexError Traceback (most recent call last)

in ()

2 my_list[0], my_list[1], my_list[2])

3 print('Accessing outside the list bounds causes an error: ',

----> 4 my_list[3])

IndexError: list index out of range

리스트에 몇 개의 내용물이 있는지는 len() 함수를 통해 확인할 수 있습니다.

In [6]:

print(len(my_list))

3

리스트에 내용물을 변경하고 싶다면 다음과 같이 해당 인덱스 값을 바꾸어 주면 됩니다.

In [7]:

print(my_list)

my_list[0] = 42

print(my_list)

[1, 2, 3]

[42, 2, 3]

이는 string(문자열) 타입이 처리되는 방식과 완전히 다른 방식입니다. 리스트 구조는 위와 같이 내용물의 변경이 자유롭게 가능하지만 string 타입과 같은 몇몇 데이터 타입의 경우 내용물의 변경이 불가능합니다. 이와 같은 변경 불가능(immutable) 데이터 타입은 일단 만들어지면 새로운 객체를 만들지 않는 이상 변경이 불가능합니다.

In [9]:

my_string = "Strings never change"

my_string[0]

Out[9]:

'S'

In [10]:

my_string[0] = 'Z'

---------------------------------------------------------------------------

TypeError Traceback (most recent call last)

in ()

----> 1 my_string[0] = 'Z'

TypeError: 'str' object does not support item assignment

위에서 설명하였듯 리스트는 어떤 데이터 타입도 담을 수 있습니다. 다음과 같이 리스트 안에 문자열을 저장할 수 있습니다.

In [11]:

my_list_2 = ['one', 'two', 'three']

print(my_list_2)

['one', 'two', 'three']

또한 리스트는 다음과 같이 여러 가지 서로 다른 타입들을 한 번에 담을 수 있습니다.

In [12]:

my_list_3 = [True, 'False', 42]

두 가지 리스트를 붙여서 하나로 만들고 싶다면 다음과 같이 + 기호를 통해 하나의 리스트로 붙일 수 있습니다.

In [13]:

my_list_4 = my_list + my_list_2 + my_list_3

print(my_list_4)

[42, 2, 3, 'one', 'two', 'three', True, 'False', 42]

슬라이싱(Slicing) 기법

리스트에서 하나의 데이터가 아닌 특정 그룹의 데이터에 접근하고자 할 때 슬라이싱(slicing) 기법을 활용할 수 있습니다. 콜론(:) 기호를 통해 리스트를 슬라이싱 할 수 있습니다.

In [14]:

my_list = ['friends', 'romans', 'countrymen', 'lend', 'me', 'your', 'ears']

In [15]:

print(my_list[2:4])

['countrymen', 'lend']

위와 같이 :을 사용하여 리스트 상에서 특정 인덱스 그룹에 대한 선택을 할 수 있습니다. 인덱스 2번 위치에 있는 데이터부터 4번 보다 작은 위치에 있는 데이터(2 이상 4미만)에 접근한 모습입니다.

다음과 같이 콜론 뒤에 숫자를 비운다면 특정 지점 이후 모든 데이터에 접근할 수 있습니다.

In [16]:

print(my_list[1:])

['romans', 'countrymen', 'lend', 'me', 'your', 'ears']

이와 비슷하게 콜론 앞에 숫자를 비운다면 특정 지점 이전까지의 데이터에 접근할 수 있습니다.

In [17]:

print(my_list[:4])

['friends', 'romans', 'countrymen', 'lend']

음수 인덱스를 입력할 경우 마지막 인덱스부터 카운팅 하여 해당 데이터에 접근할 수 있습니다. 예를 들어 다음과 같이 -1인덱스에 접근한다면 해당 리스트의 마지막 데이터 값이 출력됩니다.

In [18]:

print(my_list[-1])

ears

0:7:2 와 같이 세 번째 숫자를 입력하여 슬라이싱을 할 수 있습니다. 세 번째 숫자의 의미는 건너뛸 간격의 사이즈(step size)입니다.

In [19]:

print(my_list[0:7:2])

['friends', 'countrymen', 'me', 'ears']

위의 코드를 자세히 살펴보면 먼저 0:7은 전체 리스트를 선택했음을 의미합니다(인덱스 0에서 6까지를 의미하기 때문입니다). 그리고 마지막에 step size '2'를 입력하였습니다. 그 결과 0번, 2번, 4번, 6번에 해당하는 데이터 값들이 출력됩니다.

위와 같이 전체 리스트에 대해 step size를 적용할 경우 아래 코드와 같이 시작과 끝 번호에 해당하는 값을 생략해도 무관합니다.

In [20]:

print(my_list[::2])

['friends', 'countrymen', 'me', 'ears']

모든 숫자를 생략하고 : 만 입력할 경우 자동적으로 전체 리스트를 선택하게 됩니다.

In [22]:

print(my_list[:])

['friends', 'romans', 'countrymen', 'lend', 'me', 'your', 'ears']

다음과 같이 step size 위치에 음수인 -1을 넣으면 간단하게 역순으로 배열된 리스트를 얻을 수 있습니다.

In [24]:

print(my_list[::-1])

['ears', 'your', 'me', 'lend', 'countrymen', 'romans', 'friends']

numpy와 같은 패키지에는 행렬을 표현하는 자료구조가 따로 있지만 파이썬 자체에는 행렬을 구현하는 자료구조가 따로 없습니다. 따라서 파이썬 자체에서 행렬을 구현하기 위해서는 리스트 안의 리스트 구조를 사용합니다.

파이썬의 range()라는 내장함수를 통해 리스트를 생성할 수 있습니다. range() 함수는 몇 가지 형태의 입력을 받을 수 있으며 list() 명령어와 같이 사용하여 입력 값에 대한 리스트를 얻을 수 있습니다.

(파이썬 2의 경우 range()를 단독으로 사용하면 리스트를 얻을 수 있지만 파이썬 3에서는 list(range()) 와 같이 사용하여야 원하는 리스트를 얻을 수 있습니다.)

In [29]:

b = 10

my_list = list(range(b))

print(my_list)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

리스트 슬라이싱 기법들을 동일하게 적용할 수 있습니다.

In [31]:

a = 3

b = 10

my_list = list(range(a, b))

print(my_list)

[3, 4, 5, 6, 7, 8, 9]

In [33]:

a = 3

b = 10

step = 2

my_list = list(range(a, b, step))

print(my_list)

[3, 5, 7, 9]

튜플(Tuples)

튜플(Tuples) 자료구조는 리스트와 비슷한 데이터 타입으로 서로 다른 종류의 데이터 타입들을 내용물로 가질 수 있습니다. 핵심이 되는 차이점은 튜플은 변경 불가능(immutable) 하다는 것입니다. 내용물들 사이에 쉼표(,)를 입력하여 튜플을 선언할 수 있습니다. 일반적으로 튜플을 선언할 때 괄호( ( ) )를 사용하여 묶어주는 것이 코드 가독성에 좋습니다.

In [34]:

my_tuple = 'I', 'have', 30, 'cats'

print(my_tuple)

('I', 'have', 30, 'cats')

In [35]:

my_tuple = ('I', 'have', 30, 'cats')

print(my_tuple)

('I', 'have', 30, 'cats')

위에서 언급하였듯 튜플은 변경 불가능합니다. 어떤 부분도 접근을 하여 수정이 불가능합니다.

In [37]:

# 'cats' 값을 'dogs'로 바꾸려 한다면 에러가 발생합니다.

my_tuple[3] = 'dogs'

---------------------------------------------------------------------------

TypeError Traceback (most recent call last)

in ()

1 # 'cats' 값을 'dogs'로 바꾸려 한다면 에러가 발생합니다.

----> 2 my_tuple[3] = 'dogs'

TypeError: 'tuple' object does not support item assignment

리스트 슬라이싱 기법을 그대로 사용할 수 있습니다.

In [38]:

print(my_tuple[1:3])

('have', 30)

리스트와 마찬가지로 + 기호를 통해 합칠 수 있습니다.

In [39]:

my_other_tuple = ('make', 'that', 50)

print(my_tuple + my_other_tuple)

('I', 'have', 30, 'cats', 'make', 'that', 50)

다음과 같이 튜플에 있는 값들을 풀어서(unpacking) 각 변수에 할당할 수 있습니다.

In [40]:

str_1, str_2, int_1 = my_other_tuple

print(str_1, str_2, int_1)

make that 50

이렇게 값들을 풀어줄 때는 튜플에 있는 값들이 순서대로 왼쪽에 입력한 변수들에 할당됩니다.

집합(Sets)

집합(Sets) 자료구조는 순서가 없고(unordered) 중복된 값을 제거하는 자료구조입니다. 학창시절 수학 책 맨 앞에 나와 열심히 공부했던 집합의 개념과 거의 유사하다고 생각하시면 됩니다. Set은 중괄호 ( { } )를 사용하여 정의할 수 있습니다.

In [43]:

things_i_like = {'dogs', 7, 'the number 4', 4, 4, 4, 42, 'lizards', 'man I just LOVE the number 4'}

print(things_i_like, type(things_i_like))

{'lizards', 4, 'the number 4', 7, 'dogs', 42, 'man I just LOVE the number 4'}

출력 결과를 살펴봤을 때 중복되어 포함된 4는 중복이 제거되어 한 번만 출력된 것을 확인할 수 있습니다.

다음과 같이 set() 함수를 통해 리스트로부터 set 자료구조 형태를 만들어 낼 수 있습니다.

In [45]:

animal_list = ['cats', 'dogs', 'dogs', 'dogs', 'lizards', 'sponges',

'cows', 'bats', 'sponges']

animal_set = set(animal_list)

print(animal_set) # 리스트에서 중복된 값을 제거할 수 있습니다.

{'lizards', 'dogs', 'cows', 'sponges', 'cats', 'bats'}

len() 함수를 활용하여 몇 종류의 동물이 있는지 다음과 같이 볼 수 있습니다.

In [46]:

print(len(animal_set))

6

Set 타입은 순서가 없기 때문set[0]와 같이 특정 인덱스 값을 통해 데이터에 접근할 수 없습니다. 하지만 다음과 같이 어떤 원소가 들어있는지 체크는 가능합니다.

In [47]:

# 'in' 키워드를 사용하여 'cats' 가 animal_set에 들어있는지 확인 가능합니다.

'cats' in animal_set

Out[47]:

True

String 'cats' 가 animal_set에 들어가 있기 때문에 True 값이 반환됩니다.

학창시절 배운 교집합과 합집합 연산을 &| 연산자를 통해 구현할 수 있습니다.

In [49]:

# 교집합 연산을 수행하여 출력합니다.

print(animal_set & things_i_like)

{'lizards', 'dogs'}

In [51]:

# 합집합 연산을 수행하여 출력합니다.

print(animal_set | things_i_like)

{'lizards', 4, 'the number 4', 7, 'dogs', 42, 'cows', 'sponges', 'cats', 'man I just LOVE the number 4', 'bats'}

이 외에도 set과 관련된 다양한 파이썬 내장함수들을 살펴보시려면 공식 Documentation 을 확인해 주세요.

딕셔너리(Dictionaries)

딕셔너리는 또 하나의 가장 중요한 자료구조 형태로 중괄호( { } )와 콜론(:)을 사용하여 정의할 수 있습니다.

중괄호는 딕셔너리의 처음과 끝부분을 나타내고 콜론 기호는 키(key) 와 값(value)의 쌍을 나타냅니다. 딕셔너리는 본질적으로 key-value의 쌍으로 이루어진 집합(set) 자료구조입니다. 딕셔너리의 키(key)는 변경 불가능한 자료형 이어야 합니다. 따라서 문자열(string)과 튜플(tuple)은 키(key)로 쓰일 수 있습니다. Key 값들은 추가되거나 삭제가 가능합니다.

아래의 예제는 딕셔너리를 생성하는 예제입니다. 여기서 Key는 책의 장르를 나타내는 string 타입의 데이터이고 value는 list 타입으로 해당 Key에 속하는 책들을 담고 있습니다.

In [52]:

my_dict = {"High Fantasy": ["Wheel of Time", "Lord of the Rings"],

"Sci-fi": ["Book of the New Sun", "Neuromancer", "Snow Crash"],

"Weird Fiction": ["At the Mountains of Madness", "The House on the Borderland"]}

다음과 같이 접근을 원하는 Key를 입력하여 해당하는 Value를 확인할 수 있습니다.

In [53]:

print(my_dict["Sci-fi"])

['Book of the New Sun', 'Neuromancer', 'Snow Crash']

어떤 Key 값에 연결된 Value를 자유롭게 수정할 수 있습니다.

In [54]:

my_dict["Sci-fi"] = "I can't read"

print(my_dict["Sci-fi"])

I can't read

새로운 key-value 쌍을 추가하고자 한다면 다음과 같이 선언해 주면 됩니다.

In [55]:

my_dict["Historical Fiction"] = ["Pillars of the Earth"]

print(my_dict["Historical Fiction"])

['Pillars of the Earth']

my_dict에 새로운 Key와 Value가 추가되었는지 확인해 보도록 하겠습니다.

In [56]:

print(my_dict)

{'High Fantasy': ['Wheel of Time', 'Lord of the Rings'], 'Sci-fi': "I can't read", 'Weird Fiction': ['At the Mountains of Madness', 'The House on the Borderland'], 'Historical Fiction': ['Pillars of the Earth']}

이번 콘텐츠에서는 파이썬의 가장 기본적인 문법과 자료구조에 대해 정리해 보았습니다. 다음 콘텐츠에서는 파이썬에서의 문자열, 조건문, 반복문 그리고 함수와 같은 또다른 핵심적인 기본기에 대해 정리해 보도록 하겠습니다. 질문이나 더 궁금한 점은 댓글로 올려주시면 저에게도 큰 도움이 될 것 같습니다! 다음 포스팅도 기대해주시길 바랍니다.

더 유익한 정보를 얻고 싶으시다면 페이스북 알파스퀘어 페이지를 방문해주세요!

차세대 주식투자 플랫폼, 알파스퀘어에서 스마트한 주식투자를 경험해보세요!

기업문화 엿볼 때, 더팀스

로그인

/