gpt4 book ai didi

python - 如何使用来自多列的参数调用 pandas.rolling.apply?

转载 作者:行者123 更新时间:2023-12-02 11:20:52 26 4
gpt4 key购买 nike

我有一个数据集:

    Open     High      Low    Close        
0 132.960 133.340 132.940 133.105
1 133.110 133.255 132.710 132.755
2 132.755 132.985 132.640 132.735
3 132.730 132.790 132.575 132.685
4 132.685 132.785 132.625 132.755

我尝试对所有行使用 rolling.apply 函数,如下所示:
df['new_col']= df[['Open']].rolling(2).apply(AccumulativeSwingIndex(df['High'],df['Low'],df['Close']))
  • 显示错误

  • 或者
    df['new_col']=  df[['Open', 'High', 'Low', 'Close']].rolling(2).apply(AccumulativeSwingIndex)
  • 仅传递“打开”列中的参数

  • 有谁能够帮助我?

    最佳答案

    定义你自己的roll
    我们可以创建一个接受窗口大小参数的函数 w和任何其他关键字参数。我们用它来构建一个新的DataFrame我们将在其中调用 groupby on 同时通过 kwargs 传递关键字参数.

    注意:我不必使用 stride_tricks.as_strided但它很简洁,在我看来是合适的。

    from numpy.lib.stride_tricks import as_strided as stride
    import pandas as pd

    def roll(df, w, **kwargs):
    v = df.values
    d0, d1 = v.shape
    s0, s1 = v.strides

    a = stride(v, (d0 - (w - 1), w, d1), (s0, s0, s1))

    rolled_df = pd.concat({
    row: pd.DataFrame(values, columns=df.columns)
    for row, values in zip(df.index, a)
    })

    return rolled_df.groupby(level=0, **kwargs)

    roll(df, 2).mean()

    Open High Low Close
    0 133.0350 133.2975 132.8250 132.930
    1 132.9325 133.1200 132.6750 132.745
    2 132.7425 132.8875 132.6075 132.710
    3 132.7075 132.7875 132.6000 132.720

    我们也可以使用 pandas.DataFrame.pipe达到同样效果的方法:
    df.pipe(roll, w=2).mean()



    旧答案

    Panel已被弃用。有关更新的答案,请参见上文。

    https://stackoverflow.com/a/37491779/2336654

    定义我们自己的 roll
    def roll(df, w, **kwargs):
    roll_array = np.dstack([df.values[i:i+w, :] for i in range(len(df.index) - w + 1)]).T
    panel = pd.Panel(roll_array,
    items=df.index[w-1:],
    major_axis=df.columns,
    minor_axis=pd.Index(range(w), name='roll'))
    return panel.to_frame().unstack().T.groupby(level=0, **kwargs)

    你应该能够:
    roll(df, 2).apply(your_function)

    使用 mean
    roll(df, 2).mean()

    major Open High Low Close
    1 133.0350 133.2975 132.8250 132.930
    2 132.9325 133.1200 132.6750 132.745
    3 132.7425 132.8875 132.6075 132.710
    4 132.7075 132.7875 132.6000 132.720
    f = lambda df: df.sum(1)

    roll(df, 2, group_keys=False).apply(f)

    roll
    1 0 532.345
    1 531.830
    2 0 531.830
    1 531.115
    3 0 531.115
    1 530.780
    4 0 530.780
    1 530.850
    dtype: float64

    关于python - 如何使用来自多列的参数调用 pandas.rolling.apply?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55821869/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com