본문 바로가기
머신러닝

pandas를 이용한 시계열 데이터 처리에 대해

by 제리의 세계 2023. 5. 3.

안녕하세요! 제리입니다.

 

오늘은 시계열 데이터에 대해서 다뤄보는데 그 중 pandas를 사용한 방법에 대해서 소개하려고 합니다.

참고한 곳은 유데미 강의 중 '시계열 데이터 분석 with 파이썬' 입니다!

우선 시계열 데이터는 시간 속 데이터로 일반 데이터와 다른 특징을 지니고 있기에

다른 데이터 처리 방법을 사용해야합니다.

우선 코드로 간단히 한번 봐보시죠!

간단한 시계열 데이터 처리

from datetime import datetime # 시계열 데이터를 표현하는 라이브러리 중 하나
# 연, 월, 일, 시, 분, 초 이렇게 있으며 입력하지 않은 값은 자연스럽게 0으로 처리가 됩니다.
my_date_time = datetime(my_year,my_month,my_day,my_hour,my_minute,my_second)

# 또는 이렇게 리스트 속에서 type을 바꿔주는 dtype을 이용해 datetime 형식으로 바꿔 줍니다. (여기서 64는 64bit를 의미합니다.)
np.array(['2016-03-15', '2017-05-24', '2018-08-09'], dtype='datetime64')
# 만일 시간을 추가 하고 싶다면 'datetime64[h]' 이런식으로 hour를 의미하는 h를 추가합니다.

여기까지가 시계열 데이터를 처리하는 극히 기초적인 부분입니다.

이렇게 흔히 format을 바꿔서 이 데이터가 시간 데이터라는 것을 의미해줘야 진행이 됩니다.

이제 pandas를 이용하도록 하겠습니다.

pandas를 이용한 시계열

# 월/일/연도 이런 식으로 표현이 되며, periods는 기간을 의미하고, freq는 어떤 방식으로 기간을 진행할 지 의미합니다. 아래에서는 day를 의미하는 것입니다.
pd.date_range('7/8/2018', periods=7, freq='D')

여기서 많이 쓰이는 방법이 바로 인덱스 부분을 날짜로 바꿔서 시계열 데이터를 처리하는 것입니다.

df.set_index('Date', inplace = True)
df = pd.read_csv('데이터 csv', index_col='Date', parse_dates=True)

이것을 생각보다 많이 사용하기에 인덱스를 설정하는 것 알아주시면 좋습니다!

또한 처음 데이터를 불러올 때부터 인덱스를 바꿀 수 있습니다.

이제 시간 데이터를 인덱스로 처리했다면 시간에 따라 값에 대해서 구해봐야겠죠??

  • resample을 이용한 평균, 최대, 최소 등 구하기

resample 조건

# Yearly Means
df.resample(rule='A').mean()

# monthly min
df.resample(rule='M').min()

# 바차트로 그려보기
df[컬럼].resample('M').max().plot.bar()

# 참고로 그냥 라인 차트를 그려보고 싶다면 그냥 plot()으로 하시면 됩니다.

월별 최대값 바차트

shift를 이용한 값 이동

날짜에 대한 데이터 값들을 주어진 수에 맞게 앞이나 뒤로 하나씩 전체적으로 옮길 수 있습니다.

우선 한번 보시죠

# 다음 날짜로 값을 이동
df.shift(1)

# 이전 날짜로 값을 이동
df.shift(-1)

괄호 안 숫자의 변경을 통해 이동할 날짜를 작성해주면 되고 다음 날짜로 이동될 시 1행의 데이터는 NAN 결측치 처리가 되며 마지막 행의 값은 없어지게 됩니다. 이 점 유의하시기 바랍니다.

rolling & expanding

롤링도 어떻게 보면 shift와 유사하다고 할 수 있습니다. 다만 다른 점은 shift는 값을 이동했다면,

롤링은 윈도우(Window)의 개념으로 평균을 내서 이동한다고 보시면 될 것 같습니다.

 

시계열 rolling

날짜를 총 30개를 더해서 평균을 낸 그림이 주황색입니다.

주황색 라인을 자세히 보시면 앞 부분이 없다는 것을 알 수 있습니다. 처음부터 30개이기에 앞부분의 데이터를 활용하기에 처음 값들은 NAN 처리가 됩니다.

 

롤링이 커질수록 좀 더 일반적인 현상을 보여주고 smooth하다는 것을 알 수 있습니다!

또한 mean()이 아니라 다른 것을 사용하셔도 됩니다~

 

rolling의 경우는 주어진 날짜에 대해서 집계함수를 계산한 것이지만 누적하는 결과를 가져오는 것이 바로 expanding입니다.

 

시계열 expanding

그래프의 마지막 값은 전체의 평균이 될 것입니다.

 

마지막으로 format 지정 표를 보여드리도록 하겠습니다.

시계열 format

흔히 이것을 이용해 format을 지정해줍니다. '%Y-%m-%d' 이런식으로 많이 사용하기에 알아두시면 좋습니다!

 

다음은 pandas가 아닌 statsmodels를 이용하여 시계열 처리에 대해서 다뤄보도록 하겠습니다.

감사합니다.