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
등으로 적절히 변경하는 것으로 대응할 수 있습니다.
Reference
이 문제에 관하여(pandas의 시계열 데이터 처리로 누적 합을 일정 기간마다 산출하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/algopia/items/ceb9e4ece57c97b422ce텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)