본문 바로가기

Prev Contents/Wrangling

[파이썬 라이브러리를 활용한 데이터 분석] 8~11일차 (181~235p)

5. pandas 시작하기

8에서 11일 차 (2020-06-18~21)도 이 책으로 시작

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9791162241905&orderClick=LEa&Kc=

 

파이썬 라이브러리를 활용한 데이터 분석 - 교보문고

영화 평점, 이름통계, 선거 데이터 등 실사례 사용 | ★ 『파이썬 라이브러리를 활용한 데이터 분석』 드디어 개정!이 책의 초판이 출간된 2012년은 pandas 개발 초기로, 파이썬용 오픈소스 데이터

www.kyobobook.co.kr

아래의 요약은 책을 충실히 요약한 것이 아닌 오늘 공부한 것의 정리일 뿐입니다.
저자의 코드 예제 github repository: http://github.com/wesm/pydata-book
자세한 내용 책을 사서 보시거나 영문판의 경우 저자의 홈페이지에 3판의 open edition이 있습니다 (https://wesmckinney.com/book/).

 

GitHub - wesm/pydata-book: Materials and IPython notebooks for "Python for Data Analysis" by Wes McKinney, published by O'Reilly

Materials and IPython notebooks for "Python for Data Analysis" by Wes McKinney, published by O'Reilly Media - GitHub - wesm/pydata-book: Materials and IPython notebooks for "Pyth...

github.com

 

Python for Data Analysis, 3E

About the Open Edition The upcoming 3rd edition of Python for Data Analysis is available as an “Open Access” HTML version on this site https://wesmckinney.com/book in addition to the usual print and e-book formats. This is currently an Early Release ve

wesmckinney.com

독자에게 전하는 조언:

1) 데이터 분석을 생산적으로 하기 위해 파이썬으로 훌륭한 소프트웨어를 개발할 수 있을 정도로 파이썬 고수가 되어야 할 필요는 없다고 생각한다.
2) Numpy의 깊은 이해가 필수 사항은 아니며, 배열 위주의 프로그래밍과 생각하는 방법에 능숙해지는 것이 과학 계산의 고수가 되는 지름길이다.

들어가기 전

배열 기반 계산 스타일을 많이 차용했다.
표 형식의 데이터나 다양한 형태의 데이터를 다루는 데 초점을 맞춰 설계했다.

import pandas as pd  # import 컨벤션

from pandas import Series, DataFrame  # 로컬 네임스페이스로 임포트 하는 것이 더 편하다.

5.1 pandas 자료 구조 소개

Series, DataFrame에 익숙해 지자.

5.1.1 Series

pd.Series()
일련의 객체를 담을 수 있는 1차원 배열같은 자료구조 (모든 Numpy 자료형을 담을 수 있다.)
배열과 색인 객체를 각각 valuesindex 속성을 통해 얻을 수 있다.
색인으로 라벨을 사용 - 색인의 배열로 해석
Numpy 배열 연산을 수행해도 색인-값 연결이 유지된다.
Series는 색인값에 데이터값을 매핑하고 있으므로 파이썬의 사전형과 비슷하다. - 사전형을 대체해서 사용 가능
파이썬 사전 객체로부터 Series 객체를 생성할 수 있다.
없는 값은 NaN (not a number)로 표시되고 누락된 값, NA 값으로 취급
isnull(), notnull() 함수는 누락된 데이터를 찾을 때 사용, 인스턴스 메서드로도 존재
Series의 유용한 기능은 산술 연산에서 색인과 라벨로 자동 정렬하는 것
Series 객체와 색인은 모두 name 속성을 갖고 있고 값을 할당 (문자열)할 수 있다.
Series 색인은 대입하여 변경할 수 있다.

5.1.2 DataFrame

표 같은 스프레드시트 형식의 자료구조이고, 각 컬럼은 서로 다른 종류의 값을 담을 수 있다.
같은 길이의 리스트에 담긴 사전을 이용하거나 Numpy 배열을 이용하여 만듦
너무 아래로 길면 head() 메서드로 상위 5줄 출력
DataFrame() 함수에 column 인자로 컬럼의 순서를 리스트로 전달하면 순서를 지정할 수 있다.

  • column 접근: 사전 형식의 표기법으로 접근하거나 속성 형식으로 접근할 수 있다.
  • row 접근: 위치나 loc속성을 이용해서 이름을 통해 접근할 수 있다.

