블로그 이미지
shadowchaser
이곳 저곳 이것 저것

calendar

1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

Notice

지난번엔 시계열에 대한 데이터를 어떻게 관리할 것인가에 대해서 논해봤다.


시간 기준 데이터 변경을 통해 시간을 줄이는 방법


datetime Index라는 것을 통해서 데이터를 받곤 하는데 그 데이터의 단위는 대체로 매우 작았다. (매일, 매시간, 매초등..)

하지만, 데이터 단위를 작게 사용하는 것도 좋지만 어쩔때는 데이터를 주기별로 모아서 (aggregation) 디스플레이 하는 것이 좋을 수도 있다.


이런 이슈를 풀기위해서 groupby를 쓸 수도 있지만, 이러한 접근 방식은 좋아보이지 않는다. 왜냐하면 business year starts나 weekday라던지 그런 내용들에 국한하여 데이터를 모을 때는 일일이 별도로 예외 케이스 들을 구현해야하니 말이다.

하지만 pandas는 이러한 frequency sampling tools 을 제공하여 이런 문제를 해결할 수 있도록 지원한다!!


본 강의를 진행하기 위하여 walmart 주가를 를 가져와서 작업을 진행해보자.



이젠 익숙해졌을 때가 되었을 것 같다. import 하는 것. 기본적으로 외우자.


데이터를 import 해야하는데, import 하는 방식은 크게 두가지가 있다.

첫번째로, 약간은 길지만 여러가지 상세 세팅이 가능한 방식

두번째로, 짧지만 아예 specific하게 설정이 정해진 방식


이번 강의에는 두가지 모두 소개하는 시간을 갖도록 해보겠다.



1. 약간은 길지만 좀 더 상세 세팅이 가능한 방식

일단 약간은 길지만 좀 더 수정 가능한 방식에 대해 소개한다

일단 rea_csv 함수로 파일을 읽어와본다.

정상으로 가져왔다.



이때 data type을 상세히 보면, date가 그냥 string형식으로 import 것을 확인할 수 있다. 이렇게 해서는 시간들을 원하는 바꿀 수 없다. 즉 resampling이 불가하다.!

어떻게 해야할까?

import가 완료된 다음 python에서 String인 Data type을 Datetime으로 변경해주려면 다음함수를 사용해야한다.

df['Date'] = pd.to_datetime(df['Date'])

이 함수 엄청 자주 사용할 것이다. 이미 데이터가 import 된 것에 대해 type을 변경을 해줄 일이 많기 때문이다.


오옷 정상적으로 변경이 되었다. date column의 data type이  datetime64으로 변경된 것으로 확인할 수 있다. 


그리고 이제 해줘야할 일은.... df.set_index('Date', inplace=False)를 써서 date column을 index행으로 바꿔줘야한다.

실행이 되면, Date에 있는 값들이 굵게 표시되는 것을 확인할 수 있다.



2. 짧게, 빠르게 세팅하는 방식

지금까지 한 일련의 행동들을 좀 축약할 수 있다.

df = pd.read_csv('walmart.csv', index_col='Date')라고 한다면

import할 때, Date colum을 index로 선정을 하겠다고 하는 것이다.

거기에다가 parse_dates라고 하면 엄청난 옵션이 되어버리는데,

왠지 날짜인것 같으면 그냥 날짜 형식으로 바꿔버리라는 command인것이다. 엄청 편하다. 그냥 년월일 형식과 같은 경우 그냥 parse_dates라고 하면 index로 선정해버리면서 data type도 converting 해버린다.


참고로, df.index를 보니까 DatetimeIndex로 data type이 변형된 것을 확인할 수 있다. 혹은 type(df.index)라고 해도 된다.



이제 원했던 time resampling에 대해서 봐보도록 하자.

pandas의 time resampling은 내가 원하는 주기대로 시간을 변경해주는 기능을 제공한다.
만약 주어진 데이터가 모든  365일 매일이라고 가정하자.
거기에서 1년동안의 수치를 평균을 구한다면?
평일 중에 max값을 구한다면?
모든 내용을 비교, 계산해야하는 귀찮은 일이 발생한다.
하지만 pandas에서는 그런 것들을 모두 해결해주는 time resampling 전용 함수들이 있다.

