복붙노트

[PYTHON] pandas에 rolling_apply를 사용하는 Python 사용자 정의 함수

PYTHON

pandas에 rolling_apply를 사용하는 Python 사용자 정의 함수

나는 pandas.rolling_apply 함수를 사용하여 자신 만의 함수를 롤 창 기반으로 적용하고 싶습니다.

하지만 내 함수에는 두 개의 인수가 필요하며 두 개의 출력도 있습니다. 이것이 가능한가?

다음은 최소한의 재현 가능한 예제입니다 ...

import pandas as pd
import numpy as np
import random
tmp  = pd.DataFrame(np.random.randn(2000,2)/10000, 
                    index=pd.date_range('2001-01-01',periods=2000),
                    columns=['A','B'])

def gm(df,p):
    v =(((df+1).cumprod())-1)*p
    return v.iloc[-1]

# an example output when subsetting for just 2001
gm(tmp['2001'],5)


# the aim is to do it on a rolling basis over a 50 day window
# whilst also getting both outputs and also allows me to add in the parameter p=5
# or any other number I want p to be... 
pd.rolling_apply(tmp,50,gm)

gm이 두 개의 인수를 취하기 때문에 ... 오류가 발생합니다 ...

어떤 도움이라도 대단히 감사하겠습니다 ...

편집하다

Jeff의 의견에 따라 진행되었지만 여전히 두 개 이상의 열 출력에 어려움을 겪고 있습니다. 따라서 대신 v 대신에 마지막 행인 v 대신에 두 개의 임의의 숫자 (이전 계산과 연결되지 않은)를 반환하는 새로운 함수 (아래)를 만듭니다. TypeError 오류가 발생합니다. 길이가 1 인 배열 만 파이썬 스칼라로 변환 할 수 있습니다. 이 함수는

def gm2(df,p):
    df = pd.DataFrame(df)
    v =(((df+1).cumprod())-1)*p
    return np.random.rand(2)

pd.rolling_apply(tmp,50,lambda x: gm2(x,5)).tail(20)

이 기능은 2가 1로 변경되면 작동합니다 ...

해결법

  1. ==============================

    1.rolling_apply는 numpy 배열을 적용 함수 (at-the-moment)에 전달하고 0.14는 프레임을 전달해야합니다. 문제는 여기에 있습니다.

    rolling_apply는 numpy 배열을 적용 함수 (at-the-moment)에 전달하고 0.14는 프레임을 전달해야합니다. 문제는 여기에 있습니다.

    그래서 numpy 배열에서 작동하도록 함수를 재정의하십시오. 물론 내부에 DataFrame을 만들 수 있지만 인덱스 / 열 이름은 동일하지 않습니다.

    In [9]: def gm(df,p):
       ...:     v = ((np.cumprod(df+1))-1)*p
       ...:     return v[-1]
       ...: 
    

    사용자 정의 함수에서 더 많은 팬더 함수를 사용하려면이 작업을 수행하십시오 (호출 프레임의 표시가 ATM에 전달되지 않음에 유의하십시오).

    def gm(arr,p):
        df = DataFrame(arr)
        v =(((df+1).cumprod())-1)*p
        return v.iloc[-1]
    

    그것을 통해 람다 통과

    In [11]: pd.rolling_apply(tmp,50,lambda x: gm(x,5)).tail(20)
    Out[11]: 
                       A         B
    2006-06-04  0.004207 -0.002112
    2006-06-05  0.003880 -0.001598
    2006-06-06  0.003809 -0.002228
    2006-06-07  0.002840 -0.003938
    2006-06-08  0.002855 -0.004921
    2006-06-09  0.002450 -0.004614
    2006-06-10  0.001809 -0.004409
    2006-06-11  0.001445 -0.005959
    2006-06-12  0.001297 -0.006831
    2006-06-13  0.000869 -0.007878
    2006-06-14  0.000359 -0.008102
    2006-06-15 -0.000885 -0.007996
    2006-06-16 -0.001838 -0.008230
    2006-06-17 -0.003036 -0.008658
    2006-06-18 -0.002280 -0.008552
    2006-06-19 -0.001398 -0.007831
    2006-06-20 -0.000648 -0.007828
    2006-06-21 -0.000799 -0.007616
    2006-06-22 -0.001096 -0.006740
    2006-06-23 -0.001160 -0.006004
    
    [20 rows x 2 columns]
    
  2. from https://stackoverflow.com/questions/21025821/python-custom-function-using-rolling-apply-for-pandas by cc-by-sa and MIT license