2019년 2월 24일 일요일

시계열 데이터에서 Pandas를 이용한 lag data 생성


서론

머신러닝에서 입력되는 데이터는 간혹 시계열 데이터가 있습니다. 단순한 데이터의 예로는 주식값이 있습니다. 머신러닝에서는 이전 데이터를 현재 데이터에 넣으면 좀 더 정확한 학습이 가능한 경우가 있습니다. 이것을 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)
핵심은 아래와 같은 코드입니다. 새로운 K122630_close_lag 컬럼을 만들어 shift(1) 된 데이터를 넣어 주는것입니다.
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




댓글 없음:

댓글 쓰기