df.resampling(rule='A')

이 함수를 봤을 때 'A'라는 것은 1년에 한번씩이라는 의미이다. 'Q'라는 것은 매분기라는 의미이고.. 이런 방식대로 굉장히 다양한 세팅들이 있다.
weekday라던지 weekend라던지... holiday라던지.. 진짜 짱이다.


이렇게 받아온다음에, 그것에 대한 평균값들을 구할 수 있다.

가령 다음과 같이 작업하면, 매년간의 모든 데이터 값의 평균으 제공해준다.


만약 평균을 구하고자 한다면 'Q'를 선택하면, 아래와 같이 3, 6, 9, 12.. 이런 식으로 알아서 값을 제공해준다.


mean() 함수만 있는 것이 아니다. max값을 구할 수 있다.!!!


mean이나 max이외에 resample할 때 내가 원하는 함수를 등록하여 적용할 수도 있다.

나의 함수는 다음과 같은 방식으로 삽입할 수 있다. 

df.sample('A').apply(나의함수)

상기의 함수는 매년, 데이터의 첫번째 값을 구하라는 것이었는데, 잘 구해져 온다라는 것을 확인된다.


마지막으로 차트~

resample을 하는 주요이유는 아마 차트에 있을 것이라 생각한다.
데이터가 주어졌으면 상사/고객 등에게 일목요연하게 보여주어야~~ 투자를 받던지 이쁨을 받겠지.

내가 구현한 것에 대해 .plot()만 붙이면 그대로 차트로 변경해버릴 수 있다. 
아까전처럼 'A'로 하니까 매년만 구하면 되기 때문에 5개의 데이터만 존재하는 것을 확인할 수 있다.

한편 파라메터를 'M'으로 변경한다면 매월을 의미하는 것이기 때문에 적어도 60개 정도의 데이터가 보여져야겠다.

이쁘게 나오질 않는다. 그럼 뭘 해야한다고 했지?

그렇다 figsize를 통해서 figsize함수를 사용하여 인치수를 조정하자.

오늘도 이쁘장한 데이터를 작성하는데 성공했다.


다음엔 각각 시간과 데이터들이 매치되지 않을때, shift 하여 확인하고 참조하는 방법에 알아보도록 하겠다.!


혹시 궁금한 사항 있으면 댓글이나 메시지 주세요~ 감사합니다~


posted by shadowchaser

주식 차트 만들 때 필수로 쓰이는 기술에 대해 논하고자 한다.

차트를 만들때 datetime을 index로 처리를 해줘야할 때가 있다.

종종 시간과 날짜 정보는 별도의 열에 있을뿐만 아니라 실제 색인이 되기도 한다.

그럴 때를 위하여 index로 처리를 해줘야할 필요가 있다.


이번 강의에서는 서로 서로 다르게 모여진 자료들을 모으고 모아서 하나의 DataFrame으로 구성해보는 시간을 갖겠다.


백문이 불여일견

우선 아래와 같이 작업을 해보자.

지금까지 배워왔던 library들이 지속적으로 쓰일 것이니, 항상 붙여주도록하자.


datetime함수

Python의 datetime 함수는 정말 굉장히 쓰기 용이하다.

대략적인 스트링을 내가 작성한다음에 이렇게 시간을 구성해줘~ 라고 외치면 알아서 시간化 해준다.

아래와 같이 년, 월, 일, 시간, 분, 초를 작성해봤다.



년, 월, 일 세가지만 작성해도 정상적으로 작동한다.

정상적으로 보이는지 확인해보자.

datetime.datetime의 형태로 보여지는 것을 확인할 수 있다.


또 우리가 바랬던 것 처럼, 시간, 분, 초까지 작성하니 그 내용도 제대로 보이는 것이 보인다.


아울러 등록한 이후엔, 내가 원하는 시간을 뽑아서 사용할 수 있는 것도 확인할 수 있다. (my_date_time.day는 일자를 뜻하는 것이겠지..)


