[PYTHON] pandas에 rolling_apply를 사용하는 Python 사용자 정의 함수
PYTHONpandas에 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.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]
from https://stackoverflow.com/questions/21025821/python-custom-function-using-rolling-apply-for-pandas by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] Python의 Spark DataFrame에서 labeledPoints 만들기 (0) | 2018.11.18 |
---|---|
[PYTHON] 내부 클래스 : 생성시 외부 클래스 객체를 얻으려면 어떻게해야합니까? (0) | 2018.11.18 |
[PYTHON] 파이썬에서 fft bandpass 필터 (0) | 2018.11.18 |
[PYTHON] utf8 문제가있는 파이썬 정규식 (0) | 2018.11.18 |
[PYTHON] sparse_softmax_cross_entropy_with_logits를 사용하여 tensorflow에서 가중 크로스 엔트로피 손실을 구현하려면 어떻게해야합니까? (0) | 2018.11.18 |