웹에서 자료를 호출하고 호출된 자료를 조절하기 위해 다음의 모듈이 필요하다.
import numpy as np
import pandas as pd
from datetime import datetime
from pandas_datareader import data, wb #웹에서 데이터 호출
import pandas_datareader.data as web
import matplotlib.pyplot as plt #그래프 작성을 위해 필요
%matplotlib inline
from sklearn.linear_model import LinearRegression
startD=datetime(2016, 1,1)
endD=datetime(2017, 3, 31)
d=web.DataReader('KRX:kospi', 'google', startD, endD)
print(d.head(3))
print(d.tail(3))
Open High Low Close Volume
Date
2016-01-04 1954.47 1954.52 1918.76 1918.76 359018000
2016-01-05 1911.93 1937.57 1911.93 1930.53 446548000
2016-01-06 1934.25 1934.25 1911.61 1925.43 594612000
Open High Low Close Volume
Date
2017-03-29 2172.31 2172.31 2162.04 2166.98 626792000
2017-03-30 2170.18 2174.16 2159.16 2164.64 643563000
2017-03-31 2166.62 2166.93 2159.80 2160.23 441640000
d1=np.array(d)
d1[:3]
array([[ 1.95447000e+03, 1.95452000e+03, 1.91876000e+03,
1.91876000e+03, 3.59018000e+08],
[ 1.91193000e+03, 1.93757000e+03, 1.91193000e+03,
1.93053000e+03, 4.46548000e+08],
[ 1.93425000e+03, 1.93425000e+03, 1.91161000e+03,
1.92543000e+03, 5.94612000e+08]])
결측지 조절(missing value control)
np.isnan() : 데이터내의 각 원소값을 조사하여 Nan 값이 존재하면 True, 아니면 False를 반환(pandas 모듈에서 pd.isnull()과 유사),반대의 결과 즉, nan 아니면 True의 결과를 반환하기 위해서는 ~np.isnan() np.isinf(): 무한값이 존재하면 True np.isfinite(): 유한값에서 True(pandas 모듈에서 pd.notnull()와 유사)
np.nan_to-num(객체) : nan 값을 0으로 치환하고 무한값(infinite value)을 유한 값으로 치환한다. 이와 유사하지만 보다 자세한 기능을 pandas 모듈에서 지원한다.
pd.fillna(value=None, method=None, axis=None…): 데이터 중의 Na값을 특정 값(매개변수 value에 지정된 값)으로 치환한다. 이 방식은 매개변수 method로 지정한다. method의 인수는 backfill=bfill, ffill=pad로 각각 na에 이어지는 값, na의 이전값으로 대치한다.
x=np.floor(np.random.randn(12)*10).reshape(3,4)
x[0,2]=np.nan
x[1,1]=np.nan
x[2,2]=np.nan
x
array([[ 7., -3., nan, -7.],
[ -8., nan, -4., 5.],
[ 12., -5., nan, -19.]])
print(np.isnan(x))
[[False False True False]
[False True False False]
[False False True False]]
print(pd.isnull(x))
[[False False True False]
[False True False False]
[False False True False]]
#위의 두 함수는 동일한 결과를 반환하고 아래의 함수는 반대의 결과를 반환한다.
print(pd.notnull(x))
[[ True True False True]
[ True False True True]
[ True True False True]]
np.nan_to_num(x)
array([[ 7., -3., 0., -7.],
[ -8., 0., -4., 5.],
[ 12., -5., 0., -19.]])
#pandas 모듈을 사용하기 위해서는 np 배열을 pd DataFrame 또는 Series 구조로 전환
x1=pd.DataFrame(x)
x1
|
0
|
1
|
2
|
3
|
0
|
7.0
|
-3.0
|
NaN
|
-7.0
|
1
|
-8.0
|
NaN
|
-4.0
|
5.0
|
2
|
12.0
|
-5.0
|
NaN
|
-19.0
|
#위와 같이 nan을 0으로 치환하기 위해 pa.fillna()에서 매개변수 value=0으로 지정
x1.fillna(0)
|
0
|
1
|
2
|
3
|
0
|
7.0
|
-3.0
|
0.0
|
-7.0
|
1
|
-8.0
|
0.0
|
-4.0
|
5.0
|
2
|
12.0
|
-5.0
|
0.0
|
-19.0
|
#method 지정의 변화에 따른 결과
print(x1.fillna(method='bfill', axis=1))#이어지는 값으로 치환
0 1 2 3
0 7.0 -3.0 -7.0 -7.0
1 -8.0 -4.0 -4.0 5.0
2 12.0 -5.0 -19.0 -19.0
print(x1.fillna(method='ffill', axis=1))#직전의 값으로 치환
0 1 2 3
0 7.0 -3.0 -3.0 -7.0
1 -8.0 -8.0 -4.0 5.0
2 12.0 -5.0 -5.0 -19.0
print(x1.fillna(method='pad', axis=1))#위와 동일
0 1 2 3
0 7.0 -3.0 -3.0 -7.0
1 -8.0 -8.0 -4.0 5.0
2 12.0 -5.0 -5.0 -19.0
NaN 값을 제거하기 위해 np.delete, pd.dropna함수를 사용 np.delete(객체, 위치): 객체중의 지정된 위치에 있는 값을 제거한다.
pd.dropna(axis=0, how=’any’,…): NaN값을 삭제한다. axis의 인수 0은 index, 1은 column을 의미한다. 매개변수 how의 인수는 any, all이 있다. any는 Nan이 존재하는 라벨을 제거하고 all은 모든 값들이 nan이라면 그 라벨을 제거한다.
print(x)
[[ 7. -3. nan -7.]
[ -8. nan -4. 5.]
[ 12. -5. nan -19.]]
print(np.isnan(x[0]))
[False False True False]
np.delete(x[0], 2)
array([ 7., -3., -7.])
print(x1.dropna(axis=1))#NaN이 존재하는 부분을 제거한다.
0 3
0 7.0 -7.0
1 -8.0 5.0
2 12.0 -19.0
#NaN이 공통적으로 존재하는 부분의 라벨을 제거한다.
#객체 x1은 NaN이 일치되는 행 또는 열이 존재하지 않으므로 어떤 변화도 없다.
print(x1.dropna(axis=1, how="all"))
0 1 2 3
0 7.0 -3.0 NaN -7.0
1 -8.0 NaN -4.0 5.0
2 12.0 -5.0 NaN -19.0
객체의 원소중에 0을 포함하는 경우 상관계수등의 계산 결과가 합리적이지 못합니다. 이 경우 객체중에 0의 제외하고 자 합니다. 이 과정은 두단계로 이루어 질수 있습니다.
1) 객체 중의 원소 0을 np.nan으로 전환합니다.
2) 객체중의 nan을 제거합니다.
trgD=trgD.replace(0, np.nan) #객체 중 값이 0인 원소들을 np.nan으로 대체 합니다.
trgD=trgD.dropna()#nan이 포함된 행을 제거합니다.
댓글
댓글 쓰기