기본 콘텐츠로 건너뛰기

[matplotlib]quiver()함수

결측치 조절

웹에서 자료를 호출하고 호출된 자료를 조절하기 위해 다음의 모듈이 필요하다.

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이 포함된 행을 제거합니다.

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a $\sin^{2}{\left(x \right)} + \cos^{2}{\left(x \right)}$ simplify(a) 1 simplify(b) $\frac{x^{3} + x^{2} - x - 1}{x^{2} + 2 x + 1}$ simplify(b) x - 1 c=gamma(x)/gamma(x-2) c $\frac{\Gamma\left(x\right)}{\Gamma\left(x - 2\right)}$ simplify(c) $\displaystyle \left(x - 2\right) \left(x - 1\right)$ 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. $$\tag{식 1}\Gamma(n) =\begin{cases}(n-1)!& n:\text{자연수}\\\int^\infty_0x^{n-1}e^{-x}\,dx& n:\text{부동소수}\end{cases}$$ x=symbols('x') gamma(x).subs(x,4) $\displaystyle 6$ factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 $x^2=1$의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. $$x^2-1=0$$ import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. $$\begin{aligned}x^2-1=0 \rightarrow (x+1)(x-1)=0 \\ x=1 \; \text{or}\; -1\end{aligned}$$ 예 $x^4=1$의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. $$x^4-1=(x^2+1)(x+1)(x-1)=0 \rightarrow x=\pm \sqrt{-1}, \; \pm 1=\pm i,\; \pm1$$ 실수...