Я хотел бы использовать функцию pandas.rolling_apply
для применения моей собственной пользовательской функции на основе катящегося окна.Пользовательская функция Python с использованием функции roll_apply для pandas
но моя функция требует двух аргументов, а также имеет два выхода. Это возможно?
Ниже приведен минимальный воспроизводимый пример ...
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)
что приводит к ошибке ... поскольку г принимает два аргумента ...
любая помощь будет принята с благодарностью ...
EDIT
После комментария Джеффа я прогрессировал, но я до сих пор борется с двумя или более Colum n, поэтому, если вместо этого я создаю новую функцию (ниже), которая вместо двух последних чисел (не связанных с предыдущим вычислением) возвращает вместо двух последних строк v, я получаю ошибку TypeError: only length-1 arrays can be converted to Python scalars
. Эта функция работает, если
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 ...
как вы «переопределить вашу функцию, чтобы работать на Numpy массиве.»? –
вы можете использовать только функции numpy (а не функции pandas); или вы можете сделать '' DataFrame (df) '', чтобы сделать его фреймом – Jeff
Означает ли это, что в пользовательской функции я могу запускать только функции numpy и функции pandas? –