column은 대입이 가능, 존재하지 않는 컬럼을 대입하면 새 컬럼을 생성
del 예약어로 삭제할 수 있다.
Caution 색인을 통해 얻은 컬럼은 내부 데이터에 대한 로 실제 DataFrame에 반영된다.
복사하려면 copy() 메서드를 사용

중첩된 사전을 이용해서 데이터를 생성 시
바깥의 키 - 컬럼, 안쪽의 키 - 로우가 된다.
전치는 numpy와 동일 T
index와 column에 name 속성을 지정하면 함께 출력
values 속성은 저장된 DataFrame을 2차원 배열로 반환

5.1.3 색인 객체

각 로우와 컬럼에 대한 이름과 다른 메타데이터 (축의 이름 등)를 저장하는 객체
색인 객체는 변경이 불가능하여 자료구조 사이에서 안전하게 공유될 수 있다.
Note 일부 연산의 경우 색인을 반환하므로 어떻게 동작하는지 이해하는 것이 중요
Index 객체도 고정 크기로 동작
중복되는 인덱스를 허용한다.

5.2 핵심 기능

5.2.1 재색인

reindex - 새로운 색인에 맞도록 객체를 새로 생성
데이터를 새로운 색인에 맞게 재배열, 존재하지 않는 색인값이 있다면 NaN을 추가
보간하거나 채워야할 때, method 옵션에 ffill 같은 메서드를 이용
loc을 이용해서 라벨로 색인하면 좀 더 간결하게 할 수 있어 이 방식이 더 선호된다.

5.2.2 하나의 로우나 컬럼 삭제하기

drop() 함수 - 선택한 값들이 삭제된 새로운 객체를 얻을 수 있다.
단일 문자열 전달 혹은 문자열의 리스트 전달
DataFrame에서 drop() 함수에 로우를 전달하면 해당 로우 (axis 0)의 값을 모두 삭제
컬럼의 값을 삭제할 때는 axis=1 또는 axis='columns를 인자로 전달
Caution inplace=True 옵션은 제자리 원본 변경되어 삭제되는 값이 모두 영영 삭제된다.

5.2.3 색인하기, 선택하기, 거르기

라벨 이름으로 슬라이싱하면 시작점과 끝점을 포함 (일반 파이썬 문법과 틀린 점)
슬라이싱으로 선택된 영역에 값을 대입 가능

lociloc으로 선택하기

DataFrame의 로우에 대해 라벨로 색인하는 다른 방법으로 축의 라벨을 사용하여 로우와 컬럼을 선택할 수 있다.
축 이름을 선택할 때 - loc,
정수 색인으로 선택할 때 - iloc
슬라이스도 지원, 단일 라벨이나 라벨 리스트도 지원
Note 실사용 측면에서 정수축 라벨을 사용할 경우 모호해지는 상황이 있어 loc, iloc이 추가됨
ix 색인 연산자는 없어질 예정

5.2.4 정수 색인

라벨에 대해서는 loc, 정수 색인에 대해서는 iloc을 사용하자

5.2.5 산술 연산과 데이터 정렬

다른 색인을 가지고 있는 객체 간의 산술 연산 - 외부 조인과 유사하게 동작한다
서로 겹치는 색인이 없는 경우 데이터는 NaN 값이 된다.

산술 연산 메서드에 채워 넣을 값 지정하기

서로 다른 색인을 가지는 객체 간의 산술 연산에서 존재하지 않는 축의 값을 특수한 값으로 지정하고자 할 때
loc 색인으로 값을 지정

df2.loc[1, 'b'] = np.nan

겹치지 않는 부분은 NaN 값이 된다.
하지만,

df1.add(df2, fill_value=0)

로 계산하면 NaN에 0을 넣어서 계산하게 된다.
재색인 (reindex 메서드)에도 fill_value 인자를 지정할 수 있다.

DataFrame과 Series 간의 연산

산술 연산은 Series의 색인을 DataFrame의 컬럼에 맞추고 아래 로우로 전파 - 브로드캐스팅이 적용 된다.
색인값을 찾을 수 없다면 그 객체는 형식을 맞추기 위해 재색인된다.
각 로우에 대해 연산을 수행하고 싶다면 산술 연산 메서드 사용
인자로 넘기는 axis 값은 연산을 적용할 축 번호다. 그러므로, axis=indexaxis=0는 로우를 따라 연산을 수행하라는 의미

Example axis 인자

frame.sub(series3, axis='index')  # 로우 방향으로 sub 산술 연산을 하라, 즉 frame-series를 로우 방향으로 연산

5.2.6 함수 적용과 매핑

