Pandas에서 제공하는 기능 중 shift라는 기능이 있다.
우리가 알고 있는 의미 그대로 '이동시키다'라고 해석하면 어떤 기능인지 잘 와닿을 것 같다!
말 그대로 현재 데이터를 n칸 씩 앞으로 또는 뒤로 손쉽게 밀 수 있다.
공식 문서에 있는 예제를 살펴보자.
아래와 같은 예시의 데이터 프레임이 있을 때
>>> df = pd.DataFrame({"Col1": [10, 20, 15, 30, 45],
... "Col2": [13, 23, 18, 33, 48],
... "Col3": [17, 27, 22, 37, 52]},
... index=pd.date_range("2020-01-01", "2020-01-05"))
>>> df
Col1 Col2 Col3
2020-01-01 10 13 17
2020-01-02 20 23 27
2020-01-03 15 18 22
2020-01-04 30 33 37
2020-01-05 45 48 52
shift 3을 해주면 세 칸씩 데이터를 이동시킬 수 있다.
이동 시켰을 때 들어올 값이 없는 부분은 NaN으로 채워지게 된다.
음수 값을 주면 반대 방향으로 이동시키는 것도 가능하다.
>>> df.shift(periods=3)
Col1 Col2 Col3
2020-01-01 NaN NaN NaN
2020-01-02 NaN NaN NaN
2020-01-03 NaN NaN NaN
2020-01-04 10.0 13.0 17.0
2020-01-05 20.0 23.0 27.0
만약 NaN으로 채워지는 것이 맘에 들지 않는다면 fill_value라는 속성을 통해 어떤 값으로 채울지 설정해줄 수도 있다.
>>> df.shift(periods=3, fill_value=0)
Col1 Col2 Col3
2020-01-01 0 0 0
2020-01-02 0 0 0
2020-01-03 0 0 0
2020-01-04 10 13 17
2020-01-05 20 23 27
아래와 같이 축을 설정하여 row가 아니라 column 방향으로 데이터를 이동시키는 것 또한 가능하다.
>>> df.shift(periods=1, axis="columns")
Col1 Col2 Col3
2020-01-01 NaN 10 13
2020-01-02 NaN 20 23
2020-01-03 NaN 15 18
2020-01-04 NaN 30 33
2020-01-05 NaN 45 48
물론 전체 테이블이 아니라 특정 속성에 대해서만 shift하는 것도 가능하다!
또한 groupby를 해주면 특정 속성에 관련한 데이터들에 한해서만 shift도 가능하다!
이를 활용하면 좀 더 간다하면서도 쉽게 다양한 feature engineering이 가능할 것이다.
가령 과거의 데이터를 기반으로 현재 데이터를 예측하기 위한 feature를 생성하는 것이 대표적인 예시일 것 같다.
pandas.DataFrame.shift — pandas 1.4.2 documentation
The scalar value to use for newly introduced missing values. the default depends on the dtype of self. For numeric data, np.nan is used. For datetime, timedelta, or period data, etc. NaT is used. For extension dtypes, self.dtype.na_value is used. Changed i
pandas.pydata.org