블로그 이미지
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

Notice

'read_csv'에 해당되는 글 1

  1. 2017.10.10 2. Time Resampling

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


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


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
prev 1 next