본문 바로가기

판다스(Pandas)

[Pandas] 코스피 최다 연속 상승일수 구하기

코스피 최다 연속 상승일수는 13거래일입니다. 이번에는 이를 파이썬 판다스를 사용해서 구해봅시다. 판다스의 Series에는 연속적인 값의 개수를 세어주는 메서드는 따로 존재하지 않습니다. 따라서 한 번에 코스피 최다 연속 상승일수를 구할 수 없고 여러 단계를 통해 이를 계산할 수 있습니다. 

 

이를 위해 가장 먼저 배워볼 기능은 groupby.cumcount 입니다. (https://pandas.pydata.org/docs/reference/api/pandas.core.groupby.GroupBy.cumcount.html)

 

pandas.core.groupby.GroupBy.cumcount — pandas 1.5.0 documentation

next pandas.core.groupby.GroupBy.cummax

pandas.pydata.org

 

import pandas as pd

s = pd.Series(['a', 'a', 'a', 'b', 'b', 'a'])
s.groupby(s.values).cumcount()

위 코드의 실행 결과는 같은 데이터('a' 또는 'b')에 대해서 누적 카운트를 계산합니다. 

import FinanceDataReader as fdr

df = fdr.DataReader('KS11', "2001")
df['up'] = df['Change'] > 0
df['grp'] = (df['up'] != df['up'].shift()).cumsum()
df['up_cnt'] = df['grp'].groupby(df['grp'].values).cumcount() + 1
df['up_cnt'].max()

 

처음 위 코드를 한 번에 이해하기는 어렵습니다. 각 라인별로 나눠서 이해해봅시다. 일단 'Change' 값이 0보다 크면 1 아니면 0으로 표시합니다. 1은 상승, 0은 하락을 의미합니다. 

 

상승에서 하락으로 또는 하락에서 상승으로 변경되는 거래일을 구하기 위해서 df['up']과 df['up'].shift()를 비교합니다. 이 연산의 결과는 상승과 하락이 변경되는 지점에서 True 값이 표시됩니다. (이전 거래일과 상태가 달라지는 거래일이 표시)

 

위 그림의 시리즈에 대해서 cumsum을 사용하면 각 그룹에 숫자를 부여하게 됩니다. 여기서 그룹이란 연속 상승 또는 하락하는 거래일들의 묶음입니다. 예를들어, 2001-01-02~2001-01-09일은 연속으로 상승했고 이는 하나의 그룹으로 간주됩니다. 2001-01-10일 역시 하나의 그룹입니다. 

 

마지막으로 각 그룹의 누적개수를 groupby.cumcount를 통해 계산합니다.