반응형

16-09 기간/데이터 쉬프트 (shift)

DataFrame.shift(periods=1, freq=None, axis=0, fill_value=NoDefault.no_default)

 

개요


shift메서드는 시계열 데이터의 데이터나 인덱스를 원하는 기간만큼 쉬프트 하는 메서드 입니다.
freq 인수를 입력하지 않으면 데이터가 이동하고, 인수값을 입력하게되면 인덱스가 freq값 만큼 이동하게됩니다.

 

사용법


기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df.shift(periods=1, freq=None, axis=0, fill_value=NoDefault.no_default)
periods : 이동할 기간입니다.
freq : 입력 할 경우 인덱스가 이동하게 됩니다. Y, M, D, H, T, S 나 Timestamp, 'Infer'등이 올 수 있습니다.
fill_value : shift로 인해 생긴 결측치를 대체할 값입니다.

반응형

 

예시


먼저 기본적인 사용법 예시를위하여 5x3 짜리 데이터를 만들어보겠습니다.
pd.date_range를 이용해 기준시간에 대해 일정 간격을 가진 datetime index를 생성하겠습니다.

idx = pd.date_range(start='2022-01-01',periods=5,freq='2D')
# 2일 간격으로 5행의 인덱스 생성
data={'col1':[10,20,30,40,50],'col2':[1,3,6,7,9],'col3':[43,13,82,47,31]}
df = pd.DataFrame(data=data, index=idx)
print(df)
>>
            col1  col2  col3
2022-01-01    10     1    43
2022-01-03    20     3    13
2022-01-05    30     6    82
2022-01-07    40     7    47
2022-01-09    50     9    31

 

기본적인 사용법
period인수를 입력할 경우 데이터가 행 기준으로 이동하게됩니다.

print(df.shift(periods=2))
>>
            col1  col2  col3
2022-01-01   NaN   NaN   NaN
2022-01-03   NaN   NaN   NaN
2022-01-05  10.0   1.0  43.0
2022-01-07  20.0   3.0  13.0
2022-01-09  30.0   6.0  82.0


axis인수를 설정해줄 경우, 데이터의 이동을 행 기준으로할지 열 기준으로할지 설정할 수 있습니다.

print(df.shift(periods=2, axis=1))
>>
            col1  col2  col3
2022-01-01   NaN   NaN    10
2022-01-03   NaN   NaN    20
2022-01-05   NaN   NaN    30
2022-01-07   NaN   NaN    40
2022-01-09   NaN   NaN    50


fill_value 인수를 사용하면, shift되면서 NaN처리된 결측치를 원하는 값으로 채울 수 있습니다.

print(df.shift(periods=2, axis=1,fill_value='-'))
>>
           col1 col2 col3
2022-01-01    -    -   10
2022-01-03    -    -   20
2022-01-05    -    -   30
2022-01-07    -    -   40
2022-01-09    -    -   50


freq 인수의 사용
freq 인수를 설정해주면, 데이터가 아닌 인덱스가 freq에 입력한 값 만큼 쉬프트 됩니다.

print(df.shift(periods=3,freq='D'))
# 일 기준 3기간 이동. 즉, 3일 이동
>>
            col1  col2  col3
2022-01-04    10     1    43
2022-01-06    20     3    13
2022-01-08    30     6    82
2022-01-10    40     7    47
2022-01-12    50     9    31

freq='infer'인 경우, 현재 인덱스의 간격을 분석해서 적당한 freq를 추론해줍니다.

print(df.shift(periods=3,freq='infer'))
>>
            col1  col2  col3
2022-01-07    10     1    43
2022-01-09    20     3    13
2022-01-11    30     6    82
2022-01-13    40     7    47
2022-01-15    50     9    31

위의 예시의 경우, 인덱스의 인터벌(간격)이 2일이므로 freq='2D'로 추론하였으며, period=3이기 때문에 6일이 쉬프트 된것을 알 수 있습니다.

반응형

+ 최근 글