Numpy의 유니버셜 함수를 적용할 수 있다. 가령, np.abs()같은 함수

  • apply() 메서드

각 컬럼이나 로우의 1차원 배열에 함수를 적용할 수 있다. - apply() 메서드
기본으로 각 컬럼에 대해 계산되며, axis=column 인자를 전달하면 각 로우에 대해 한 번씩만 수행된다.
여러 값을 가진 Series를 반환할 수 있다.
Dataframe에서 각 원소에 적용되는 파이썬의 함수를 사용할 수도 있다. - applymap() 메서드
Series에서 같은 역할을 하는 메서드 - map() 메서드

5.2.7 정렬과 순위

sort_index() 메서드 - 로우나 컬럼의 색인을 알파벳순으로 정렬
Dataframe은 하나의 축을 선택해서 기준으로 정렬할 수 있다. - 가령, axis=1
기본적으로 오름차순이고, ascending=False를 전달하면 내림차순으로 정렬된다.

sort_values() 메서드 - 값에 따라 정렬하고 싶을 때 사용
정렬할 때 비어 있는 값은 가장 마지막에 위치
Dataframe에서 by 옵션에 컬럼 이름을 전달하여 기준으로 한다.
여러 컬럼을 넣고 싶다면 리스트 전달

rank() 메서드 - 1부터 배열의 유효한 데이터 개수까지 순서를 매긴다.
동점인 항목에 대해서 평균 순위를 매긴다.
method='first'는 먼저 출현한 순서대로 적용된다.
Dataframe에서 로우나 컬럼에 대해 순위를 정할 수 있다. - axis='column'과 같이 축을 지정

5.2.8 중복 색인

is_unique() 속성은 해당 값이 유일한지 아닌지 알 수 있다.
중복된 색인 값이 있는 경우 Series 객체는 하나의 Series 객체를 반환한다.
선택된 결과가 다를 수 있어 코드를 좀 더 복잡하게 만들 수 있다.

5.3 기술 통계 계산과 요약

로우나 컬럼에서 단일 값을 구하는 축소 혹은 요약 통계의 범주에 속한다.
sum() 메서드로 Dataframe의 각 컬럼의 합을 Series 모양으로 구할 수 있다.
axis='column' 혹은 axis=1로 각 로우의 모든 컬럼 방향으로 합을 반환할 수 있다.
skipna=False로 옵션을 설정하여 NaN 값이 있으면 포함해서 계산한다.

idxmin(), idxmax() 메서드 - 최소값 혹은 최대값을 가지고 있는 색인값을 반환
cumsum() 메서드 - 누산
describe() 메서드 - 한 번에 여러 기술 통계 결과를 만든다.

5.3.1 상관관계와 공분산

Example 예제 코드가 이해가 잘 된다.

import pandas as pd
import pandas_datareader.data as web
all_data = {ticker: web.get_data_yahoo(ticker)  # 잘 작동한다.
            for ticker in ['AAPL', 'IBM', 'MSFT', 'GOOG']}

price = pd.DataFrame({ticker: data['Adj Close']
                      for ticker, data in all_data.items()})
volume = pd.DataFrame({ticker: data['Volume']
                       for ticker, data in all_data.items()})

returns = price.pct_change()
returns.tail()

# Series의 상관 계수
returns['MSFT'].corr(returns['IBM'])

# Series의 공분산
returns['MSFT'].cov(returns['IBM'])

# 좀 더 편리한 문법
returns.MSFT.corr(returns.IBM)

# DataFrame에서 상관계수 행렬
returns.corr()

# DataFrame에서 공분산 행렬
returns.cov()

# 다른 Series와 DataFrame 사이의 상관계수 구하기
returns.corrwith(returns.IBM)

# 다른 DataFrame과 DataFrame 사이의 상관 계수 구하기
# 같은 컬럼 이름에 대해 상관 계수를 구함
returns.corrwith(volume)

axis=column 옵션을 넘기면 각 컬럼에 대한 상관계수와 공분산을 구할 수 있다.

5.3.2 유일값, 값 세기, 멤버십

unique() 메서드 - 중복되는 값을 제거하고 유일값만 담고 있는 Series를 반환
value_counts() 메서드 - Series에서 frequency를 계산하여 반환
isin() 메서드 - Series에 존재하는지 나타내는 불리언 벡터를 반환, mask로 사용 가능
Index.get_indexer() 메서드 - 여러 값이 들어 있는 배열에서 유일한 값의 색인 배열을 구할 수 있다. - 멤버십 골라 내기에 사용

5.4 마치며

오늘의 흔적: