서론
머신러닝에서 입력되는 데이터는 간혹 시계열 데이터가 있습니다. 단순한 데이터의 예로는 주식값이 있습니다. 머신러닝에서는 이전 데이터를 현재 데이터에 넣으면 좀 더 정확한 학습이 가능한 경우가 있습니다. 이것을 lag(지연) 데이터라고 표현합니다.방법
python에서는 lag 데이터 처리를 어떻게 하면 될까요? 현재 날짜 기준으로 이전 날짜 데이터가 빠지는 경우도 있습니다. 아래 데이터 참고 바랍니다.lagdata.csv
date,K122630_close,K122630_open,K122630_high,K122630_low 2018-12-28,11445.0,11375.0,11530.0,11370.0 2018-12-27,11340.0,11405.0,11430.0,11280.0 2018-12-26,11030.0,11065.0,11200.0,10915.0 2018-12-24,11360.0,11310.0,11370.0,11225.0 2018-12-21,11370.0,11330.0,11405.0,11275.0 2018-12-20,11375.0,11485.0,11525.0,11260.0 2018-12-19,11625.0,11510.0,11640.0,11470.0 2018-12-18,11465.0,11365.0,11585.0,11365.0 2018-12-17,11555.0,11480.0,11625.0,11480.0
그래서 생각해볼 수 있는 방법이 pandas의 shift 함수 입니다.
http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.shift.html
여기에서는 shift 함수를 이용하여 lag 데이터를 만들 예정입니다.
구현 내용은 아래와 같습니다.
import pandas as pd df = pd.read_csv('lagdata.csv', header=0, delimiter=',', encoding='utf8') print(df) df['K122630_close_lag'] = df['K122630_close'].shift(1) print(df)
df['K122630_close_lag'] = df['K122630_close'].shift(1)
결과
date K122630_close K122630_open K122630_high K122630_low K122630_close_lag 0 2018-12-28 11445.0 11375.0 11530.0 11370.0 NaN 1 2018-12-27 11340.0 11405.0 11430.0 11280.0 11445.0 2 2018-12-26 11030.0 11065.0 11200.0 10915.0 11340.0 3 2018-12-24 11360.0 11310.0 11370.0 11225.0 11030.0 4 2018-12-21 11370.0 11330.0 11405.0 11275.0 11360.0 5 2018-12-20 11375.0 11485.0 11525.0 11260.0 11370.0 6 2018-12-19 11625.0 11510.0 11640.0 11470.0 11375.0 7 2018-12-18 11465.0 11365.0 11585.0 11365.0 11625.0 8 2018-12-17 11555.0 11480.0 11625.0 11480.0 11465.0
실행한 결과는 위와 같습니다.
여기에서 생각해봐야 할것이 있습니다. lag 데이터는 현재 데이터에 과거 데이터를 올려서 feature를 만드는 것입니다. 그런데 12-28일 데이터를 보면 K122630_close_lag 값이 NaN 입니다. 그 말은 과거라면 데이터가 있어야 하지만 없다는 말입니다. shift가 뒤쪽으로 밀기 때문에 shift 값이 -1이 되어야 합니다. 또는 날짜의 sort를 바꿔야 합니다.
shift 값을 -1을 넣었습니다.
import pandas as pd df = pd.read_csv('lagdata.csv', header=0, delimiter=',', encoding='utf8') print(df) df['K122630_close_lag'] = df['K122630_close'].shift(-1) print(df)
shift 값을 -1의 결과 입니다.
date K122630_close K122630_open K122630_high K122630_low K122630_close_lag 0 2018-12-28 11445.0 11375.0 11530.0 11370.0 11340.0 1 2018-12-27 11340.0 11405.0 11430.0 11280.0 11030.0 2 2018-12-26 11030.0 11065.0 11200.0 10915.0 11360.0 3 2018-12-24 11360.0 11310.0 11370.0 11225.0 11370.0 4 2018-12-21 11370.0 11330.0 11405.0 11275.0 11375.0 5 2018-12-20 11375.0 11485.0 11525.0 11260.0 11625.0 6 2018-12-19 11625.0 11510.0 11640.0 11470.0 11465.0 7 2018-12-18 11465.0 11365.0 11585.0 11365.0 11555.0 8 2018-12-17 11555.0 11480.0 11625.0 11480.0 NaN
더 많은 lag들
이전 데이터가 하나만 필요한것은 아닙니다. 많은 lag가 더 높은 성능을 발휘 할때가 있습니다.lag1, lag2를 추가하였습니다.
import pandas as pd df = pd.read_csv('lagdata.csv', header=0, delimiter=',', encoding='utf8') df['K122630_close_lag1'] = df['K122630_close'].shift(-1) df['K122630_close_lag2'] = df['K122630_close'].shift(-2) print(df)
결과는 아래와 같습니다.
date K122630_close K122630_open ... K122630_low K122630_close_lag1 K122630_close_lag2 0 2018-12-28 11445.0 11375.0 ... 11370.0 11340.0 11030.0 1 2018-12-27 11340.0 11405.0 ... 11280.0 11030.0 11360.0 2 2018-12-26 11030.0 11065.0 ... 10915.0 11360.0 11370.0 3 2018-12-24 11360.0 11310.0 ... 11225.0 11370.0 11375.0 4 2018-12-21 11370.0 11330.0 ... 11275.0 11375.0 11625.0 5 2018-12-20 11375.0 11485.0 ... 11260.0 11625.0 11465.0 6 2018-12-19 11625.0 11510.0 ... 11470.0 11465.0 11555.0 7 2018-12-18 11465.0 11365.0 ... 11365.0 11555.0 NaN 8 2018-12-17 11555.0 11480.0 ... 11480.0 NaN NaN
댓글 없음:
댓글 쓰기