파이썬 pandas diff shift pct_change 가이드 누적과 차분 연산 그리고 tshift(폐지)
🧮 시계열과 표 데이터의 변화량과 변화율을 정확히 계산하는 법을 핵심 함수와 예제로 정리합니다
데이터를 보면서 “그래서 얼마나 변했지”라는 질문이 떠오를 때가 많습니다.
단순한 평균이나 합계를 넘어, 바로 전에 비해 얼마나 늘었는지 줄었는지, 하루 전과 비교해 비율은 어떻게 달라졌는지 같은 감각이 필요하죠.
pandas의 diff, shift, pct_change는 그 질문에 정면으로 답하는 도구입니다.
그리고 한때 쓰였던 tshift는 폐지되어 지금은 다른 방식으로 대체됩니다.
헷갈리기 쉬운 파라미터와 엣지 케이스를 정리해두면, 재무 데이터든 로그 데이터든 시계열 분석의 바닥 체력이 단단해집니다.
이 글은 누적과 차분이라는 수학적 관점에서 pandas 연산을 바라보고, 각 함수가 내부적으로 무엇을 하는지부터 실무에서 바로 붙여 넣을 수 있는 코드까지 연결합니다.
연속된 관측치의 차이와 퍼센트 변화를 계산하는 기본기, 기준 축과 그룹별 연산처럼 실전에서 바로 부딪히는 설정, 결측과 정렬로 흔들리는 결과를 단단히 고정하는 요령을 담았습니다.
함수 간의 관계를 한눈에 정리하고, 바뀐 버전에서의 주의점까지 챙겨서 시행착오를 줄이는 데 초점을 맞춥니다.
📋 목차
🔗 파이썬 pandas 누적과 차분의 개념 정리
데이터 분석에서 누적과 차분은 흐름을 읽는 두 개의 축입니다.
누적은 일정 기준에서 더해가며 전체 규모를 파악하는 방식이고, 차분은 바로 이전 상태와의 차이를 통해 변화 자체를 추적합니다.
pandas에서는 누적 자체를 위한 전용 함수(cumsum 등)도 있지만, 변화량과 변화율을 다룰 때 핵심은 diff, shift, pct_change의 상호작용입니다.
이 세 가지는 표와 시계열 모두에서 쓰이며, axis와 periods, 결측 처리 방식에 따라 결과가 달라지므로 개념을 정확히 잡아두면 예측 변수 만들기, 로그 분석, 재무지표 계산까지 안정적으로 확장할 수 있습니다.
핵심 개념을 요약하면, shift는 데이터를 일정 칸 밀어 참조 기준(래그·리드)을 만드는 도구이고, diff는 현재값과 과거값의 뺄셈을 자동으로 수행하는 차분 연산자이며, pct_change는 차분을 현재 또는 과거 기준으로 나누어 분수 변화율을 반환합니다.
여기서 반환값은 기본적으로 비율(예: 0.05 = 5%)이며, 퍼센트 표시가 필요하면 100을 곱해 표기합니다.
또한 과거에 쓰였던 tshift는 시계열 인덱스를 주파수 단위로 이동시키는 메서드였으나 폐지되어 현재는 shift의 freq 옵션으로 대체하는 흐름이 표준입니다.
import pandas as pd
s = pd.Series([100, 105, 102, 108], index=pd.to_datetime(["2025-01-01","2025-01-02","2025-01-03","2025-01-04"]))
# 1) shift: 기준값(래그) 만들기
lag1 = s.shift(1) # 하루 전 값
lead1 = s.shift(-1) # 하루 후 값
# 2) diff: 변화량(차분)
d1 = s.diff() # s - s.shift(1) 과 동일
d2 = s.diff(2) # s - s.shift(2)
# 3) pct_change: 분수 변화율
r1 = s.pct_change() # (s - s.shift(1)) / s.shift(1)
r2 = s.pct_change(2) # (s - s.shift(2)) / s.shift(2)
# 4) 시계열 인덱스 이동(과거 tshift 대체)
shifted_idx = s.shift(1, freq="D") # 데이터는 그대로, 인덱스만 하루 이동
| 연산 | 의미 |
|---|---|
| shift(periods, axis, freq) | 값을 밀어 기준열(래그·리드) 생성. freq 지정 시 인덱스만 이동. |
| diff(periods, axis) | 현재값 − 과거값의 차분. 음수 periods로 미래와 비교도 가능. |
| pct_change(periods, fill_method, limit, freq) | 분수 변화율 반환(예: 0.05 = 5%). 표시는 ×100으로 퍼센트 변환. |
💡 TIP: 정렬과 결측은 결과를 뒤틀기 쉽습니다.
시계열은 인덱스 오름차순으로 정렬하고, 누락 구간이 있다면 pct_change의 fill_method·limit 또는 사전 보간(interpolate) 전략을 명시해 예측 불가능한 NaN 전파를 통제하세요.
그룹 단위 비교는 groupby 후 각 연산을 적용하면 됩니다.
⚠️ 주의: 과거의 tshift는 현재 버전에서 폐지되었습니다.
시계열 인덱스만 이동하려면 shift(freq=”…”)를 사용하세요.
변화율 해석 시 0과 음수 분모(이전 값)가 포함되면 무한대 또는 정의 불능이 발생할 수 있으니 분모 검사를 선행하세요.
🛠️ diff와 shift의 수학적 정의와 차이
pandas의 diff()와 shift()는 언뜻 비슷해 보이지만, 실제로는 목적이 완전히 다릅니다.
두 함수의 핵심 차이는 ‘계산을 수행하느냐’와 ‘값을 단순히 이동시키느냐’에 있습니다.
즉, shift()는 데이터 자체를 밀어 새로운 비교 기준을 만드는 반면, diff()는 바로 그 기준과의 차이(Δ)를 계산하는 연산자입니다.
이 둘을 정확히 구분해야 후속 변화율 계산이나 누적 변동성 분석에서 오차가 생기지 않습니다.
📘 diff()의 원리
diff 함수는 기본적으로 현재 값 – 이전 값을 수행합니다.
즉, s.diff()는 내부적으로 s - s.shift(1)과 동일합니다.
이때 periods 매개변수는 비교할 이전 시점의 거리(간격)를 의미합니다.
예를 들어 periods=2이면, 이틀 전의 값을 기준으로 차이를 계산합니다.
import pandas as pd
data = pd.Series([10, 12, 15, 18, 20])
data.diff() # [NaN, 2, 3, 3, 2]
data.diff(2) # [NaN, NaN, 5, 6, 5]
차분의 첫 행은 비교 대상이 없으므로 항상 NaN으로 표시됩니다.
또한 axis를 지정하면 행(row) 또는 열(column) 단위로도 차분 계산이 가능합니다.
이 점은 시계열뿐 아니라, 매출표나 센서데이터 등 2차원 데이터에서도 동일하게 유용합니다.
⚙️ shift()의 동작 구조
shift는 ‘밀기’에 특화된 함수입니다.
단순히 데이터를 일정 기간 앞이나 뒤로 이동시키며, 원래 값은 그대로 유지됩니다.
즉, 계산은 하지 않고 index alignment를 위한 도구 역할을 합니다.
이를 통해 현재 값과 과거 값을 같은 행에 배치해 비교 분석할 수 있습니다.
import pandas as pd
data = pd.Series([100, 105, 110, 108])
data.shift(1)
# [NaN, 100, 105, 110]
data.shift(-1)
# [105, 110, 108, NaN]
shift 함수는 시계열 데이터를 시간 단위로 이동시키는 freq 옵션도 지원합니다.
예를 들어 shift(freq='D')는 데이터는 그대로 두고 인덱스만 하루 뒤로 이동합니다.
이는 과거 tshift()가 담당하던 역할을 대신하며, pandas 1.0 이후 공식적으로 권장되는 방식입니다.
💎 핵심 포인트:
shift는 데이터를 “밀기” 위한 함수, diff는 “차이”를 계산하는 함수입니다.
이 둘을 조합하면 어떤 시점의 변화량도 유연하게 계산할 수 있습니다.
📈 pct_change로 변화율 계산하기
pct_change()는 pandas에서 시계열의 변동성을 가장 빠르게 계산할 수 있는 함수입니다.
이 함수는 이전 값 대비 증가 또는 감소 비율을 구해줍니다.
기본 식은 다음과 같습니다.
💬 pct_change(periods) = (현재값 – 과거값) / 과거값
결과는 분수 형태로 반환되며, 0.10은 10% 증가를 의미합니다.
따라서 시각화나 보고서용으로는 *100을 곱해 퍼센트 단위로 변환해 표시합니다.
periods 매개변수는 변화율을 계산할 기준 간격을 지정하며, 기본값은 1입니다.
예를 들어 periods=7로 설정하면 전주 대비 변화율을 계산합니다.
import pandas as pd
prices = pd.Series([100, 110, 105, 120])
# 하루 단위 변화율
daily_return = prices.pct_change()
print(daily_return)
# 2일 전 대비 변화율
two_day_return = prices.pct_change(periods=2)
print(two_day_return)
# 퍼센트 단위로 보기 좋게 변환
daily_return * 100
금융 데이터에서는 일별 주가, 환율, 판매량 등에서 일간·주간·월간 수익률을 계산할 때 사용합니다.
또한 fill_method와 limit을 지정하면 결측값(NaN)을 전방·후방 채움 방식으로 처리해 연속성 있는 결과를 얻을 수 있습니다.
이는 센서 데이터나 로그 데이터처럼 간헐적인 결측이 존재하는 경우 특히 유용합니다.
- 📊기본 변화율은 (현재 – 과거) / 과거 형태로 계산됩니다.
- 🧾periods 값으로 비교 간격을 지정할 수 있습니다.
- ⚙️fill_method로 결측 구간을 보완해 불연속 문제를 해결하세요.
- 💡비율 해석 시, 0.1 = 10% 상승, -0.1 = 10% 하락입니다.
💡 TIP: pct_change는 그룹화 후에도 적용이 가능합니다.
예를 들어 기업별 주가나 매장별 매출을 비교할 때는 df.groupby('기업명')['매출'].pct_change()처럼 작성하면 각 그룹 내에서 독립적으로 변화율을 계산합니다.
⚠️ 주의: 이전 값이 0인 경우 분모가 0이 되어 무한대(Inf)나 NaN이 반환될 수 있습니다.
이때는 replace(0, np.nan)으로 처리하거나 조건문으로 예외를 제거해야 합니다.
⏱️ 시계열에서 tshift는 왜 폐지되었나
pandas를 오래 사용한 사용자라면 tshift()를 기억할 것입니다.
이 함수는 과거 버전에서 시계열 인덱스를 주파수 단위로 이동시켜 날짜만 이동하고 데이터는 그대로 유지할 수 있도록 설계되었습니다.
예를 들어 월간 매출 데이터에서 ‘다음 달 기준의 동일 날짜’로 인덱스를 옮기는 데 자주 쓰였죠.
하지만 현재 버전에서는 완전히 폐지되어, 이제는 shift() 함수가 그 역할을 대신합니다.
폐지된 이유는 기능 중복과 유지보수 복잡성 때문입니다.
tshift()와 shift()는 모두 데이터를 “이동”시킨다는 점에서 기능이 유사했지만, 하나는 값 이동, 다른 하나는 인덱스 이동을 담당해 혼란을 일으켰습니다.
결국 pandas 개발진은 두 기능을 shift(freq=…) 하나로 통합하여 더 명확하고 일관된 API로 개편했습니다.
import pandas as pd
idx = pd.date_range("2025-01-01", periods=4, freq="D")
s = pd.Series([10, 20, 30, 40], index=idx)
# 과거 tshift 방식 (폐지됨)
# s.tshift(1)
# 현재 권장 방식
s_shifted = s.shift(1, freq="D")
print(s_shifted)
위 예시에서 freq="D"를 지정하면 값은 그대로 두고 인덱스만 하루 뒤로 이동합니다.
즉, 과거의 tshift(1)와 동일한 결과를 얻게 됩니다.
반면, freq를 생략하면 shift(periods)가 작동하여 값이 이동하고 인덱스는 고정됩니다.
이 차이를 이해하면 시계열 데이터 정렬과 비교가 훨씬 명확해집니다.
- 🕒tshift()는 pandas 1.0 이후 완전히 제거되었습니다.
- 📦shift(freq=…)로 동일한 효과를 구현할 수 있습니다.
- ⚙️freq는 주기 단위로 인덱스를 이동시키며 값은 그대로 유지합니다.
- 💡값 이동과 인덱스 이동은 서로 다르며, 필요한 목적에 맞게 선택해야 합니다.
💎 핵심 포인트:
tshift는 더 이상 존재하지 않으며, shift(freq=’D’)와 같이 주기를 지정하면 동일한 결과를 얻을 수 있습니다.
데이터 분석 시 혼동을 피하려면 항상 최신 pandas 버전의 함수를 기준으로 작성하세요.
💡 실무 예제와 주의할 옵션 파라미터
pandas의 diff(), shift(), pct_change()는 단순한 데이터 이동·계산 도구를 넘어, 시계열 분석·통계 모델링·재무 데이터 처리 등 다양한 현장에서 실무 표준으로 쓰입니다.
하지만 데이터 정렬, 결측값 처리, 축 지정 등 옵션 하나만 잘못 설정해도 결과가 왜곡될 수 있으므로 주의가 필요합니다.
📊 실제 예제: 월별 매출 증감률 계산
다음은 매장별 월 매출 데이터에서 전월 대비 증감률을 계산하는 예시입니다.
여기서는 그룹별 연산을 위해 groupby와 pct_change()를 함께 사용합니다.
import pandas as pd
data = {
'지점': ['A', 'A', 'A', 'B', 'B', 'B'],
'월': ['1월', '2월', '3월', '1월', '2월', '3월'],
'매출': [1000, 1200, 1100, 800, 850, 950]
}
df = pd.DataFrame(data)
# 지점별 전월 대비 변화율 계산
df['전월대비증감률'] = df.groupby('지점')['매출'].pct_change() * 100
print(df)
이 코드는 각 지점 그룹 내부에서 순서를 유지하며 전월 대비 증감률을 자동 계산합니다.
결과는 1월 행에서는 NaN(이전 달 없음), 2월에는 20%, 3월에는 -8.33%로 표시됩니다.
이처럼 groupby와 pct_change 조합은 실제 실무에서 매출, 사용자 수, 페이지뷰 등 변동률 분석에 자주 활용됩니다.
⚙️ 주요 옵션 파라미터 정리
| 파라미터 | 설명 |
|---|---|
| periods | 비교할 과거 시점의 간격(정수). 1이면 바로 이전 시점과 비교. |
| axis | 행(0) 또는 열(1) 단위로 계산할 축. |
| freq | 시계열 인덱스를 날짜 단위로 이동할 때 사용. 예: “D”, “M”, “Q”. |
| fill_method | 결측값 처리 방법. 전방 채움(“pad”) 또는 후방 채움(“bfill”) 지정 가능. |
💡 TIP: 대규모 데이터셋에서는 astype(float) 변환 후 연산하면 성능과 정확도를 동시에 확보할 수 있습니다.
숫자형이 아닌 문자열이나 범주형 데이터가 섞여 있으면 NaN이 발생하므로, 연산 전 pd.to_numeric()으로 변환하는 것이 안전합니다.
⚠️ 주의: 데이터의 순서가 섞여 있으면 diff·pct_change 모두 잘못된 결과를 낼 수 있습니다.
시계열 데이터는 반드시 sort_index() 또는 sort_values()로 정렬 후 계산하세요.
❓ 자주 묻는 질문 (FAQ)
diff와 shift 중 무엇을 먼저 사용해야 하나요?
하지만 직접 shift 결과를 변수로 저장해 두면, 동일 기준의 여러 차이 계산에 재활용하기 좋습니다.
tshift가 없어졌는데 기존 코드를 어떻게 바꿔야 하나요?
예를 들어 하루 이동은
s.shift(freq='D'), 한 달 이동은 s.shift(freq='M')처럼 지정하세요.
pct_change 결과가 NaN이나 Inf로 나오는 이유는?
Inf는 이전 값이 0인 경우 발생하므로,
df.replace(0, np.nan)으로 처리하거나 조건문으로 제외하면 됩니다.
groupby 후 diff나 pct_change를 쓰면 자동으로 그룹별 계산되나요?
예를 들어
df.groupby('지점')['매출'].diff() 또는 pct_change()를 사용하면 각 그룹 내부에서 독립적으로 계산됩니다.그룹별 시계열 분석에서 매우 자주 쓰이는 패턴입니다.
diff와 pct_change를 같은 시리즈에 함께 써도 되나요?
diff()는 절대 변화량, pct_change()는 상대 변화율을 보여주므로 서로 보완적인 지표로 함께 활용할 수 있습니다.
시계열 데이터가 아닌 일반 테이블에서도 사용 가능한가요?
행 순서가 의미 있는 데이터라면 index가 날짜가 아니어도 문제 없습니다.
단, 올바른 순서를 보장하려면 sort_index()나 sort_values()로 정렬하는 것이 좋습니다.
diff(periods=-1)처럼 음수를 주면 어떤 효과가 있나요?
예를 들어
diff(-1)은 현재값 – 다음값으로 계산되어 미래 대비 감소폭을 볼 때 유용합니다.
결측값이 많은 시계열에서 안전하게 변화율을 계산하려면?
다만, 인위적 데이터 보정이므로 보고서에서는 이를 명시해야 합니다.
🧩 pandas 변화량 분석으로 시계열 데이터의 흐름을 읽는 법
pandas의 diff(), shift(), pct_change()는 단순한 함수가 아니라 데이터 변화의 패턴을 해석하는 기본 언어입니다.
값의 증감, 변화율, 이동 기준을 정확히 계산하면 예측 모델이나 리포트의 신뢰도를 크게 높일 수 있습니다.
특히 폐지된 tshift() 대신 shift(freq=…)를 올바르게 이해하면, 최신 버전 pandas에서도 안정적으로 시계열 이동을 제어할 수 있습니다.
실무에서는 diff로 절대 변화를 계산해 변동폭을 확인하고, pct_change로 변화율을 분석해 추세를 시각화하며, shift로 과거 데이터를 참조해 전후 비교나 예측 피처를 만드는 식으로 조합하는 것이 일반적입니다.
이 글에서 정리한 함수의 개념과 옵션을 익혀두면, 금융 데이터, 센서 로그, 웹 트래픽 등 어떤 시계열에도 안정적으로 적용할 수 있을 것입니다.
🏷️ 관련 태그 : pandas, diff, shift, pct_change, tshift, 시계열분석, 데이터프레임, 파이썬기초, 변화율계산, 데이터분석