기본 콘텐츠로 건너뛰기

라벨이 data_control인 게시물 표시

통계관련 함수와 메서드 사전

A B C d E F G H I K L M N O P Q R S T U V W Z A statsmodels.ap.stats.anova_lm(x) statsmodels.formula.api.ols 에 의해 생성되는 모형 즉, 클래스 인스턴스(x)를 인수로 받아 anova를 실행합니다. np.argsort(x, axis=-1, kind=None) 객체 x를 정렬할 경우 각 값에 대응하는 인덱스를 반환합니다. Axis는 기준 축을 지정하기 위한 매개변수로서 정렬의 방향을 조정할 수 있음(-1은 기본값으로 마지막 축) pandas.Series.autocorr(lag=1) lag에 전달한 지연수에 따른 값들 사이의 자기상관을 계산 B scipy.stats.bernoulli(x, p) 베르누이분포에 관련된 통계량을 계산하기 위한 클래스를 생성합니다. x: 랜덤변수 p: 단일 시행에서의 확률 scipy.stats.binom(x, n, p) 이항분포에 관련된 통계량을 계산하기 위한 클래스를 생성합니다. x: 랜덤변수 n: 총 시행횟수 p: 단일 시행에서의 확률 C scipy.stats.chi2.pdf(x, df, loc=0, scale=1) 카이제곱분포의 확률밀도함수를 계산 $$f(x, k) =\frac{1}{2^{\frac{k}{2}−1}Γ(\frac{k}{2})}x^{k−1}\exp\left(−\frac{x^2}{2}\right)$$ x: 확률변수 df: 자유도 pd.concat(objs, axis=0, join=’outer’, …) 두 개이상의 객체를 결합한 새로운 객체를 반환. objs: Series, DataFrame 객체. Axis=0은 행단위 즉, 열 방향으로 결합, Axis=1은 열단위 즉, 행 방향으

행렬 객체 만들기

python에서 행렬 객체를 생성하기 위해서는 numpy, pandas 모듈을 사용합니다. numpy 모듈에서 array()함수는 다른 행렬 객체를 생성하는 대부분 함수의 기반이 되는 함수입니다. 이 함수는 기본적으로 자료들의 순서가 자동으로 정해지는 배열을 생성하는 함수입니다. 그러므로데이터의 위치가 행 또는 열만이 표시되는 벡터, 여러행과 열을 가지는 행렬 모두 생성할 수 있습니다.  >>> import numpy as np >>> x=np.array([1,2,3]);x array([1, 2, 3]) 위 객체 x는 1행 3열의 행렬과 같이 보이지만 python은 3행인 열벡터로 인식합니다. 다음에 사용한 np객체.shape 는 객체의 차원을 알려주는 속성입니다. 이 함수를 적용하여 객체 x의 차원을 나타내면 다음과 같습니다. 속성: 클래스 내에서 객체의 생성하면 그 클래스의 기본 성질을 가집니다. 이러한 특성은 클래스 객체의 속성으로 나타낼 수 있습니다. 함수와 유사하지만 전달할 인수값이 없습니다. >>> x.shape (3,) 위의 결과는 열 표시가 없습니다. 즉, 객체 x는 3행으로 이루어진 열벡터임을 나타냅니다. python에서는 벡터와 행렬을 구분하고 또한 벡터는 1열로 이루어진 열벡터 1행으로 이루어진 행벡터로 구분할 수 있습니다. python에서는 모든 벡터는 열벡터로 취급합니다. 그러므로 x의 경우 열표시가 없습니다. python에서 벡터와 행렬을 구분한다는 것은 매우 중요합니다. 벡터, 행렬 연산의 경우 기본적으로 차원을 조정해야 하기 때문입니다. 예를 들어 행과 열이 바꾸는 것을 전치(transpose)라고 하며 객체.T 로 실행됩니다. 그러나 벡터일 경우는 실행되지 않습니다. >>> x1=x.T;x1 array([1, 2, 3]) >>> x1.shape (3,) 위 객체 x를 행렬로 변경하여 전치해 보면 다른 결과를 얻을 수

