기본 콘텐츠로 건너뛰기

11월, 2017의 게시물 표시

[ML] 결정트리(Decision Tree) 모델

대상값이 속하는 구간 나타내기(ing)

기준 구간에서 대상값이 속하는 구간을 나타낼 필요가 있다. 단지 구간을 표시하기 위해 pd.cut() 함수를 사용하면 된다. 그러나 이 함수는 기준 구간을 별도로 객체화 할 수 없다. 이 경우 다음 함수를 사용할 수 있다. pd.Intereval(left, right, closed='right') 이 함수는  left< value <= right 즉, (left, right]로 결과를 반환하는 함수이다. 위 결과 중 '(': 개구간(open interval)  '[': 폐구간(closed interval) 이 함수의 인수중 closed는 폐구간의 위치를 설정하는 것으로 그 인수는 다음과 같다. 'left;, ;right', 'both', 'neither'을 선택할 수 있고 기본값은 'right'이다. In [1]: a=np.random.randint(1, 100, 5) 예로 사용할 데이터를 만들기 위해 임의의 수를 추출했다. 그 객체는 코드 [2]와 같다. In [2]: a Out[2]: array([14, 26, 46, 76, 53]) 코드 [2]의 결과를 기준으로 기준이 되는 10개의 구간을 생성하기 위해 각 구간의 값들을 linspace() 함수를 사용하여 추출하였다. 이 함수는 지정한 구간에 일정한 길이로 지정한 수 만큼을 생성한다. In [3]:a_int=np.linspace(min(a)-1, max(a)+1, 10) In [4]: a_int Out[4]: array([ 13.        ,  20.11111111,  27.22222222,  34.33333333,         41.44444444,  48.55555556,  55.66666667,  62.77777778,         69.88888889,  77.        ]) 위의 결과에 객체 a의 각 원소가 어느 위치에 속하는 가를

datetime module의 개요

1. Introduction  datetime 모듈은 날짜와 시간의 관련된 조정을 할 수 있는 많은 클래스를 제공한다. 이 모듈에서 기준이 되는 year의 범위는 다음과 같다. In [1]: import datetime In [2]: datetime.MINYEAR Out[2]: 1 In [3]: datetime.MAXYEAR Out[3]: 9999 시간의 범위를  알아보기 위해 datetime 모듈의 time 클래스를 사용한다. In [4]: datetime.time.min Out[4]: datetime.time(0, 0) In [5]: datetime.time.max Out[5]: datetime.time(23, 59, 59, 999999) 위에서 나타낸 것과 같이 datetime 모듈의 경우 5개의 클래스를 포함한다. 1) datetime.date ;   날짜를 다루는 클래스로 year, month, day 의 속성 을 가진다. 속성 은 클래스에 전달하는 인수값을 각각의 인덱스 또는 매개변수 이름에 매칭하여 반환시켜주는 일종의 함수이다. 그러므로 속성은 그 자체의 매개변수를 별도로 가지지 않는다. 2) datetime. time; 시간을 다루는 클래스로 1일을 24*60*60 초로 계산한다. 속성으로는 hour, minute, second, microsecond, tzinfo  tzinfo는 지역시간대 정보(time zone information) 값이다. 3.)datetime.datetime ; 시간과 날짜를 합한 정보를 다루는 클래스이다. 속성으로는 위의 각 클래스에 속하는 모든것을 포함한다. 즉, year, month, day, hour, minute, second, microsecond, tzinfo 4) datetime.timdelta; 두 date, time 또는 datetime의 instance들 사이의 차이를 마이크로초의 resolution의 수준에서 반환하는 클래스

시간의 조절_datetime.time 클래스

