2017년 3월 16일 목요일

스크랩] 올리면 가계빚 압박, 동결 땐 외환 유출..한은 `딜레마`

스크랩] 올리면 가계빚 압박, 동결 땐 외환 유출..한은 `딜레마`|[End economy]
무심천||조회 17|추천 0|2017.03.17. 13:48http://cafe.daum.net/Restorationjesus/JJ7L/17629 

python pandas series

Series 기초

앞서 Pandas에는 Series와 DataFrame이라는 두 종류의 자료구조가 있다고 했습니다. Pandas의 Series는 1차원 배열과 같은 자료 구조입니다. 파이썬 리스트와 튜플도 1차원 배열과 같은 자료구조인데 왜 Pandas에서는 Series라는 자료 구조를 추가로 만든 것일까요?
사실 Pandas의 Series는 어떤 면에서는 파이썬의 리스트와 비슷하고 어떤 면에서는 파이썬의 딕셔너리와 닮은 알쏭달쏭한 자료구조입니다. 지금부터 간단히 코드를 작성해가면서 Series라는 자료구조를 공부해 봅시다.
먼저 Series를 사용하기에 앞서 Pandas라는 모듈에서 직접 Series와 DataFrame을 로컬 네임스페이스로 import 합시다.
from pandas import Series, DataFrame
이미 앞서 여러 번 설명한 것처럼 모듈을 import 하는 방식에는 크게 세 가지가 있는데 이 중 하나를 선택해서 사용하면 됩니다. Pandas 모듈 내의 Series를 사용할 때도 꼭 위와 같은 방식으로 import 할 필요는 없습니다. 다음과 같은 방식도 사용 가능한데 이 경우에는 Series를 사용하고자 할 때 pandas.Series와 같이 이름을 적어줘야 합니다. 이와 달리 Series를 직접 로컬 네임스페이스로 import 한 경우에는 pandas는 생략하고 바로 Series라고만 적으면 됩니다.
import pandas
print(pandas.Series)
보통 Pandas 라이브러리를 사용할 때 Series와 DataFrame이라는 이름은 자주 사용하기 때문에 Series와 DataFrame을 로컬 네임스페이스로 직접 import 하는 방식을 더 많이 사용합니다.
표 13.1의 카카오 종가 데이터를 이번에는 Series를 사용하여 저장해 봅시다. Pandas의 Series는 사실 클래스입니다. 생성자로 다음과 같이 파이썬 리스트를 넘겨주면 해당 값에 포함하는 Series 객체를 생성해줍니다.
from pandas import Series, DataFrame

kakao = Series([92600, 92400, 92100, 94300, 92300])
print(kakao)
Series 객체를 생성할 때 따로 인덱스를 지정하지 않았다면 기본적으로 0부터 시작하는 정숫값으로 인덱싱됩니다.
0    92600
1    92400
2    92100
3    94300
4    92300
dtype: int64
그림 13.2는 kakao라는 변수가 바인딩하고 있는 Series 객체의 내부 구조를 그림으로 나타낸 것입니다. 그림 13.2처럼 Series 객체는 일차원 배열과 달리 값뿐만 아니라 각 값에 연결된 인덱스 값도 동시에 저장합니다.
그림 13.2 Series 객체의 내부 구조
앞의 예제 코드에서처럼 Series 객체 생성 시에 인덱스값을 따로 지정하지 않으면 기본적으로 Series 객체는 0부터 시작하는 정숫값을 사용하여 인덱싱합니다. 따라서 다음과 같이 정수 인덱스값을 통해 데이터에 접근할 수 있습니다.
print(kakao[0])
print(kakao[2])
print(kakao[4])
출력 결과를 살펴보면 Series 객체를 생성할 때 인자로 넘겨준 리스트 내의 데이터 순서를 기준으로 인덱싱되어 있음을 알 수 있습니다.
92600
92100
92300
지금까지 배운 내용만으로는 Series 자료구조가 파이썬의 리스트와 별반 달라 보이지 않습니다. Series 객체에 데이터가 저장되며 저장된 데이터는 0부터 순서대로 인덱싱됩니다. 특히 리스트와 마찬가지로 표 13.1에서 날짜 데이터가 저장되지 않았습니다. 그렇지만 이정도로 아직 실망하긴 이릅니다.
Series 객체는 파이썬 리스트와 달리 인덱싱 값을 지정할 수 있습니다. 예를 들어 표 13.1 데이터에 대한 Series 객체 생성은 다음 예제 코드처럼 입력해주면 됩니다. index에 인덱싱할 값을 넘겨주면 해당 값으로 인덱싱됩니다.
kakao2 = Series([92600, 92400, 92100, 94300, 92300], index=['2016-02-19',
                                                            '2016-02-18',
                                                            '2016-02-17',
                                                            '2016-02-16',
                                                            '2016-02-15'])
