当前位置: 首页 > 面试题库 >

使用rolling_apply对pandas的Python自定义函数

乐正涵意
2023-03-14
问题内容

我想使用该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的最后一行,出现错误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,则此功能有效。


问题答案:

rolling_apply将numpy数组传递给应用的函数(当前),到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]

通过lambda传递

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]


 类似资料:
  • 主要内容:操作整个数据表,操作行或列,操作单一元素如果想要应用自定义的函数,或者把其他库中的函数应用到 Pandas 对象中,有以下三种方法: 1) 操作整个 DataFrame 的函数:pipe() 2) 操作行或者列的函数:apply() 3) 操作单一元素的函数:applymap() 如何从上述函数中选择适合的函数,这取决于函数的操作对象。下面介绍了三种方法的使用。 操作整个数据表 通过给 pipe() 函数传递一个自定义函数和适当数量的参

  • 问题内容: 我有以下数据框,我想先按“重要性”排序,然后再按“名称”排序: 我一直在努力做到这一点使用中提供了答案这个职位,但我不能得到它的工作。 最终结果应该是这样的 问题答案: 一种方法是使用自定义字典创建“等级”列,然后使用进行排序,然后在排序后删除该列:

  • 问题内容: 我正在尝试滚动计算体积加权平均价格。 为此,我有一个函数vwap可以为我执行此操作,如下所示: 如图所示,当我尝试将此函数与rolling_apply一起使用时,出现错误: 该错误对我来说很有意义,因为rolling_apply不需要DataSeries或ndarray作为输入,也不需要dataFrame。 有没有一种方法可以将rolling_apply应用于DataFrame以解决我

  • 在使用EL自定义函数之前必须使用tablib指令引用EL自定义函数库。代码如下: <!-- customfun.jsp --> <%@ page language="java" contentType="text/html; charset=UTF-8"%> <!-- 引用EL自定义函数库 --> <%@ taglib prefix="cfun" uri="http://www.sun.c

  • 我正在开发一个REST网络服务。泽西岛作为 jax-rs 提供程序,杰克逊作为序列化/反序列化。我还基于Retrofit2开发客户端。 我的类层次结构是由第三方库提供的,所有类都是从根基类派生出来的。其中一些类有不受欢迎的getter,例如我想在序列化时忽略它们(请注意,重要的是它们根本没有被序列化,在反序列化上使用在我的例子中是不够的)。 我已经在使用Mixins的< code>BaseClas

  • 本文向大家介绍python调用自定义函数的实例操作,包括了python调用自定义函数的实例操作的使用技巧和注意事项,需要的朋友参考一下 在python中,想要调用自定义函数必须先声明,然后才能调用。使用函数时,只要按照函数定义的形式,向函数传递必需的参数,就可以调用函数完成相应的功能或者获得函数返回的处理结果。 (1)声明函数 python中使用 def 可以声明一个函数,完整的函数是由函数名、参