datetime 모듈로 부터 time 값의 조정 Time 값들은 time 클래스에 의해 조정됩니다 . 시간은 시간 , 분 , 초 그리고 마이크로 초에 대한 속성을 가집니다 . 그들은 또한 시간 지역대 정보 (time zone information) 를 포함합니다 . Time instance 를 초기화하기 위한 인수들은 선택사항이고 0 이 디폴트 값으로 지정되어 있습니다 . In [1]: import datetime   In [2]: t=datetime.time(1,2,3)   In [3]: t Out[3]: datetime.time(1, 2, 3)   In [4]: t.hour Out[4]: 1 In [5]: t.minute Out[5]: 2 In [6]: t.second Out[6]: 3 In [7]: t.microsecond #microsecond 는 위 클래스에 지정되지 않았으므로 0 이 반환 Out[7]: 0 In [8]: t.tzinfo # 지역대 정보는 입력되지 않아 결과가 없다 . 코드 [2] 의 time 인스턴스 ( 클래스객체 ) 는 날짜에 대한 정보를 포함하지 않습니다 . 이 클래스 즉 , datetime.time 의 범위를 알아보기 위해 min, max 의 클래스 속성을 사용할 수 있습니다 . In [9]: datetime.time.min Out[9]: datetime.time(0, 0) In [10]: datetime.time.max Out[10]: datetime.time(23, 59, 59, 999999) 코드 [9],[10]은 time 클래스에서 조정할 수 있는 time의 범위를 알아볼 수 있습니다. 위의  결과에 의하면 0시 0분 ~ 23시 59분 59초 999999 마이크로초의 범위 내에서 시간을 반환합니다. datetime.time에 전달할 수 있는 인수의 형태는 정수형입니다. In [11]: try:     ...:   

객체에 대한 판단_all, any, bool

all, any, bool all() , any() 는 객체에 대한 판단을 True/False로 반환합니다. all: 객체의 모든 원소가 참일때만 참 any: 객체의 모든 원소가 거짓일 때만 거짓 주의할 점은 두 함수의 대상이 되는 객체는 반복가능한 (iterable) 객체로서 문자열(string), 리스트(list), 터플(turple)등이 대상이 됩니다. 0이 아닌 모든 값은 True로 인식된다. 0이외의 모든 값은 True로 인식됩니다. import numpy as np import pandas as pd x=np.random.randint(0, 10, 7) x[3]=0 x array([3, 4, 2, 0, 6, 8, 8]) all(x), any(x) (False, True) all(x>3) False any(x>3) True 내장함수인 all(), any()는 객체 전체를 판단합니다. 객체의 각 요소에 대한 판단은 bool() 에 의해 실행됩니다. bool() 객체의 각 요소에 대한 True/False를 판단 객체 자체의 판단은 에러발생 bool(x[2]) True [bool(i) for i in x] [True, True, True, False, True, True, True] 다음 함수는 조건에 부합하는 요소의 인덱스를 반환합니다. 이 함수를 적용하여 bool() 결과의 인덱스를 결정할 수 있습니다. np.where(객체, 조건) 객체내에서 조건에 부합하는 요소의 인덱스를 반환합니다. np.where([bool(i)==False for i in x]) (array([3]),)

절대값 구하기

abs() 절대값을 반환하는 내장함수로서 복소수의 경우는 다음과 같은 값을 반환 a+bj : In [1]: [abs(-4.83), abs(3+2j)] Out[1]: [4.83, 3.605551275463989] 이 함수는 사용자 정의함수로 다음과 같이 작성됩니다. def absS(x):     if type(x) != complex:#전달되는 객체의 타입을 알아봅니다.         if x<=0:             y=-1*x         else:             y=x     else:         y=(x.real**2+x.imag**2)**0.5     return(y) 위에서 나타낸 것과 같이 복소수의 절대값은 그것의 크기를 나타냄. 프로그램상에서 이 판단을 위해 if 조건문을 사용. In [2]: x=3+2j In [3]: absS(x) Out[3]: 3.605551275463989

무한값(infinity)인식

데이터 처리 과정에서 누락된 값이나 계산과정에서 무한값을 얻게되는 경우가 있는데 이러한 값들은 이어진 계산과정에서 에러를 발생하는 경우가 많다.  그러므로 분석전 또는 분석 동안 이들의 처리 과정이 중요하며 그 일환으로 먼저 그들의 인식과정을 먼저 살펴본다.  사용할 자료를 생성하자. nan(Not a Number)는 np.nan으로 생성할 수 있으며  무한값(infinity)은 float() 함수를 사용하여 생성한다.  기본 자료는 numpy 패키지의 linspace(start, end, size)로 생성한다. 이 함수는 시작과 끝을 지정하여 그 범위에 지정한 갯수 만큼 수를 생성한다.  In [1]: import math    ...: import numpy as np    ...: import pandas as pd    ...: In [2]: x=np.linspace(0, 10, 20) In [3]: x Out[3]: array([  0.        ,   0.52631579,   1.05263158,   1.57894737,          2.10526316,   2.63157895,   3.15789474,   3.68421053,          4.21052632,   4.73684211,   5.26315789,   5.78947368,          6.31578947,   6.84210526,   7.36842105,   7.89473684,          8.42105263,   8.94736842,   9.47368421,  10.        ]) In [4]: x[3]=np.nan #위 생성된 자료의 일정위치 값을 nan으로 대치한다.  In [5]: x[9]=np.nan In [6]: x[7]=float('inf') In [7]: x[16]=float('-inf') In [8]: x Out[8