print(kakao2)
kakao2 객체의 출력 값을 보면 데이터가 어떻게 저장되어 있는지 확인할 수 있습니다. Series 객체 내의 데이터는 1차원으로 저장되어 있지만 파이썬의 딕셔너리와 유사하게 값과 이에 대응되는 인덱스 값이 서로 연결되어 있습니다.
2016-02-19    92600
2016-02-18    92400
2016-02-17    92100
2016-02-16    94300
2016-02-15    92300
dtype: int64
kakao2 객체(정확히는 kakao2가 바인딩하고 있는 Series 객체)를 그림으로 나타내면 그림 13.3과 같습니다. 그림 13.3과 그림 13.2를 비교해보면 Value 부분은 같지만 각 Value에 대한 인덱스 값이 다른 것을 확인할 수 있습니다.
그림 13.3 Series 객체의 내부 구조 (2)
kakao2라는 Series 객체는 인덱스값으로 날짜에 해당하는 문자열을 지정했기 때문에 정숫값으로 인덱싱하는 것 대신 날짜를 의미하는 문자열을 사용하여 각 날짜에 대한 종가를 바로 얻어올 수 있습니다.
print(kakao2['2016-02-19'])
print(kakao2['2016-02-18'])
위 코드의 출력 값을 확인해보면 인덱스값으로 사용한 날짜에 대한 종가가 정상적으로 출력된 것을 확인할 수 있습니다.
92600
92400
Pandas의 Series 객체에는 그림 13.2나 13.3과 같이 인덱스와 값이 저장되어 있는데 Series 객체의 index와 values라는 이름의 속성을 통해 접근할 수 있습니다. 예를 들어 kakao2 객체의 인덱스 값과 저장된 종가를 각각 출력하는 코드는 다음과 같이 구현할 수 있습니다.
for date in kakao2.index:
    print(date)

for ending_price in kakao2.values:
    print(ending_price)
위 코드를 실행한 결과는 다음과 같습니다.
2016-02-19
2016-02-18
2016-02-17
2016-02-16
2016-02-15
92600
92400
92100
94300
92300
이번에는 Series 객체의 덧셈 연산에 대해서 알아보겠습니다. 먼저 여러분이 네이버, SK, KT에 대해 10, 20, 30주의 주식을 보유하고 있다고 가정해 봅시다. 그리고 여러분의 친구는 KT, 네이버 SK에 대해 각각 10, 30, 20주를 보유하고 있습니다. 여러분과 여러분의 친구가 보유하고 있는 네이버, SK, KT의 주식은 몇 주일까요?
위 같은 경우는 우리 주변에서도 자주 발생합니다. 일반적으로 어떤 데이터를 여러 명이 나눠서 취합하게 되면 데이터를 서로 다르게 인덱싱하는 경우가 종종 발생합니다. Pandas의 Series는 서로 다르게 인덱싱된 데이터에 대해서도 알아서 덧셈 연산을 처리해 줍니다.
예를 들어 앞서 예시로 들었던 네이버, SK, KT의 주식 보유 현황은 Series로 다음과 같이 표현할 수 있습니다.
from pandas import Series, DataFrame

mine   = Series([10, 20, 30], index=['naver', 'sk', 'kt'])
friend = Series([10, 30, 20], index=['kt', 'naver', 'sk'])
위 코드를 그림으로 나타내면 그림 13.4와 같습니다. 그림 13.4를 참조하면 mine이라는 변수와 friend라는 변수가 바인딩하고 있는 Series 객체의 인덱싱 순서가 서로 다른 것을 확인할 수 있습니다.
그림 13.4 Series 객체의 구조 (3)
Pandas의 Series는 그림 13.4와 같이 인덱싱이 서로 다른 경우에도 알아서 인덱싱이 같은 값들끼리 덧셈 연산을 수행합니다. 다음과 같이 mine과 friend를 더해서 merge를 만들어 봅시다.
merge = mine + friend
print(merge)
위 코드의 출력 값을 확인해보면 같은 인덱스를 갖는 값들끼리 정상적으로 덧셈이 수행된 것을 확인할 수 있습니다.
kt       40
naver    40
sk       40
dtype: int64
마지막 편집일시 : 2016년 12월 5일 2:23 오후
댓글 3 피드백
정말 사소한 것인데요 "그리고 여러분의 와이프는 KT, 네이버 SK에 대해" 문장에서 네이버와 SK사이에 ,(콤마)가 빠진것 같습니다. - sc, 2016년 4월 30일 4:15 오전
sc님, 감사합니다. 수정했습니다. ^^ - 조대표, 2016년 5월 7일 1:17 오후
중간에 index, value 설명하시는 부분에서, 종가의 의미로 ending_price라고 표현하셨는데, ending_ 대신에 closing_ 을 사용하시면, 보다 자연스러울 것 같습니다. (물론, 문맥과는 전혀 상관없습니다. 나중에 책으로 출판하시는 것 때문에, 말씀드립니다.^^;) - GuruAlex, 2017년 2월 21일 10:17 오후
※ 댓글 작성은 로그인이 필요합니다. (로그인이 귀찮으시면 피드백을 이용해 주세요 ^^)