파이썬(Python)/pandas

[Python] Pandas 이동평균 함수 사용법 (Rolling)

끄적끄적아무거나 2021. 11. 10. 08:42
반응형

 

목차

     

     

     

    [Python] Pandas 이동평균 함수 사용법 (Rolling) 

     

    파이썬의 판다스에서 제공하는 함수 중에 Rolling이라는 함수가 있습니다. 테이블에 많은 데이터가 있고 전체에 대한 평균이나 최소 최대값을 알고 싶은 것이아니라 Window 창이 이동하듯이 X축의 창을 이동하면서 Y값의 평균 최소 최대 값을 구해야 하는 경우들이 있습니다.

     

    일반적인 코딩은 for문을 여러번 사용하여 복잡하게 계산하지만 Pandas rolling을 사용하게 되면 간단하게 이동하는 윈도우의 수치결과를 얻을 수 있습니다. 

     

    참고로 앞서 포스트에서 rolling 함수를 사용해서 30일간 이동 평균 Window를 이동시키면서 코스피 고점 대비 하락률을 계산하고 그리는 예제를 하였습니다. 해당 내용이 궁금하시면 아래 링크 참조 하시길 바랍니다. 

     

    https://scribblinganything.tistory.com/382

     

    [Python] yfinance로 고점대비 하락율 그래프 그리기 (코스피, 코스닥, MDD)

    목차 [Python] yfinance로 고점 대비 하락율 그래프 그리기 : 배경 지식 yfinance 는 야후파이낸스(Yahoo finance)에 나와 있는 데이터를 파이썬으로 쉽게 이용할 수 있게 만들어진 라이브러리 입니다. 이번

    scribblinganything.tistory.com

     

     

     

     

     

    [Python] Pandas Rolling Syntax

     

    Rolling 함수의 Syntax는 아래와 같습니다. 

     

    DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None, method='single')

     

    Dataframe의 값을 수정하는데 Dataframe에 대한 내용을 확인하고 싶으시면 아래 링크 참조 하시길 바랍니다. 

    https://scribblinganything.tistory.com/371

     

    [Python] Pandas DataFrames이란? 선언, 데이터 찾기, 정렬하기 예제

    목차 [Python] Pandas DataFrames이란? 파이썬의 판다스는 데이터 처리에 용이한 라이브러리 입니다. 앞서 설명한 Pandas Series와 마찬가지로 DataFrames은 데이터를 엑셀과 비슷한 방식으로 관리하기 위해

    scribblinganything.tistory.com

     

     

    Syntax에서 중요한 입력 값은 아래와 같습니다.

     

    • window
    • min_periods
    • win_type

     

    window는 앞서 언급한 윈도우의 크기입니다. 앞서 주식에서 30일에 대한 평균을 이동하면서 구할때 윈도우 사이즈는 30이 되는 것입니다. 

     

    min_period는 윈도우 사이즈보다 데이터가 작을 때 NaN(Not a Number)으로 표기할 것인지 최소한의 개수만 있으면 데이터를 처리할지를 선정해 줍니다. 

     

    win_type은 윈도우에 weighting을 주는 형태입니다. 가령 Gaussian(가우시안) 형태로 무게를 다르게 주고 싶으면 Window 내에서 값들이 Gaussian으로 weighting을 받고 수식이 결정 됩니다. 

     

     

    Rolling의 결과는 아래와 같은 수식을 계산할 수 있습니다.

     

    • mean(평균)
    • max(최대값)
    • sum(총합)
    • min(최소값)
    • median(중간값)
    • std(표준편차)

     

    아래 예제를 통해 쉽게 이해해보도록 하겠습니다. 

    반응형

     

     

     

     

    [Python] Pandas 이동평균 함수 사용법 (Rolling) : 예제(window)

     

     

    코드>>

    import pandas as pd
    
    dic_var = {'A': [0, 1, 2, 3, 4, 5], 'B': [6, 7, 8, 9, 10, 11]}
    data = pd.DataFrame(dic_var)
    
    result = data.rolling(3)
    print(data)
    print(result.min())
    print(result.sum())

     

    결과>>

       A   B
    0  0   6
    1  1   7
    2  2   8
    3  3   9
    4  4  10
    5  5  11
         A    B
    0  NaN  NaN
    1  NaN  NaN
    2  0.0  6.0
    3  1.0  7.0
    4  2.0  8.0
    5  3.0  9.0
          A     B
    0   NaN   NaN
    1   NaN   NaN
    2   3.0  21.0
    3   6.0  24.0
    4   9.0  27.0
    5  12.0  30.0

     

    코드 주석>>

     

    라인 3: 분석할 테이블값을 입력합니다.

    라인 4: Dataframe 모듈을 사용해서 테이블화 합니다.

    라인 6: 입력값으로 window= 3 만을 넣었습니다.

     

    결과 주석>>

    첫번째 테이블 결과는 원 데이터입니다.

    두번째 테이블 결과는 윈도우 3개를 사용해서 최소값을 구한 것인데 앞에 2개는 윈도우3개를 만족하지 못하여서 NaN(Not a Numer)가 나왔습니다. 2번 Index 부터 총 3개의 데이터를 받아서 최소값을 구할 수 있습니다. 

     

     

     

    [Python] Pandas 이동평균 함수 사용법 (Rolling) : 예제(min_periods, win_type)

     

    다음 예제는 min_periods와 win_type을 사용한 예제를 살표 보겠습니다.

     

    코드>>

    import pandas as pd
    
    dic_var = {'A': [0, 1, 2, 3, 4, 5], 'B': [6, 7, 8, 9, 10, 11]}
    data = pd.DataFrame(dic_var)
    
    result = data.rolling(3,min_periods=1, win_type='gaussian').sum(std=1)
    print(result)

     

    결과>>

              A          B
    0  0.000000   3.639184
    1  0.606531  10.245715
    2  2.213061  15.491429
    3  4.426123  17.704491
    4  6.639184  19.917552
    5  8.852245  22.130613

     

    코드 주석>>

     

    6번째 라인 : 가우시안 형태의 윈도우를 3개의 윈도우창 결과에 씌움니다. 윈도우창에1개의 데이터만 있어도 진행합니다. 그리고 가우시안의 표준편차는 1로 정했습니다.

     

    결과 주석>>

    이번에는 min_periods를 1로 설정했기 때문에 데이터가 모자라도 분석이 진행되었습니다. 그리고 win_type이 가우시안이므로 가운데가 볼록한 구조이므로 가운데 값의 비중을 높여서 계산된 것입니다. 

     

    이외에 다른 window는 scipy에서 정의한 형태는 사용이 가능합니다. 아래를 참조하셔서 윈도우를 선정하시면 됩니다. 

     

    https://docs.scipy.org/doc/scipy/reference/signal.windows.html#module-scipy.signal.windows

     

     

     

     

     

    반응형