시계열(Time series) > 데이터 핸들링

2020. 12. 4. 22:30계량경제학

반응형

이번 포스팅에서는 시계열 방법론에 대해서 다루어 보도록 하겠습니다. 시계열 데이터는 하나의 객체에 대해 시간의 흐름에 따른 수집된 데이터입니다. 대표적인 예로는 국가의 GDP, 주가가 있습니다. 시계열 방법론은 GDP나 주가를 예측하는데 활발히 활용되는 방법중에 하나입니다. 추가적으로 계량경제학에서는 시간에 따른 $X$의 변화가 $Y$에 미치는 영향을 분석하는데 시계열 데이터를 많이 활용하게 됩니다. 이러한 것을 dyanmic causal effect라고 부릅니다. dynamic causal effect에 대해서는 차후에 자세히 다루도록 하겠습니다.

이번 포스팅과 앞으로 이어질 몇개의 포스팅에서는 AR, MA, ARIMA, ARIMAX, SARIMA와 같은 예측하기 위한 방법론을 주로 다루도록 하겠습니다. 

먼저 예측모형을 수립하기전에 Python을 활용하여 시계열 데이터를 다루는 방안부터 정리해보도록 하겠습니다.

이번 실습에서 활용한 데이터는 S&P500 index 데이터 입니다. S&P500 index 데이터는 Yahoo finance에서 다운받아서 활용합니다. (finance.yahoo.com/quote/%5EGSPC/history?p=%5EGSPC)

여기서 저는 종가만 활용할 것이기 때문에 종가 column만 가지고 오겠습니다.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import scipy.stats
import os

org_path = "..."
os.chdir(org_path)

## Data loading & Null checking
raw_csv_data= pd.read_csv("snp_index.csv")
df = raw_csv_data[["Date","Close"]].copy()
df.head()
df.describe()
df.isna().sum()
df.isna().any()

S&P500 인덱스를 Plotting 해보고, 정규확률그림을 그려보도록 하겠습니다. 정규확률그림을 통해서 S&P500이 정규분포를 따르는지를 확인할 수 있습니다. 정규확률그림에 대한 자세한 내용은 여기(direction-f.tistory.com/20)를 참고하시면 됩니다.

## Plotting
df.Close.plot(title = "S&P500 Price")

## 정규확률그림
scipy.stats.probplot(df.Close, plot = plt)
plt.show()

정규확률그림을 확인해 보면 S&P500 인덱스는 정규분포를 따르고 있다고 보기 어려울 것 같습니다.

현재 Date Column은 data type이 object로 되어 있습니다. 이를 datetime으로 변경하도록 하겠습니다. 추가적으로, index를 Date로 변경하고 시계열 데이터 frequency를 business day기준으로 하겠습니다. business day는 주말을 뺀 모든 날짜를 나타내게 됩니다. 

## from text to date
df.Date = pd.to_datetime(df_comp.Date, dayfirst = False)
df.head()
df.Date.describe()


## setting index
df.set_index("Date", inplace = True)
df=df_comp.asfreq(freq="B")
df.head()
df.isna().sum()

이렇게 Business day기준으로 바꾸게 되면 NA값이 발생하게 됩니다. 따라서 이 NA값을 처리하는 방안에 대해서 정리해보겠습니다. Pandas에서는 fillna 함수를 지원해줍니다. fillna 함수에 간단히 활용할 수 있는 method가 ffill과 bfill이 있습니다. ffill은 앞 방향으로 채워주는 것이고 bfill은 뒷 방향으로 채워주는 것입니다. 예를 들어 ffill을 활용하게 되면 2019-12-25를 채우기 위해서 2019-12-24 데이터를 활용하는 것이고 bfill을 활용하게 되면 2019-12-25를 채우기 위해서 2019-12-26을 이용하는 식입니다.

## fillna
df=df.fillna(method='ffill')
#df=df.fillna(method='bfill')
#df=df.fillna(value='df.Close.mean()')

마지막으로 이번에 정리할 시계열 방법론을 예측에 중점을 둘 것이기 때문에 train set과 test set을 나누는 방법을 정리하도록 하겠습니다. 중요한 것은 시계열 데이터이기 때문에 순서를 유지하는 것이 중요합니다.

## Splitting the data
size = int(lne(df)*0.8)
df_train = df.iloc[:size]
df_test = df.iloc[size:]

시계열 데이터를 Python의 Pandas를 활용해서 다루는 기본적인 방안을 정리하였습니다. 다음 포스팅에서부터는 본격적인 시계열분석방법론에 대해서 정리하도록 하겠습니다.

반응형