본격적으로 시간을 만들어보자.

헷갈리지 않게 최소한의 내용으로 Data Frame를 구성해보자.
2*2를 테이블을 작성하려면, 최소한 3가지 type의 요소가 필요하다.
index와 column과 data

index 및 Data 만들기

first_two라는 날자를 만들어보자. 2016년 1월 1일, 2016년 1월 2일의 날짜를 등록해보았다.
간단하다. 그냥 배열로서 [ ] 집어 넣으니, list라고 리턴하는 것을 확인할 수 있다.


DatetimeIndex함수

그리고서는 pd.DatetimeIndex함수를 넣으면! dt_ind라는 index를 가진 python만의 특별한 index로 변하게 된다.
잠시후에 보겠지만, 이 함수를 통해 python은 각 index의 값에서 최대값, 최소값등을 관리하게 된다.

그리고 data에는 random한 값을 2x2배열에 값을 넣어주도록 했다. np.random.randn 함수를 써서 표준화된 수를 생성해보았다.

column 만들기

그냥 cols라고 해서 a, b를 넣어보았다. 설마 잃어버린 건아니겠지... 


합산하여 Data Frame으로 만들기

자 지금까지 작성된 데이터(data, dt_ind, cols)를 바탕으로 datFrame을 만들어보자. 정말 단순하다.
df = pd.DataFrame(data,dt_ind,cols)

그리고 df를 찍어보면 값이 정상적으로 찍히는 것을 확인할 수 있다.


DataFrame에 datetimeindex가 된이상

type(df.index)를 찍어보니, datetimes,DatetimeIndex라는 속성을 갖고 있다.

아까전에 말했던 것처럼, pandas.core.indexes.datetimes.DatetimeIndex은 다양한 내용을 제공해준다.

argmax(), max(), argmin(), min()등.. 정말 다양한 값을 제공해준다.



자 여기까지 DataFrame을 작성하는 내용을 만들어보았다.


내일, 아니면 모레.. 시간이 난다면 Time Resampling에 대한 강좌를 작성해보겠다.

Time Resampling은 정말 꿀정보다.! 매일갖고 있는 데이터를 month단위로, year단위로 데이터를 변경하여 작성하는 것이니 말이다.


암튼 많은 기대 해주시고~ 궁금한 내용 있으면 댓글 부탁부탁드려요~


posted by shadowchaser

조금씩 우리가 하려던 것을 진행할 때가 된 것 같다.


지금까지 좀 먼 길을 걸어왔다. 


pands와 matplotlib를 통하여 엑셀 파일, csv 파일, 혹은 웹사이트에 있는 데이터를 가져와서 차트로 만들어보기도 했다.


차트를 만들 때 그냥 그래프가 아니라 plot, scatter, histogram 등 다양한 방식의 그래프를 제공했었다.


아, numpy와 pandas의 차이에 대해서 물어보는 사람이 있었다.


numpy수치배열등의 계산을 빠르게 하기 위해 만들어진 패키지이다. 파이썬의 기본 리스트 성능이 느려서이기 때문이다.


반면 pandasnumpy 기반으로 만들어진, 통계와 관련된 기능을 수행하는 패키지이다. 즉 pandas를 잘 다루려면 numpy의 기본을 잘 알고 있어야 한다.

Pandas와 Google API를 이용하여 주식정보 가져오기!

주식정보를 python으로 편하게 가져오는 방법도 여러가지지만,

그 중 가장 편하게 사용할 수 있는 두 가지는 바로 Google API를 사용하는 방법과 Quandl을 사용하는 방법일 것이다.

예전엔 Yahoo Finance API을 많이 쓰기도 했었는데.. 이젠 거의 안쓰이는 듯 하다.


잡설이 길었다.


금일의 목표

특정 시간의 facebook 주식차트를 google API를 통해 가져와서 차트로 만들어보자.


자, 일단 아래와 같이 실행해주자.

pandas_datareader가 설치가 안되었을 수도 있다. 

이럴 땐, pandas-datareader를 설치해주자. (pandas_datareader가 아님)





