논문이 끝난 줄 알았는데 어디에 내야한다며 영어를 아주 제대로 해오라는 교수님의 말씀에 저의 모든 계획이 무너지고 있습니다. 더 잘 만들어서 포스팅을 하려고 했는데 좀 아쉽지만 어쨋든 이번 포스팅에서는 판다스의 rolling을 이용한 분석 예제을 할까 합니다. 영원히 안 올릴 수도 있을 것 같아서 준비가 덜 되었지만 맛보기로 올립니다. 이게 코딩이라기보다 금융 데이터 분석에 가까워서 카테고리에 안 맞을 수 있습니다. 어쨋든 앞선 포스팅에서 이동평균선을 rolling으로 구했었는데 이걸 가지고 다양한 각도에서 볼 수 있는 통계적 분석을 할까 합니다. CJ제일제당의 데이터를 가지고 해보겠습니다. 편의를 위해 날짜와 종가만 가지고 오겠습니다. df 통계 수치 window를 20으로 해서 할 수 있는 몇가지 통..
데이터프레임의 타입을 바꾸는 방법입니다. 사용 데이터는 국내 etf인 kosdaq 150 레버리지의 가격입니다. df.head() 데이터프레임 타입 확인하기 데이터프레임 타입을 확인하려면 dtypes를 이용합니다. df.dtypes 각 컬럼의 타입이 나옵니다. 지금 df 같은 경우 날짜만 datatime64[ns] 이고 나머지는 int64 입니다. 데이터프레임 타입 전체 한꺼번에 바꾸기 모든 타입이 같을 때는 df.astype('타입')을 하면 바뀌기 때문에 간단합니다. 물론 무조건 되는 건 아니고 서로 바뀔 수 있는 타입이라는 가정에서 된다는 얘기입니다. astype이 만능키가 아님을 강조합니다. astype은 다루기 쉬우니깐 요령 하나를 알려드릴까 합니다. 타입이 다른게 섞여있을 때 데이터프레임을 분..
데이터프레임의 column의 이름을 바꾸는 방법입니다. column 이름바꾸기 df 국내 ETF인 kosdaq 150 레버리지입니다. df로 놓겠습니다. df의 column을 보면 한글로 되어있습니다. 작업을 편하게 하기 위해서 한글로 된 column 이름을 Date,Open,High,Low,Close로 바꾸려고 합니다. column 전체 이름 한꺼번에 바꾸기 전체 column의 이름을 바꾸고 싶다면 df.columns로 바로 할 수 있습니다. df.columns를 요청하면 다음과 같이 리스트형식 비슷하게 나옵니다. df.columns columns들을 바꾸기 위해서 다음과 같이 합니다. df.columns = ['Date','Open','High','Low','Close'] df 근데 이건 모든 걸 다..
데이터프레임의 데이터가 많으면 원하는 자료를 눈으로 찾기가 어려운데 흔히 하는 찾기(ctrl+f)기능과 같은 역할을 하는 str.contains()를 소개하겠습니다. 예제 자료는 국내의 etf 종목리스트입니다. listing이라고 합시다. listing 468개의 종목이 있지만 내가 원하는건 레버리지가 붙은 종목인데 찾을수가 없습니다. 이럴 때 '레버리지' 만 가지고 종목을 찾아보고 싶을때 str.contains()을 씁니다. str.contains() 타입 일단 str.contains()만 했을때 어떤 타입이 나오는지 확인해보겠습니다. 이 함수는 column을 대상으로 찾는 기능이므로 찾을 대상을 column으로 지정하고 해야합니다. listing['Name'].str.contains('레버리지') b..
join() 함수를이용한 데이터프레임 합치기입니다. join()은 인덱스를 기준으로 왼쪽으로 순차적으로 연결되는 방식입니다. 어떤 인덱스를 기준으로 하느냐에 따라 배열이 달라집니다. df1= pd.DataFrame({'A':[10,20,30,40]},index=['a','b','c','d']) df2 = pd.DataFrame({'B':[15,25,35,45]},index=['b','c','g','f']) 예를 위해 df1과 df2의 인덱스 중 2개만 같게 했습니다. b,c가 같습니다. df1.join(df2) 먼저 df1으로 join을 하면 df1의 인덱스를 따라서 df2가 붙여지게 됩니다. df2의 b,c 값은 나오고 나머지 값은 NaN로 나오게 됩니다. df2.join(df1) df2를 기준으로 하..
데이터프레임 합치는 방법인 append와 concat에 대해서 알아보겠습니다. 가장 기초적인 방법이고 단순한 결합입니다. 값이 없으면 결측치로 처리하고 마는 방법입니다. 빠르기로 치면 append가 가장 빠르지 않나 싶은데 저도 실제로 작업을 할때 append랑 merge를 주로 쓰게 되는 것 같습니다. append 여기저기서 나타나는 append부터 보겠습니다. 친숙한 메쏘드라 어려움은 없습니다. column을 기준으로 배열이 좌우된다는 것만 기억하고 하면 됩니다. df1 = pd.DataFrame({'A':[10,20,30,40]},index=['a','b','c','d']) df2 = pd.DataFrame({'A':[10,20,30,40]},index=['e','f','g','h']) df3 = ..
groupby() 함수를 이용해 데이터프레임을 범주별로 묶어 통계내고 범주별로 출력하는 방법을 소개하겠습니다. 엑셀에서 흔히 쓰는 필터링 역할을 groupby()를 통해 할 수 있는데 한 눈에 볼 수 없다는 단점은 있지만 groupby로 손쉽게 묶어낼 수 있고 빠르게 데이터 처리를 할 수 있기 때문에 유용하게 사용됩니다. 예제 자료는 랜덤으로 (9,4)을 만들어서 넣었습니다. 인덱스는 시간데이터로 하였습니다. 랜덤으로 만들고 시간데이터를 만드는 방법은 이미 포스팅을 해놨으니 관련 포스팅을 참고해주시기 바랍니다. df 9개의 행으로 이루어진 데이터프레임입니다. df를 3개씩으로 범주를 넣어 구분하겠습니다. df['Quarter'] = ['Q1','Q1','Q1','Q2','Q2','Q2','Q3','Q3'..
판다스로 시간데이터를 만들어 보겠습니다. 어디서 데이터를 가져오는 게 아니고 직접 만들어서 하는 방법입니다. 타임시리즈 데이터로써 데이터를 다루고 싶을 때 쓰면 유용한데 date_range() 함수를 쓰면 시간데이터를 만들 수 있습니다. dates = pd.date_range('2020-1-1',periods=6,freq='M') 이렇게 간단히 만들 수 있습니다. 타입은 datetime64로 만들어집니다. 파라미터 date_range()의 파라미터는 다음과 같습니다. 파라미터 포맷 기능 start string/datetime 데이터의 시작시간을 지정 end string/datetime 데이터의 끝시간을 지정 periods integer/None 기간의 수를 지정 freq stgring/Dateoffset..
파이썬으로 만든 데이터프레임을 엑셀 저장하고 불러오는 방법을 소개하겠습니다. 한 시트에 저장하는 방법이 있고 여러 시트에 저장하는 방법이 있습니다. 사실상 여러 시트에 저장하는 방식으로 모든 것을 할 수 있지만 코딩은 최대한 적게 쓰고 많은 일을 하는 것이 좋으므로 너무 간단해서 허무할 수도 있지만 한 시트에 저장하는 방법을 따로 떼서 알려드리겠습니다. 한 시트에 엑셀 저장하기 df = pd.DataFrame({'alpha' : ['a','b','c','d','e'],'beta':['A','B','C','D','E']}) 다음과 같은 데이터 프레임을 엑셀로 저장하는 건 간단합니다. to_excel() 메쏘드를 사용하면 됩니다. df.to_excel('경로'/'파일이름.xlsx') 엑셀로 저장이 되었습니다..
데이터프레임에서 특정조건의 데이터를 필터링하는 2가지 방법을 소개하겠습니다. isin()을 이용하는 방법 비교 조건문을 이용하는 방법 다음과 같이 소문자, 대문자로 이루어진 데이터프레임을 만들었습니다. df = pd.DataFrame({'alpha' : ['a','b','c','d','e'],'beta':['A','B','C','D','E']}) df isin()을 이용하는 방법 isin()을 하면 해당 원소가 있는지를 판단해줍니다. 즉, 해당 값이 있으면 True, 없으면 False를 반환합니다. df['alpha'].isin(['a','b']) 이것을 이용하면 필터링이 가능합니다. df[df['alpha'].isin(['a','b'])] and(&),or(|) 도 가능합니다. df[df['alpha'..
데이터프레임을 돌 때를 순회한다고 하는데 데이터프레임을 어떤 방식으로 순회할 수 있는지 살펴보겠습니다. 다양한 방법으로 순회처리를 할 수 있습니다. 이번 포스팅에서는 4가지 방법을 설명하겠습니다. 인덱스를 사용하는 방법 itertuples iterrows iteritems 4가지 모두 간단합니다. 이런게 있는지 몰라서 못 쓰는 것 뿐이지 한번 보면 바로 쓸 수 있습니다. 이번에 준비한 데이터는 sp500의 종목,종목코드,섹터,업종 데이터입니다. 이전 포스팅에서 여러번 썼지만 뭘 보여줄 때 이만큼 유용한 데이터 파일은 없는 것 같습니다. df Symbol을 인덱스로 두었습니다. 인덱스를 사용하는 방법 가장 많이 사용하는 방법이 아닌가 싶습니다. 예로 바로 보는게 빠르겠죠? 인덱스를 활용해서 종목명을 가져오..
DataFrame을 딕셔너리로 변환하는 방법에 대해 알아보겠습니다. to_dict 을 이용해 할 수 있는데 경우의 수가 좀 있어서 다양하게 딕셔너리를 만들 수 있습니다. 매개변수도 존재하는데 list, records, series, index,split, dict을 괄호에 넣으면 그에 맞게 변환을 해줍니다. column 기준으로 딕셔너리 만들기 {column : {index: value}} column 기준으로 리스트로 반환 {column : list} column 기준으로 series로 반환 {column : series} 각 row를 딕셔너리로 해서 리스트로 반환 [{column1 : value1, column2 : value2}] 각 row를 딕셔너리로 해서 딕셔너리로 반환 {index : {col..
주식 차트를 분석하기 위해 이동평균이 필요할 때가 있습니다. 그렇지만 보통 주식데이터는 주가와 거래량만을 가져오기 때문에 이동평균선을 직접 구해야 합니다. 만약 5일 이동평균선을 구하려고 한다면 5일씩 잘라서 계산을 해야하는데 엑셀로 직접할 수도 있지만 번거롭습니다. Pandas 를 이용하면 이동평균선을 쉽게 구할 수 있습니다. Rolling()이라는 메쏘드를 쓰면 되는데요. Rolling()을 이용하여 10일 이동평균선을 구해보도록 하겠습니다. 삼성전자 가격 데이터입니다. 이것을 df로 하고 구해보겠습니다. 먼저 10일 이동평균선을 구하기 위해서 10일치의 종가의 평균을 구해야 하니 10개를 잡고 그것의 평균을 구합니다. 10개를 잡기 위해서 rolling을 씁니다. window 파라미터에 내가 잡을 ..
일반적으로 수익률을 구하면 다음과 같이 구합니다. (매도가격-매수가격)/매수가격 이렇게 구하는 수익률을 판다스를 이용하면 편하게 구할 수 있습니다. 바로 pct_change() 메쏘드를 쓰면 되는데요. 예를 위해 삼성전자의 종가 데이터를 가져와서 해보겠습니다. 일별 수익률 df['Daily_rtn'] = df['Close'].pct_change() Daily_rtn 으로 새로운 column 을 만들었습니다. Daily_rtn에 일별 수익률이 나오는 걸 볼 수 있습니다. N일 수익률 특정 N일에 대한 수익률을 구하고 싶다면 pct_change(periods=N)을 입력하면 됩니다. N = 3으로 놓겠습니다. df['N=3'] = df['Close'].pct_change(periods=3) N=3 이므로, ..
판다스를 사용하다보면 내가 원하는만큼만 잘라서 다시 DataFrame을 만들어서 데이터 분석을 하고 싶을 때가 있습니다. 저는 특히 시간데이터를 많이 다루다 보니 인덱스 슬라이싱을 해야하는 경우가 많이 생기는 것 같습니다. 그럴 때마다 항상 bool을 이용한 방식으로 인덱스 나누기를 했는데 인덱스가 여러개거나 논리가 많아지면 괄호 하나 따라서 해석이 잘못 되기도 하고 헷갈리기도 합니다. 그러면 자연스럽게 오류가 발생하고 오류를 해결하느라 애를 많이 먹고 시간은 시간대로 흘러갔습니다. 이런 불편함을 감수하던 차에 우연히 새로운 방법을 알게 되서 까먹으면 다시 보려고 포스팅으로 남깁니다. Bool 로 인덱스 나누기 저의 예전 방법은 and, or을 이용한 방식이었는데 CJ제일제당의 과거 주가 데이터로 보여드..