주가자료의 변형

주가 자료는 날짜,시가, 고가, 저가 종가, 거래량으로 정리됩니다. 이러한 기본자료로 부터 원하는 부분을 추출하기 위해 자료의 형태를 수정하여야 할 경우가 있는데 그러한 수정에 필요한 함수들을 작성해 보면 다음과 같습니다. 우선 날짜를 기준으로 구분하기 위해서는 날짜의 형식을 연산이 가능한 형태로 변경해 주어야 합니다. python에서 엑셀등으로 부터 자료를 호출할 경우 날짜로 된 인덱스는 문자형인 경우가 많으므로 이를 pd.Timestamp로 변경하여 연산이 가능하도록 합니다. 다음은 엑셀로 부터 호출한 kospi 자료의 날짜 인덱스의 변경 예입니다. >>> kos_day=[pd.Timestamp(i) for i in kos.index] >>> kos.index = kos_day 이러한 변화에 의해 다음과 같이 날짜에 대한 연산이 가능해 집니다. >>> kos.iloc[kos.index<pd.Timestamp(2011,1,1),:] Out[ 22 ]: Open High Low Close Volume 2010-01-04 1681.71 1696.14 1681.71 1696.14 295646000 2010-01-05 1701.62 1702.39 1686.45 1690.62 407629000 2010-01-06 1697.88 1706.89 1696.10 1705.32 425407000 2010-01-07 1702.92 1707.90 1683.45 1683.45 461562000 2010-01-08 1694.06 1695.26 1668.84 1695.26 379138000 2010-01-11 1700.79 1705.73 1694.12 1694.12 405115000 2010-01-12 1695.83 1701.16 1683.29 1698.64 382863000 2010-01-13 1683.

데이터를 목록화하여 함수 적용_python

연속변수와 명목변수가 혼합된 데이터 셋의 경우 연속변수를 명목변수로 목록화하여 어떤 통계량을 계산할 필요가 있습니다. 특히 anova 등 분산분석시 이러한 과정이 필요합니다. 다음의 자료는 각 환기 시스템에 대한 유량을 측정한 것입니다.  import numpy as np import pandas as pd >>> ven     folate ventilation 1      243  N2O+O2,24h 2      251  N2O+O2,24h 3      275  N2O+O2,24h ... 20     270      O2,24h 21     293      O2,24h 22     328      O2,24h 위 자료들 중 ventilation의 종류에 따라 float를 분류할 목적입니다. ventilation의 종류는 pd.unique() 함수를 사용하여 알아볼수 있습니다. 이 함수는 데이터들 중 고유한 부분만을 추출하여 반환합니다.  >>> idx=pd.unique(ven["ventilation"]) >>> idx array(['N2O+O2,24h', 'N2O+O2,op', 'O2,24h'], dtype=object) 즉 ventilation은 3가지로 값들로 구성되어 있으며 이에 따라 float를 구분하여 각각에 대한 통계량을 계산하고자 합니다.  우선 반복문을 사용하여 다음과 같이 분류하고 각 분류된 그룹화된 데이터셋에서 평균과 합을 계산할 수 있습니다.  ven1={} ...: mu={} ...: tot={} ...: for i in idx: ...:     ven1[i]=ven[ven.iloc[:,1]==i].iloc[:,0] ...:     mu[i]=np.mean(ven1[i]) ...:     tot[i]=np.sum(

수치형 자료의 목록화_python

시가, 고가, 저가, 종가, 거래량으로 구성되어 있는 일일자료 중 종가를 기준으로 다음을 계산 1) (당일 - 전일)/전일 2) 일정한 구간으로 구분 3) 원자료와 결합 위 과정중 1)을 위해 사용자 정의 함수를 작성하여 사용 def InterRetS(da, inter=1):     ref=da.shift(inter)     re=(da-ref)/ref     re.columns=da.columns+"interRet"     return(re) 테스트를 위한 자료는 kodex leverge 일일자료를 사용 위 함수는 지정된 시차의 자료와 각 열 (각 변수)별로 위의 1)을 계산합니다. kl1.head(2) Out[13]:             Open  High   Low  Close    Volume 2016-01-04  9810  9815  9470   9490  31928370 2016-01-05  9420  9620  9400   9525  27896887 ret=InterRetS(kl1) ret.head(2) Out[14]:             OpeninterRet  HighinterRet  LowinterRet  CloseinterRet  \ 2016-01-04           NaN           NaN          NaN            NaN  2016-01-05     -0.039755     -0.019868    -0.007392       0.003688              VolumeinterRet  2016-01-04             NaN  2016-01-05       -0.126266  위에서 계산한 각 열의 값들의 목록화를 위해 구간을 지정합니다. 즉, nplinespace(sart, end, num=50) 함수를 사용하여 구간을 지정합니다. mn=ret.min() mn Out[18]: OpeninterRet   

