
pandas 라이브러리는 보통 pd 라는 별칭으로 사용됨.
import pandas as pd
import numpy as np
랜덤 시드, 어레이 내부에 사용되는 부동소수점 정확도, 도표 크기 지정 옵션 등은 이전과 동일함.
np.random.seed(12345)
np.set_printoptions(precision=4, suppress=True)
import matplotlib.pyplot as plt
plt.rc('figure', figsize=(10, 6))
Series와 DataFrame을 표로 보여줄 때 사용되는 행의 수를 20으로 지정함.
기본값=60
pd.options.display.max_rows # 원래 60이 기본.
기본값(60)을 20으로 변경함.
pd.set_option("display.max_rows",20)
주요 메서드
head()tail()info()예시를 위한 아래 데이터프레임 이용
dict = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada', 'NY', 'NY', 'NY'],
'year': [str(num) for num in [2000, 2001, 2002, 2001, 2002, 2003, 2002, 2003, 2004]],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2, 8.3, 8.4, 8.5],
'debt':np.linspace(0, 1, 9)}
frame = pd.DataFrame(dict, columns=['year', 'state', 'pop', 'debt'],
index=['one', 'two', 'three', 'four',
'five', 'six', 'seven', 'eight', 'nine'])
frame
year state pop debt
one 2000 Ohio 1.5 0.000
two 2001 Ohio 1.7 0.125
three2002 Ohio 3.6 0.250
four 2001 Nevada 2.4 0.375
five 2002 Nevada 2.9 0.500
six 2003 Nevada 3.2 0.625
seven2002 NY 8.3 0.750
eight2003 NY 8.4 0.875
nine 2004 NY 8.5 1.000
#표 형태임.
head() 메서드
head() 메서드는 지정된 크기만큼의 행을 보여줌.
인자를 지정하지 않으면 처음 5개의 행을 보여줌.
frame.head() #처음_5개행만
frame.head(3)
tail() 메서드
tail() 메서드는 지정된 크기만큼의 행을 뒤에서부터 보여줌.
인자를 지정하지 않으면 뒤에서부터 5개의 행을 보여줌.
frame.tail() #마지막부터_5개행만
frame.tail(3)
info() 메서드
열(columns) 별로 결측치가 아닌 항목의 수와 자료형을 확인해줌.
9 non-null: 결측치가 아닌 항목이 9개 있음을 의미함.object: 일반적으로 문자열 자료형을 가리킴.frame.info()
<class 'pandas.core.frame.DataFrame'>
Index: 9 entries, one to nine
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 year 9 non-null object
1 state 9 non-null object
2 pop 9 non-null float64
3 debt 9 non-null float64
dtypes: float64(2), object(2)
memory usage: 360.0+ bytes
기초 통계에서 사용되는 주요 메서드
sum()mean()std()idxmax()/idxmin()cumsum()describe()기본적으로 열 단위로 작동, 결측치는 행 또는 열의 모든 값이 결측치가 아니라면 기본적으로 무시함.
행 단위로 작동하게 하려면 축을 axis=1 또는 axis='columns'로 지정하고, 결측치를 무시하지 않으려면 skipna=False로 지정한다.
df = pd.DataFrame([[1.4, np.nan], [7.1, -4.5],
[np.nan, np.nan], [0.75, -1.3]],
index=['a', 'b', 'c', 'd'],
columns=['one', 'two'])
df
one two
a 1.40 NaN
b 7.10 -4.5
c NaN NaN
d 0.75 -1.3
#표 형태임.
sum() 메서드
행/열 단위 합 계산
df.sum()
# one 9.25
# two -5.80
# dtype: float64
결측치를 무시하지 않으면, 결측치가 포함된 행/렬에 대한 계산은 하지 않음.
df.sum(skipna=False)
# one NaN
# two NaN
# dtype: float64
df.sum(axis='columns')
# a 1.40
# b 2.60
# c 0.00
# d -0/55
#dtype: float64
시리즈는 하나의 열을 갖는 데이터프레임처럼 작동함.
df['one']
# a 1.40
# b 7.10
# c NaN
# d 0.75
# Name: one, dtype: float64
df['one'].sum()
#9.25
mean() 메서드
평균값 계산
df.mean()
# one 3.083333
# two -2.90000
# dtype: float64
df.mear(axis='columns')
#a 1.400
#b 1.300
#c NaN
#d -0.275
#dtype: float64
결측치를 무시하지 않으면, 결측치가 포함된 행/렬에 대한 계산은 하지 않음.
df.mean(skipna=False)
#one NaN
#two NaN
#dtype: float64
df.mean(axis='columns', skipna=False)
#a NaN
#b 1.300
#c NaN
#d -0.275
#dtype: float64
시리즈의 경우도 동일하게 작동함.
df['one'].mean()
#3.0833333333333335
df['one'].mean(skipna=False)
#NaN
std() 메서드
표준편차 계산
df.std()
#one 3.493685
#two 2.262742
#dtype: float64
df.std(axis='columns',skipna=False)
#a NaN
#b 8.202439
#c NaN
#d 1.449569
#dtype: float64
idxmax()/idxmin()
최댓값/최솟값을 갖는 인덱스 확인
아래 코드는 열별 최댓값을 갖는 인덱스를 찾아줌.
df.imax()
#one b
#two b
#dtype: object
cumsum()
누적 합 계산
df.cumsum()
one two
a 1.40 NaN
b 8.50 -4.5
c NaN NaN
d 9.25 -5.8
#표 형태임
describe()
요약 통계 보여주기
수치형 데이터의 경우 평균값, 표준편차, 사분위수 등의 통계 정보를 요약해서 보여줌.
df.describe()
one two
count 3.000000 2.000000
mean 3.083333 -2.900000
std 3.493685 2.262742
min 0.750000 -4.500000
25% 1.075000 -3.700000
50% 1.400000 -2.900000
75% 4.250000 -2.100000
max 7.100000 -1.300000
#표 형태임
금융 사이트에서 구한 4 개 회사의 주가(price)와 거래량(volume)을 담고 있는 두 개의 데이터를 이용하여 상관계수와 공분산을 계산할 것임.
이를 위해 먼저 바이너리 파일 두 개를 다운로드해서 지정된 하위 디렉토리에 저장해야 함.
from pathlib import Path
data_path = Path() / "examples"
data_path.mkdir(parents=True, exist_ok=True)
import requests
# 파일 서버 기본 주소
base_url = "https://raw.githubusercontent.com/codingalzi/datapy/master/jupyter-book/examples/"
def myWget(filename):
# 다운로드 대상 파일 경로
file_url = base_url + filename
# 저장 경로와 파일명
target_path = data_path / filename
data = requests.get(file_url)
with open(target_path, 'wb') as f:
f.write(data.content)
두 개의 픽클 파일 다운로드.
to_pickle() 메서드를 이용하여 컴퓨터에 파일로 저장할 때 사용되는 바이너리 파일.myWget("yahoo_price.pkl")
myWget("yahoo_volume.pkl")
다운로드한 두 개의 데이터를 불러옴.
read_pickle(): 저장된 pkl 파일을 파이썬으로 불러오는 함수아래 코드는 일별 주가 데이터를 불러온다. 2010년 1월 4일부터 2016년 10월 21일까지의 데이터 1714개를 담고 있음.
price=pd.read_pickle('examples/yahoo_price.pkl')
price
아래 코드는 동일 회사, 동일 날짜의 1일 거래량(volume) 담고 있는 데이터를 불러옴.
volume = pd.read_pickle('examples/yahoo_volume.pkl')
volume
주가의 일단위 변화율을 알아보기 위해 퍼센트 변화율을 확인함.
참고: 증권분야에서 return은 이익율을 의미함.
returns = price.pct_change()
returns.tail()
corr()/cov() 메서드
상관계수와 공분산 모두 두 확률변수 사이의 선형관계를 보여줌
상관계수와 공분산의 차이점
| 공분산 | 두 확률변수 X, Y 사이의 선형관계를 계량화함.
양/음수 여부에 따른 선형관계를 보이며, 절댓값이 클수록 선형관계가 강함.
but 사용되는 확률변수의 척도(scale)에 많은 영향을 받음.
#정규화한 값인 상관계수를 사용하는 이유 | Cov(X,Y)=E((X−μX)(Y−μY))
μX=E(X)=∑X/n
μY=E(Y)=∑Y/n
|
| --- | --- | --- |
| 상관계수 | 두 확률변수 사이의 선형관계를 -1과 1 사이의 값으로 표현함.
양/음수 여부에 따른 선형관계로 절댓값이 1에 가까울수록 선형관계가 강함. | ρ=Cov(X,Y)/σX⋅σY
σX=√Var(X)
Var(X)=∑(X−μX)^2/n
Var(Y)=∑(X−μY)^2/n |
'MSFT'와 'IBM' 사이의 공분산은 다음과 같음.
returns['MSFT'].cov(returns['IBM'])
#8.870655479703546e-05
'MSFT'와 'IBM' 사이의 상관계수는 다음과 같음.
returns['MSFT'].corr(returns['IBM'])
#0.49976361144151144
전체 회사를 대상으로 하는 상관계수와 공분산을 계산할 수도 있음.
returns.cov()
returns.corr()
unique() 메서드
시리즈에서 사용된 값을 중복 없이 확인
set() 함수와 유사하게 작동하며, 넘파이 어레이를 반환.
obj = pd.Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c'])
obj
0 c
1 a
2 d
3 a
4 a
5 b
6 b
7 c
8 c
dtype: object
uniques = obj.unique()
uniques
array(['c', 'a', 'd', 'b'], dtype=object)
value_counts() 메서드
값들의 빈도수를 확인
obj.value_counts()
c 3
a 3
b 2
d 1
Name: count, dtype: int64