일정 간격으로 뽑기 :: 시계열 분석 - mindscale
Skip to content

일정 간격으로 뽑기

(데이터 프레임 날짜 인덱스 설정에서 이어집니다)

asfreq

df.Price의 경우 하루 단위의 데이터로, 데이터가 굉장히 많습니다. 이것을 일정 간격으로 요약해서 보시려면 asfreq 함수를 사용합니다.

시간 간격은 다음과 같이 지정할 수 있습니다.

  • A(연말)
  • Q(분기말)
  • M(월말)
  • W(주말)
  • D(일)

B를 붙이면 주말을 제외합니다(B는 Business day, 즉 영업일을 뜻합니다).

S를 뒤에 붙이면 초를 뜻합니다. AS(연초), QS(분기초) 등

분기에 기준 월을 붙일 수 있습니다: QS-FEB는 2월 1일부터 3개월 간격으로 분기를 구분합니다.

주의 경우에는 기준 요일을 붙일 수 있음: W-WED라고 하면 매주 수요일을 기준으로 1주일을 구분합니다.

df.Price.asfreq('M')
Date
2014-03-31     555.45
2014-04-30     525.22
2014-05-31        NaN
2014-06-30     573.70
2014-07-31     570.03
               ...   
2021-08-31    2909.24
2021-09-30    2665.31
2021-10-31        NaN
2021-11-30    2849.04
2021-12-31    2893.59
Freq: M, Name: Price, Length: 94, dtype: float64

여기서 볼 수 있듯이, df.price.asfreq('M')을 사용하면 각 월의 마지막 날짜를 확인할 수 있습니다.

예를 들어, 5월 30일이 NaN인 걸 보면, 아마도 5월 31일이 주말이라서 주식 시장이 열리지 않았던 것 같습니다. 이런 경우, 그 날의 주가는 없는 것입니다. 비슷하게 10월 31일도 월의 마지막 날이지만 주가가 없기 때문에 값이 비어 있습니다.

다른 공휴일은 어쩔 수 없지만, 토요일이나 일요일은 제외하고 싶다면 앞에 B를 붙여줍니다. 이는 비즈니스 데이를 의미하는데, 주말을 제외한 영업일을 기준으로 삼기 때문입니다.

그럼 이제 이를 차트로 그려봅시다. df.Price.plot을 사용하면 주가 차트가 그려집니다. 연말에 주가만 점으로 찍어서 보고 싶다면 B, A를 붙입니다. 이는 비즈니스 영업일을 기준으로 연 단위인데, 여기에 S를 추가하면 연초가 되고, 단순하게 A로 끝나면 연말인 12월 31일 같은 날을 가리킵니다.

연말이 토요일인 경우에는 해당 주의 금요일의 데이터를 뽑게 됩니다.

그래프에는 다양한 옵션을 줄 수 있습니다. 예를 들어 alpha인데, 이는 불투명도를 의미합니다. alpha가 0이면 완전투명이고, 1.0이면 일반적인 선이 됩니다. alpha가 0.3인 경우, 색상이 30%만 나타납니다. 이렇게 해서 두 개의 그래프를 겹친 상태에서 한 쪽을 흐릿하게 보여줍니다.

빨간색으로 그려진 선과 점은 style 옵션으로 지정되었습니다. o는 점의 모양을, -는 선의 모양을 나타냅니다.

이처럼 그래프를 겹쳐 그리면 주가와 연말 주가를 한 눈에 파악하는데 도움이 됩니다. 그래프 두 개를 겹쳐 그리려면 같은 코드 셀에 두 개의 그래프를 그리는 코드를 함께 넣어야 겹친 그래프를 얻을 수 있습니다. 그렇지 않으면 두 개의 그래프가 따로 그려집니다.

df.Price.plot(alpha=0.3)
df.Price.asfreq('BA').plot(color='red', style='o-')
<Axes: xlabel='Date'>

빈 값 채우기

비어있는 데이터를 처리하는 것은 복잡한 과정입니다. 특히 공휴일 같은 경우 수동으로 일일이 찾아 채워주는 것은 매우 번거롭습니다. 예를 들어, 추석 같은 경우는 매년 날짜가 바뀌므로 20년치 데이터를 가지고 있는 상황에서 20년 전의 추석 날짜를 찾아서 데이터를 개선하는 것은 큰 도전입니다.

이럴 때 이용할 수 있는 방법 중 하나는 앞뒤 데이터를 활용하는 것입니다. 예를 들어, 2016년 12월 31일이 비어있다면 이 날짜의 주변 데이터를 참고하여 값을 채워주는 겁니다.

예시로 2016년 12월 31일의 앞뒤 날짜의 데이터를 확인해보면 12월 30일에는 771달러, 1월 3일에는 786달러였습니다. 하지만 12월 31일, 1월 1일, 1월 2일 총 3일치 데이터가 빠져 있습니다.

df.Price['2016-12-30':'2017-01-03']
Date
2016-12-30    771.82
2017-01-03    786.14
Name: Price, dtype: float64

따라서 이 경우에는 값들을 메꿔야 합니다. 이를 위해 method 옵션을 설정하시면 됩니다. method 옵션에는 ffillbfill 두 가지가 있습니다.

fill이란 값들을 채워넣는다는 뜻입니다. f는 '앞'을 의미하는 'forward'를 가리킵니다. 따라서 ffill은 빈 데이터를 앞의 데이터로 채웁니다.

예를 들어, 연말에는 12월 31일 데이터가 필요한데, 만약 12월 31일 데이터가 비어 있다면, ffill을 사용하면 이전 날의 데이터를 가져와서 채웁니다. 이렇게 되면 12월 31일의 데이터가 771.82로 채워지게 됩니다.

df.Price.asfreq('A', method='ffill')['2016-12-31']
771.82

b는 '뒤'를 의미하는 'backward'에서 왔습니다. bfill은 뒤의 데이터로 채웁니다.

df.Price.asfreq('A', method='bfill')['2016-12-31']
786.14