array 벡터 구조의 변환_reshape, np.newaxis

numpy 객체 array 구조에서 기본은 행 즉, 열벡터입니다. 예를들어 다음과 같은 1차원 구조의 객체를 생성합니다. x1=np.random.randint(0, 10, 5) x1 Out[24]: array([3, 5, 0, 6, 7]) 객체 x1의 경우 행 또는 열로 이루어진 1차원 구조입니다.  array 객체에서 데이터의 우선적 배치는 행입니다. 즉, 1행을 채우고 다음으로 2행을 채우는 방법이지요. 사실 이 방법은 python에서 뿐만 아니라 다른 언어의 배열(행렬) 구조의 기본 배치방법입니다. 그러므로 위 객체는 5행인 1차원 구조로 열의 수는 정해지지 않습니다. 다른 언어에서는 이러한 경우 열은 자동으로 1로 지정되지만 numpy의 경우는 지정되지 않습니다. 다음과 같지요. x1.shape Out[25]: (5,) 이 경우 다른 객체와의 행렬곱 등 연산의 경우 서로의 차원의 mismatch로 에러가 유발됩니다. 그러므로 위의 결과 (5, ) 를 (5, 1)과 같이 열을 지정해 줄 필요가 있습니다. 이를 위해 np.reshape() 또는 np.newaxis를 사용합니다. np객체.reshape(행수, 열수) : 원 객체의 차원을 지정한 차원으로 전환합니다. x1.shape Out[25]: (5,) x2=x1.reshape(5,1) x2 Out[27]: array([[3],        [5],        [0],        [6],        [7]]) x2.shape Out[28]: (5, 1) np객체[:, np.newaxis] : 원객체의 새로운 축 하나를 첨가합니다. 이 경우는 열에 새로운 축을 첨가하는 것으로 결과적으로 열의 수가 1로 지정됩니다. np.newaxis를 행의 위치에 지정하면 원 객체의 행과 열이 전치됩니다. x2=x1[:, np.newaxis] x2 Out[30]: array([[3],        [5],        [0],        

pandas DataFrame 객체의 호출방법

함수 내용 df[열이름], df[ [열이름1, 열이름2, ...] ] 열선택 , 다중의 열을 호출할 경우 호출할 열이름은 하나의 인자가 되어야 하므로 리스트([])로 묶어 표현해야 합니다. df.loc[행이름, 열이름] 라벨에 의한 행, 열 선택 df.iloc[정수형태로 행, 열] 위치를 나타내는 정수에 의해 행 선택 df.ix[행, 열] 행과 열을 지정하여 값을 호출, 이 메소드에 행과열은 이름 뿐 아니라 위치를 나타내는 정수 역시 가능합니다.(이 방법은 호출방식에서 제거 될 예정이므로 지양하는 것이 좋습니다.) >>> x              Open   High    Low  Close    Volume 2017-12-15  17710  17785  17455  17520   8021471 2017-12-18  17580  17630  17485  17585   5329171 2017-12-19  17685  17885  17500  17585   8411805 2017-12-20  17500  17670  17490  17520   4540009 2017-12-21  17430  17485  16840  16840  15900848 >>> x["Close"] Out[205]: 2017-12-15    17520 2017-12-18    17585 2017-12-19    17585 2017-12-20    17520 2017-12-21    16840 Name: Close, dtype: int64 >>> x.loc['2017-12-20', "Close"] 17520 >>> x.iloc[3, 2] 17490

회귀분석을 위한 주가데이터 만들기2_ DataForRegressionS

포스트 DayInInterRetStockS() 의 클래스를 소개하는 글에서 원 일일주가데이터로 부터 새로운 변수들을 생성하여 새로운 객체를 만들었습니다. 그 결과를 바탕으로 회귀분석을 위한 데이터 생성을 계속해 보면 다음과 같습니다.  이전의 데이터 경향으로 새로운 값을 예측하는 것이 회귀분석의 기본방향이라면 위에서 생성된 데이터들 중에 예측에 사용되는 변수들(독립변수)과 예측을 위한 변수(반응변수)를 구분해야 겠지요. 이전에 생성한 객체의 변수명은 다음과 같습니다.  >>> da.columns Index(['Open', 'High', 'Low', 'Close', 'Volume', 'Close:Open:ret',        'Close:High:ret', 'Close:Low:ret', 'Open:intRet', 'High:intRet',        'Low:intRet', 'Close:intRet', 'Volume:intRet', 'olag', 'hlag', 'llag',        'clag', 'vlag'],       dtype='object') 위의 변수들 중에 반응변수의 대상은 'Open', 'High', 'Low', 'Close'중의 하나의 변수가 될 것입니다.  예로서 Close를 반응변수로 한다면 나머지 변수들은 독립변수가 됩니다. 독립과 반응변수는 날들로 모형의 설계는  '당일까지의 독립변수들의 성격들로 다음날의 반응변수를 예측' 으로 구축할 것입니다.  이러한 구축을 위해 먼저 독립변수들과 반응변수를 구분하고 이 두 대상의 날짜를

회귀분석을 위한 주가데이터 만들기_DayInInterRetStockS 해설

일일주가 데이터에서 지정한 열을 기준으로 일중 수익률, 일간 수익률, 그리고 지정한 일전(preday)의 자료와 결합합니다. 목표한 자료를 위해 사용자 정의 클래스를 작성하였습니다. import numpy as np import pandas as pd import copy class DayInInterRetStockS:     def __init__(self, da):         self.da=da         self.nme=[i for i in self.da.columns]     def InRetS(self, DeColN):         nme0=copy.deepcopy(self.nme)         nme1=self.nme[DeColN]         del(nme0[DeColN])          nme2=[ ]         for i in nme0:             nme2.append(nme1+":"+i+":ret")             m=0         re=pd.DataFrame()         for j in nme0:             re[nme2[m]]=(self.da[nme1]-self.da[j])/ self.da[j] *100             m=m+1         self.Inday=re.drop(nme2[len(nme2)-1], axis=1)         return(self.Inday)     def IntRetS(self, Int=1):         nme1=[i+':intRet' for i in self.nme]         self.intrad=((self.da-self.da.shift(Int))/self.da.shift(Int)*100)         self.intrad.columns=nme1         return(self.intrad)     def ShiftdS(self

stock data의 정규 분포의 적합성_bootstrap, CLT

중심극한정리를 사용하여 최근 60일 또는 30일간의 일일자료를 바탕으로 자료의 수를 증가시켜 회귀모형을 작성합니다. 우선 이 자료가 정규분포 또는 로그노말 분포에 적합성을 확인합니다. 1. 자료 호출 (대상은 코덱스 레버리지) 엑셀에 보관된 자료를 호출합니다. >>> import numpy as np >>> import pandas as pd >>> from datetime import datetime, timedelta >>> kl=pd.read_excel('C:\\~~\\newD1.xlsx', sheet_name="kl") 호출한 자료 중에서 일정한 날짜 이후의 데이터를 추출합니다. 이 경우 사용될 수 있는 date 자료형은 pd.Timestamp를 사용하여 입력된 숫자형 타입을 date형으로 전환합니다. >>> startd=pd.Timestamp(datetime(2017,9,20)) >>> kl1=kl.ix[kl.index>=startd, :] >>> len(kl1) #데이터 프레임 형에서 행의 수를 나타냅니다.  60 위의 자료의 정규성 검사를 위해 QQ plot과 pearson 상관검정을 실시해 봅니다. >>> from scipy import stats >>> g=plt.subplot(111) >>> x=stats.probplot(kl1.ix[:,3], dist="norm", plot=g) >>> plt.show() 위의 객체 x에서 생성된 두 결과 객체 즉, 위 그림의 ordered Value(x[0][1])과 Theoretical quanties(x[0][0]) 사이의 상관분석을 실시해보면 다음과 같은 결과가 나타납니다. >>> stats.pearso

google spreadsheet에서 주가자료 호출하기

google finance에서 방대한 양의 주가자료를 제공하고 있습니다. 그러나 일부자료는 그래프만 제공되며 데이터를 볼수도 다운받을 수도 없습니다. 물론 python 패키지 를 사용하면 쉽게 자료를 호출하여 저장할 수 있습니다.  그러나 r의 경우   kosdaq군의 자료를 다운받을 수 없습니다. 이 경우 google spreadsheet에서 제공하는 다음 함수를 사용하면 자료의 호출이 용이하게 이루어 집니다. 물론 다운 받은 자료를 엑셀이나 csv 파일로 전환해야 하는 번거로움이 존재합니다. googlefinance("종목코드", "다운받을 항목", "시작날짜", "마지막날짜", "DAILY" 또는 "WEEKLY") 다운받을 항목으로 아래의 결과에와 같이 open, high, low, close, volume등이 있으며 이외에도 다양한 인수들이 존재합니다. KOSDAQ:KOSDAQ open Date Open Date High Date Low Date Close Date Volume high 2013. 1. 2 오후 3:30:00 501.75 2013. 1. 2 오후 3:30:00 501.86 2013. 1. 2 오후 3:30:00 499.2 2013. 1. 2 오후 3:30:00 501.61 2013. 1. 2 오후 3:30:00 342534000 low 2013. 1. 3 오후 3:30:00 504.64 2013. 1. 3 오후 3:30:00 504.76 2013. 1. 3 오후 3:30:00 498.98 2013. 1. 3 오후 3:30:00 499.07 2013. 1. 3 오후 3:30:00 388426000 close 2013. 1. 4 오후 3:30:00 500.27 2013. 1. 4 오후 3:30:00 504.85 2013. 1. 4 오후 3:30:00 499.44 2013. 1. 4 오후 3:30:0

결측치 조정

내용 무한값 처리 결측치와 무한값 처리 기존 값 적용 결측치와 무한값 처리 결측치 무한값 찾기에서 소개한 것과 같이 무한값과 결측치는 데이터 분석에 에러의 요인이 될 수 있습니다. 이들을 처리하는 방법을 알아봅니다. 무한값 처리 import math import numpy as np import pandas as pd x=np.random.rand(4, 3) x array([[0.17140876, 0.37005834, 0.14919173], [0.69883701, 0.40073611, 0.937198 ], [0.21978333, 0.69411595, 0.17695472], [0.91698133, 0.11506327, 0.9352178 ]]) x[1,2]=float("inf") x array([[0.17140876, 0.37005834, 0.14919173], [0.69883701, 0.40073611, inf], [0.21978333, 0.69411595, 0.17695472], [0.91698133, 0.11506327, 0.9352178 ]]) 객체 x에서 무한값의 인덱스를 결정하기 위해 np.isinf() 와 np.where() 함수를 사용할 수 있습니다. infId=np.where(np.isinf(x)) infId (array([1]), array([2])) 위의 결과와 같이 행과 열의 인덱스를 별도로 반환 됩니다. x[infId] array([inf]) np.delete(x, index, axis=None) x: 객체 index: 제거할 행 또는 열 인덱스로 기준축에 따라 행 또는 열이 결정됩니다. axis: 기준 축 객체 x의 무한값의 인덱스는 [1, 2]입니다. 다음 코드는 0축 즉

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