pandas의 시계열 데이터 처리로 누적 합을 일정 기간마다 산출하는 방법

pandas에서 시계열 데이터 등의 분석을 할 때, 매일이나 분마다 등으로 누적 합을 산출하고 싶은 경우가 있다고 생각합니다.

예를 들어, 다음과 같은 1개월분의 틱 데이터를 1T로 resampling한 ohlcv로 변환하고 싶다고 합니다.


그래서 다음과 같은 처리로 code 마다 ohlcv를 작성합니다.
def gen_ohlcv_df(code):
    df_ohlcv_code = df[df['code'] == code]
    df_ohlcv_code = df_ohlcv_code.set_index('date')
    df_ohlcv_code = pd.concat([df_ohlcv_code['Price'].resample('T').ohlc(),
                               df_ohlcv_code['Trading volume'].resample('T').sum()], axis=1)
    return df_ohlcv_code

당연히 해당 시간에 데이터가 없는 경우는 결측값이 됩니다.



여기서 결측값은 직전의 값으로 보간하고 싶습니다.
def gen_ohlcv_df(code):
    df_ohlcv_code = df[df['code'] == code]
    df_ohlcv_code = df_ohlcv_code.set_index('date')
    df_ohlcv_code = pd.concat([df_ohlcv_code['Price'].resample('T').ohlc(),
                               df_ohlcv_code['Trading volume'].resample('T').sum()], axis=1)
    df_ohlcv_code = df_ohlcv_code.reset_index()

    # 欠損値を直前のデータで補間する
    df_ohlcv_code = df_ohlcv_code.interpolate(method='zero')

    return df_ohlcv_code

ohlc는 좋은 느낌이되었습니다.
여기서 볼륨은 매일 누적 합으로 표시하고 싶습니다.



그런데 단순히 cumsum() 을 적용하면 다음과 같이 volume이 전 기간의 누적 합이 되어 버립니다.
def gen_ohlcv_df(code):
    df_ohlcv_code = df[df['code'] == code]
    df_ohlcv_code = df_ohlcv_code.set_index('date')
    df_ohlcv_code = pd.concat([df_ohlcv_code['Price'].resample('T').ohlc(),
                               df_ohlcv_code['Trading volume'].resample('T').sum()], axis=1)
    df_ohlcv_code = df_ohlcv_code.reset_index()

    # Trading volumeの累積和をとる
    df_ohlcv_code['Trading volume'] = df_ohlcv_code['Trading volume'].cumsum()

    # 欠損値を直前のデータで補間する
    df_ohlcv_code = df_ohlcv_code.interpolate(method='zero')

    return df_ohlcv_code




volume는 일마다 리셋하여 누적합을 산출하고 싶기 때문에, datetime으로부터 잠정적으로 일자 데이터만의 컬럼을 작성해 groupby 해 주는 것으로 해결합니다.
def gen_ohlcv_df(code):
    df_ohlcv_code = df[df['code'] == code]
    df_ohlcv_code = df_ohlcv_code.set_index('date')
    df_ohlcv_code = pd.concat([df_ohlcv_code['Price'].resample('T').ohlc(),
                               df_ohlcv_code['Trading volume'].resample('T').sum()], axis=1)
    df_ohlcv_code = df_ohlcv_code.reset_index()

    # groupbyのためのdayカラムを一時的に追加
    df_ohlcv_code['day'] = df_ohlcv_code['date'].map(lambda x: x.day)

    # 日単位でTrading volumeの累積和をとる
    df_ohlcv_code['Trading volume'] = df_ohlcv_code.groupby(['day'])['Trading volume'].cumsum()

    # dayカラムを削除
    df_ohlcv_code = df_ohlcv_code.drop('day', axis=1)

    # 欠損値を直前のデータで補間する
    df_ohlcv_code = df_ohlcv_code.interpolate(method='zero')

    return df_ohlcv_code

누적 합을 매일 계산할 수 있었습니다.


groupby 하는 데이터를 분이나 초, 주로 하는 경우 등은 x.day 의 부분을 x.minute 등으로 적절히 변경하는 것으로 대응할 수 있습니다.

좋은 웹페이지 즐겨찾기