【问题标题】:Apply a custum rolling function with arguments on Pandas DataFrame在 Pandas DataFrame 上应用带参数的自定义滚动函数
【发布时间】:2022-12-10 21:16:17
【问题描述】:

我有这个df

(这里是df.head()

    date        colA
0   2018-01-05  0.6191
1   2018-01-20  0.5645
2   2018-01-25  0.5641
3   2018-01-27  0.5404
4   2018-01-30  0.4933

我想递归地将一个函数应用于每 3 行,这意味着行:1、2、3,然后是行:2、3、4,然后是第 3、4、5 行,等等。

这就是我写的:

def my_rolling_func(df, val):
  
    p1 = (df['date']-df['date'].min()).dt.days.tolist()[0],df[val].tolist()[0]
    p2 = (df['date']-df['date'].min()).dt.days.tolist()[1],df[val].tolist()[1]
    p3 = (df['date']-df['date'].min()).dt.days.tolist()[2],df[val].tolist()[2]
  
    return sum([i*j for i,j in [p1,p2,p3]])

df.rolling(3,center=False,axis=1).apply(my_rolling_func, args=('colA'))

但我收到此错误:

ValueError: Length of passed values is 1, index implies 494.

494 是我的df 中的行数。

我不确定为什么它说我传递了 1 的长度,我认为滚动会根据我定义的窗口大小 (3) 生成 df 的切片,然后它将函数应用于 df 的子集。

【问题讨论】:

    标签: python-3.x pandas rolling-computation


    【解决方案1】:

    首先,您指定了错误的轴。轴 1 表示窗口将沿着列滑动。您希望窗口沿着索引滑动,因此您需要指定axis=0。其次,您对滚动的工作原理有一点误解。它会将您的函数独立应用于每一列,因此您不能在函数内同时对 datecolA 列进行操作。 我重写了您的代码以使其工作:

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'date':pd.date_range('2018-01-05', '2018-01-30', freq='D'), 'A': np.random.random((26,))})
    df = df.set_index('date')
    
    
    def my_rolling_func(s):
        days = (s.index - s.index[0]).days
        return sum(s*days)
    
    
    res = df.rolling(3, center=False, axis=0).apply(my_rolling_func)
    
    print(res)
    
    
    Out: 
                      A
    date                
    2018-01-05       NaN
    2018-01-06       NaN
    2018-01-07  1.123872
    2018-01-08  1.121119
    2018-01-09  1.782860
    2018-01-10  0.900717
    2018-01-11  0.999509
    2018-01-12  1.755408
    2018-01-13  2.344914
           .....
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-13
      • 2017-10-14
      • 2015-08-28
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多