주식 데이터 관리_google finance

1. 대상이 되는 주식 일일자료를 google finance로 부터 호출하여 엑셀로 저장하기 다음의 패키지들이 필요하다. In [1]: import numpy as np In [2]: import pandas as pd In [3]: from googlefinance.client import get_price_data, get_prices_data, get_prices_time_data In [4]: from datetime import datetime, timedelta 1) google finance에 사용할 수 있는 각 주가 코드를 엑셀로 정리하여 호출하자. 다음예에서 사용된 dropna()는 데이터에 na를 제거하기 위해 사용한 것으로 아래의 포스트를 참조( nan제거를 위한 함수들 ) In [5]: itemCode=pd.read_excel("c:\\~~.xlsx", sheet_name="googleCode") In [6]: itemCode1=itemCode.ix[:,:4] In [7]: itemCode1=itemCode1.dropna(axis=0) In [8]: itemCode1 Out[8]: code1 종목코드 item 종목명 0 KRX KOSPI kospi 종합(KOSPI) ... ... ... ... ... 2) google finance로 부터 데이터를 호출하기 위해 위 코드 [3]에서 제공하는 함수들을 사용한다. 포스트 ( google finance로 부터의 자료 호출_python  )참조 위에서 호출한 code는 여러 종목에 관한 것이다. 그러므로 각 종목을 호출하기 위해서는  반목문을 사용하자.  최종 결과를 담기위해 인덱스(주식명)과 값(일일자료)를 모두 표시할 수 있는 사전 객체로 생성하자.  In [9]: dat={} In [10]: for i in range(len(itemCode1)):             param={

여러가지 시간 데이터 만들기(~ing)

import numpy as np import pandas as pd from datetime import datetime, timedelta 1. pd.DatetimeIndex() In [1]: today=pd.DatetimeIndex(['2017-11-16']) In [2]: print(today) Out[2]:  DatetimeIndex(['2017-11-16'], dtype='datetime64[ns]', freq=None) In [3] :type(today) Out[3]:  pandas.core.indexes.datetimes.DatetimeIndex 2. Timesptamp 타입으로 날짜 설정 In [4]: today=pd.Timestamp(datetime(2017,11,16)) In [5]: today Out[5]: Timestamp('2017-11-16 00:00:00')

nan 제거를 위한 방법(~ing)

1. pd.dropna( axis=0 ,  how='any' ,  thresh=None ) axis:0은 열, 1은 행을 기준으로 설정         주의) 0일경우 열을 기준으로 하는데 이는 1열의 3행의 값이 na라면 how='any' 일 경우 3행을 제거                  즉, 기준이 되는 열 또는 행에서 na가 대응되는 행 또는 열이 제거된다.   how: 'any'는 na값이 하나라고 있으면 해당되는 열을 제거          'all' 은 그 열의 값이 모두 na일 경우에만 제거  In [1]: import numpy as np In [2]: import pandas as pd 다음예는 엑셀파일로 부터 저장된 자료를 호출하였을 경우 Na의 처리예이다. In [3]: itemCode=pd.read_excel("c:\\~~\\--.xlsx", sheet_name="googleCode") In [4]: itemCode1=itemCode.ix[:,:3] In [5]: itemCode1 Out[5]: code1 종목코드 종목명 0 KRX KOSPI 종합(KOSPI) 1 KRX 122630 KODEX 레버리지 2 KRX 114800 KODEX 인버스 3 KRX 004020 현대제철 4 KRX 030610 교보증권 5 KRX 006800 미래에셋대우 6 KRX 130960 CJ E&M 7 KRX 047810 한국항공우주 8 KOSDAQ KOSDAQ 종합(KOSDAQ) 9 KOSDAQ 214180 민앤지 10 NaN NaN NaN 11 NaN NaN NaN 12 NaN NaN NaN 13 NaN NaN NaN 14 NaN NaN NaN 15 NaN NaN NaN 위의 결과에서 Na를 제거하기 위해 위 함수를 사용하자. In [6]: itemCode1=itemCode1.dropna(ax

pd 객체에 bool, 비교 연산의 문제

pandas, numpy 객체는 원소 단위로 연산이 이루어진다. In [1]: import pandas as pd In [2]: a=pd.DataFrame([0]*3) In [3]: b=pd.DataFrame([2]*3) In [4]: a Out[4]:    0 0  0 1  0 2  0 In [5]: b Out[5]:    0 0  2 1  2 2  2 In [6]: a+b Out[6]:    0 0  2 1  2 2  2 이러한 점은 각 원소 단위로 boolean, 비교 연산이 이루어진다는 것을 의미한다. 그러나 그 결과는 모호하다. 다음을 보자. In [7]: a.ix[1] ==0 Out[7]: 0    True Name: 1, dtype: bool 위의 경우는 정상적인 결과를 반환한다. 그러나 다음은 같은 원소를 bool로 판단하기 위한 것이다. 원소값이 0이므로 False가 예산된다. In [9]: bool(a.ix[1]) --------------------------------------------------------------------------- ValueError                                Traceback (most recent call last) <ipython-input-9-8cb7437508dd> in <module>() ----> 1 bool(a.ix[1]) ~\Anaconda3\lib\site-packages\pandas\core\generic.py in __nonzero__(self)    1119         raise ValueError("The truth value of a {0} is ambiguous. "    1120                          "Use a.empty, a.bool(), a.item(), a.any() or a.all

관찰치에 대응되는 참조그룹의 보고

이전 포스트에서  DataFrame을 list로 전환:rand(), list comprehension  와  DataFrame을 list로 전환:rand(), list comprehension  를 통해 참조 그룹을 설정하고 관찰치가 어느 그룹에 속하는지를 반환하는 함수를 작성하였다. 이번에는 그 결과를 DataFrame 형식으로 테이블을 만들어 보자. 우선 표의 한 열에 각행에 구간의 (시작값과 마지막 값]을 표시하고 다른 열에는 대상 데이터가 어느 구간에 속함을 대상데이터의 이름을 입력한다. 다음 함수는 DataFrame 형식으로 각 행에 (시작값과 마지막 값]을 표시한다. def DisplayPreIntervalS(inter):     inter1=[]     for i in range(1, len(inter)):         inter2="("+str(inter[i-1])+','+str(inter[i])+']'         inter1.append(inter2)     inter1=np.array(inter1)     return(inter1) 위 함수에서 문자열의 '+' 연산자는 각 문자(열) 사이를 이어주는 역할을 적용한다. In [1]: import numpy as np In [2]: import pandas as pd In [3]:   x=np.round(np.random.rand(3, 4)*10, 1) In [4]:   xdf=pd.DataFrame(x) In [5]:   refd=mkRefdS(xdf, 2) In [6]:  print(refd) [ 3.5 1. 3.6 0.3 5.4 2.5 5.9 5.7 6.9 9.6 8.3 3.3] In [7]: obs=pd.DataFrame(obs, index=["a","b","c","d"]) In [8

지정된 구간들과 관찰치의 대응:np.linspace,pd.cut

이전 포스트( DataFrame을 list로 전환:rand(), list comprehension )에서 pandas DataFrame 구조의 데이터를 리스트형태로 전환하였다. 이 전환된 데이터를 일정구간으로 구분하여 대상의 데이터가 어느 구간에 속하는지를 알아보자. 이 과정을 위해 다음 함수를 작성한다. def matchingObsS(obs, ref, intN=10, roundN=1):     interval=np.round(np.linspace(min(ref), max(ref), intN), roundN)     re=pd.cut(obs, bins=interval, labels=np.arange(len(interval)-1))     return(interval, dict(re)) 이 함수에서는 두가지 주요한 함수가 사용된다. 즉, 이전에 리스트로 전환된 데이터가 위 함수의 인수 ref가 된다. 이 ref의 최소값과 최대값 사이를 일정한 구간으로 구분한다. 이 과정에 np.linspace(시작, 끝, 길이=50) 함수를 사용한다. 이 함수는 시작과 끝 사이에 일정한 간격으로 지정한 길이의 수를 추출한다. In [1]: import numpy as np In [2]: import pandas as pd >>> np.linspace(1, 20, 5) array([ 1. , 5.75, 10.5 , 15.25, 20. ]) 다음 과정으로 통해 사용할 데이터를 생성한다. In [3]:   x=np.round(np.random.rand(3, 4)*10, 1) In [4]:   xdf=pd.DataFrame(x) In [5]:   refd=mkRefdS(xdf, 2) In [6]:  print(refd) [ 3.5 1. 3.6 0.3 5.4 2.5 5.9 5.7 6.9 9.6 8.3 3.3] 다음은 위 함수의 각 과정을 나타낸 것이다. In [7]: in