[Pandas]DataFrame 시간간격 재조정(Resampling)

반응형
    반응형

    시간 데이터를 DataFrame으로 처리할 때 날짜 단위를 바꿔가면서 분석하고 싶을 때가 있습니다.

    다행이도 판다스를 이용하면 주기를 연(Yearly), 월(Monthly), 주(Weekly), 일(Daily) 단위로 축약해서 할 수가 있습니다.

    바로 resample() 함수를 사용해서 시간 간격을 재조정합니다.

    resample() 함수를 사용해 데이터를 가공하는 과정을 리샘플링(Resampling)이라 하는데요.

    크게 두가지 부류로 나뉩니다.

    • 업 샘플링 : 분 단위, 초 단위로 샘플양을 증가시키는 리샘플링
    • 다운 샘플링 : 몇 일, 몇 달 단위로 샘플양을 감소시키는 리샘플링

    샘플양을 증가시키는 방향으로 가면 업 샘플링이고 감소시키면 다운 샘플링입니다.

    보통 일 단위 자료를 많이 쓰기 때문에 분 단위로 간다면 샘플 양이 많아지게 되서 일반적인 경우로 적어보았습니다.

    업 샘플링은 샘플을 늘리는 작업을 해야하므로 보간법으로 빈 곳을 채워나갑니다. 

    데이터의 특징을 잘 안다면 업 샘플링을 해도 되지만 가상의 데이터를 만드는 것이라 많이 쓰이지는 않습니다.

     

    반대로, 다운 샘플링은 샘플을 줄이는 작업이므로 

    기존 데이터를 집계하는 방법으로 데이터를 줄여나갑니다. 

    모두 다 더하는 방식으로 해야하는 건 아니고 그냥 표시만 하게 할 수도 있습니다. 

     

    제가 가지고 있는 데이터 파일로 예를 보여드리겠습니다.

    df

    PBR과 종가 데이터를 불렀습니다. 지금 데이터는 일자별로 PBR과 종가를 표시하고 있습니다. 

    이 데이터로 리샘플링을 해보겠습니다. 시행 전에 알아두어야 할 것은 리샘플링은 인덱스가 시간데이터일 때만 가능합니다. 그렇지 않으면 오류가 발생합니다.

     

    업 샘플링

    업 샘플링으로 시(Hour) 리샘플링을 보여드리겠습니다.

    df_resample = df.resample(rule='H').last()
    df_resample

    이렇게 NaN으로 나옵니다. 이걸 보간법을 이용해 채워넣습니다.

    df_resample.interpolate()

    이런식으로 채워서 데이터 증식을 시키는 방법이 있습니다.

    정확한 데이터가 아니고 만들어진 가상의 데이터기 때문에 추천하지는 않습니다.

     

    다운 샘플링

    이번엔 데이터를 연(Yearly)로 리샘플링하겠습니다.

    리샘플링하는 방법을 다 설명할 수는 없고 합계와 데이터 확인 정도로 하겠습니다.

     

    합계를 살펴보겠습니다.

    df_resample = df.resample(rule='Y').sum()
    df_resample

    PBR과 종가를 더할일은 없겠지만 한번 더해봤습니다.

    간단하게 코드한줄로 마무리가 됩니다.

     

     

    시간을 변경한다고 모두 더해야하는건 아닙니다.

    연초나 연말의 시간데이터를 알고 싶을경우가 있습니다. 이럴경우 last(),first()를 사용합니다.

    first()는 값을 가져올 때 주기의 첫번째 값을 가져옵니다.

    last()는 값을 가져올 때 주기의 마지막 값을 가져옵니다.

     

    연초를 알고 싶다면 start를 의미하는 S를 붙여서 요청합니다. 저는 연초를 알고 싶으니 'rule='YS'로 요청하겠습니다.

    주기의 처음값을 가져와야 하므로 first()로 합니다.

    df_resample = df.resample(rule='YS').first()
    df_resample

    주의할것은 지금 제가 쓰고 있는 데이터는 주식 데이터입니다. 주식시장은 1월1일에 시장을 열지 않기 때문에 1월 1일 데이터는 사실상 없습니다.

    resample() 함수가 주기 기반으로 작업을 하다보니 리샘플링을 하면

    주기의 처음값인 2015-01-02 데이터를 가져와 2015-01-01 날짜의 데이터로 넣게 됩니다.

     

    연말을 보고 싶다면 'rule=Y'를 씁니다. 연말이면 주기의 마지막 값을 가져와야 하니 last()로 불러옵니다.

    df_resample = df.resample(rule='Y').last()
    df_resample

    마찬가지 이유로 12/31에는 사실 시장이 열지 않지만 연말을 뜻하는 의미로 날짜가 12/31로 고정되게 됩니다.

    이런식으로 resample() 이용해 할 수 있습니다.

    마지막으로 주기 단위를 정리하고 포스팅을 마치겠습니다.

     

    시간 단위 Rule
    초(Second) S
    분(Minute) M
    시(Hour) H
    주(Weekly) W
    월(Monthly) M
    분기(Quarterly) Q
    연(Yearly) A , M
    영업일 (Business) B (주말만 제외되고 공휴일은 제외되지 않음)

     

    댓글

    Designed by JB FACTORY

    ....