start, end 를 통해 시간을 설정해주고, web.DataReader 함수를 사용하여 데이터를 가져온 이후, facebook.head()를 입력하면 정상적으로 데이터를 가져온 것을 확인할 수 있다. 


참고로, 각 column에 대한 설명을 하자면

Open: 개장가, High는 고가, Low:저가 Close: 마감가, Volume: 거래량


한국 코스피 정보도 확인할 수 있다.!

그렇다면 나스닥에 있는 정보만 가져올 수 있는것이냐? 라고 물으신다면 절대 아니다. 한국도 된다.

선물 옵션 정보도 가져올 수 있다.

pandas는 주식정보가 아니라 선물 옵션 정보 또한 제공한다. 아래와 같이 call, put들에 대한 정보를 확인할 수 있다. 엄청 편하다.
아까전과 다르게 아래 커맨드 입력이 필요하다.
from pandas_datareader.data import Options


챠트 그리기로 마무리

아래와 같이 matplotlib를 import한뒤 facebook의 시가 종가 그래프를 한 번 차트로 작성해보았다.


충분한 설명이 되었을지 모르겠다.


다음편엔 quandl (http://www.quandl.com)을 통해서 정보 가져 오는 것을 진행해 보도록 하겠다.


진행하다가 궁금하시거나 막히는 부분있으면 언제든지 댓글로 남겨주세요~ 


posted by shadowchaser

Pandas에 대해 알아보도록 하자.

앞에서 Pandas를 통해 데이터를 관리하는 방법을 배웠다. 이번에도 Pandas를 통해 Data를 Visualization을 하는 방법을 알아보자.
진행하면서 matplotlib와 어떻게 다른지, 뭐가 좀 더 편한지 비교해보면서 진행한다면, 값진 시간이 될 것이다. 


Imports 

일단 df1 파일과 df2파일음 다음링크에서 다운 받고, 아래와 같이 준비를 하도록하자.


Style Sheets

hist함수를 통해 표현할 수 있다. 굉장히 편하다.


물론 plot함수로도 동일한 방법으로 표현도 되고.. 다른 방식으로도 가능하다. 



Plot Type에 대해 보도록하자

Plot은 아래와 같이 여러가지 타입을 제공한다.

  • df.plot.area
  • df.plot.barh
  • df.plot.density
  • df.plot.hist
  • df.plot.line
  • df.plot.scatter
  • df.plot.bar
  • df.plot.box
  • df.plot.hexbin
  • df.plot.kde
  • df.plot.pie

자 다시 df2를 한번 확인해보도록 하자. 한 번씩 확인해보면 다음과 같다.


Area와 Bar


사실 df2 파일은 index가 10까지로 구성되어 있다.

따라서 그냥 데이터를 표시하는 것도 좋지만 뭔가 의미 있게 보는 방법도 필요하겠지.


Barplot 

plot.bar(stacked=True)

위 함수는 굉장히 유용하다. 



이뿐만이 아니다. figsize를 통하여 챠트의 크기를 변경하고, 특정 그래프만 보여줄 수도 있으며,

Line Plot과 Scatter Plot

scatter를 통해서 심도를 구분해서 활용할 수도 있다.


한편 심도를 표기할 때 윗처럼 보이면 뭐가 중요한지 차이점을 구분할 수가 없다. 

그때, cmap등의 값을 활용하여 다음과 같이 매우 잘 활용할 수 있다.

BoxPlot



Hexagonal Bin Plot

scatter plot의 변형으로서, Bivariate(두 개의 변수[변량]을 갖는) Data를 처리할 때 매우 유용하다. 
이것도 색상을 좀 이쁘게 처리하면 더 일목요연하게 볼 수 있겠지. 똑같은 데이터인데 정말 달라보인다.


Kernel Density Estimation Plot(KDE)

커널 밀도 추청이라고 하는 KDE(Kernel Density Estimation)를 보아보자. 
다음과 같이 하나만 보여줄 수도 있고, 

여러개를 동시에 진행할 수도 있다.


이 정도만 보면 일단 Pandas 가지고 Visualization을 하는 기본정도는 알고 있네... 라고 생각할 수 있겠다.


특히 matplotlib를 사용하는 것보다 훨씬 사용하기 쉽다는 것이 느껴졌을 것이다~!!! 즉 엥간하면 pandas를 쓰자~ 라고 생각하면 되겠다~


다음편에는 조금더 상세한 Pandas 응용편을 소개하도록 하겠다.!

'Python > 02_Visualization with Matplotlib, Pandas' 카테고리의 다른 글

4. Pandas를 통한 시간별 시각화  (2) 2017.10.07
2. Matplotlib 활용하기  (1) 2017.10.06
1. Matplotlib 기초  (0) 2017.10.06
0. 들어가기전에  (0) 2017.10.06
posted by shadowchaser
2017. 10. 6. 02:56 Python/01_Pandas

Groupby기능에 대해서 논해보자.

groupby 기능은 우리가 알고 있는, sql에서 쓰는, groupby기능을 일컫는다.
Pandas에서 groupby를 어떻게 활용하는지 확인해보자.

일단 상기와 같이 입력하면 테이블와 같은 값이 나온다. 각각 인력별로 얼마씩 sales를 했는지 나오는데... 저렇게 된 모습은 그냥 정리를 한 것이지, 활용을 한다고는 볼 수 없다.

groupby 함수

pandas에서 groupby는 다음과 같이 다양하게 사용될 수 있다.
평균값, 합, 중간값은 물론...

다양한 유틸리티가 존재한다..

groupby().count(), groupby().max()등의 기능들이 있다.


groupby의 describe 함수

근데 이런 내용들은 모두 describe라는 곳에서 다 관리해준다. 진짜 유용하므로 필수 암기!! 적절히 확인하요 배치하기만 하면 된다.

한편 describe().transpose()를 통해 행과 열을 역전하여 볼 수 있으니까 참조... 

(버전별에 따라 기본 보기가 거꾸로인 곳도 있었다. 그러니까 당황해하지 마시길..)


'Python > 01_Pandas' 카테고리의 다른 글

5. Input & Output (파일 읽고 쓰기)  (0) 2017.10.06
4. Join, Merge, Concatenating  (0) 2017.10.06
2. Missing Data 사용방법(dropna, fillna)  (0) 2017.10.06
1. Data Frame 사용방법  (0) 2017.10.06
posted by shadowchaser
2017. 10. 6. 02:48 Python/01_Pandas

Missing Data

numpy와 pandas를 쓸때, NaN이 나오는 경우가 엄청많이 생긴다. 엑셀에서 값을 만들때 NaN들이 생기거나 Infinite 값들, 혹은 누락된 값이 생기는데 이러한 값들을 예외 처리하는 것은 정말 중요하다. 기본기라고 생각한다. 그러한 바에서 Missing Data를 관리하는 스킬을 필히 갖추도록 하자.

아래와 같이 Sample Data를 만들어보자.


Dropna 함수의 활용

굉장히 일목요연하다. dropna함수는 column내에 NaN값이 있으면 해당 내용은 필요없다 간주하고 삭제해버린다.
따라서 7번줄과 같은 경우 1행, 2행을 모두 삭제해버리는 것이다.

한편 dropna(axis=1)과 같은 경우 반대다. 열을 삭제해버린다.


dropna(thresh=2)라면 thresh는 threshold(임계값)을 설정할 수 있는데, NaN이 2개 이상 있는 것에 대해서만 삭제해버린다는 의미이다.


fillna()함수

fillna함수도 굉장히 유용한다 NaN을 특정 값으로 대체하는 기능을 한다. 특정 텍스트라던지, 평균값이라던지... 굉장히 유효한 함수니까 필히 암기하자.



'Python > 01_Pandas' 카테고리의 다른 글

5. Input & Output (파일 읽고 쓰기)  (0) 2017.10.06
4. Join, Merge, Concatenating  (0) 2017.10.06
3. Groupby 기능  (0) 2017.10.06
1. Data Frame 사용방법  (0) 2017.10.06
posted by shadowchaser
prev 1 next