Python pandas dataframe 将元素添加到前一行值并创建一个新列

Python pandas dataframe add element to previous row values and create a new column

enter image description here

Volume = [-1 -2 0 1 3 -1 -2 -1 -2 2 -2 -1 0]

Net_rate = [1 0 0 1 0 1 2 3 0 0 1 0]

我有 Pandas 数据框 'Volume',需要创建列 'Net_rate'。

算法计算是这样的:

如果音量[i]*音量[i-1]>0 然后 Net_rate[i-1]+1 否则 0

我尝试了以下代码,但 returns 错误:

def f_DataSlider(df, input, n, name):
    """Calculate the moving average for the given data.

    :param df: pandas.DataFrame
    :param n: 
    :return: pandas.DataFrame
    """
    Slider = pd.Series(df[input].shift(n), name=str(name))
    df = df.join(Slider)
    return df

data = f_DataSlider(data, 'Volume', 1, 'Volume_1')

mask2 = (data['Volume']*dfohlc['Volume_1'])>0
dfohlc.loc[mask2, 'Net_rate'] = dfohlc['Net_rate'].shift(-1)+1
dfohlc.loc[~mask2, 'Net_rate'] = 1

我应该如何编码? 有谁能帮帮我吗?

使用numba

你可以在这里使用numba,只要确保先pip install numba。此选项比 cumsum 选项慢,但它有助于演示解决此问题的算法的外观。

设置

from numba import njit

使用 shift 创建一个布尔序列:

s = df.Volume.mul(df.Volume.shift(-1)).gt(0).tolist()

@njit
def increment(s):
    rate = [int(s[0]>0)]
    for idx, el in enumerate(s[1:]):
        if el:
            rate.append(rate[idx]+1)
        else:
            rate.append(0)
    return rate

increment(s)

[1, 0, 0, 1, 0, 1, 2, 3, 0, 0, 1, 0, 0]

使用 cumsumgroupby:

s = df.Volume.mul(df.Volume.shift(-1)).gt(0).astype(int)

s.groupby(s.ne(s.shift()).cumsum()).cumsum()

0     1
1     0
2     0
3     1
4     0
5     1
6     2
7     3
8     0
9     0
10    1
11    0
12    0
Name: Volume, dtype: int32

说明

我们可以使用 shift 进行 Volume[i] * Volume[i-1] 检查:

df.Volume.mul(df.Volume.shift(-1))

0     2.0
1    -0.0
2     0.0
3     3.0
4    -3.0
5     2.0
6     2.0
7     2.0
8    -4.0
9    -4.0
10    2.0
11   -0.0
12    NaN
Name: Volume, dtype: float64

我们可以取这个数列,检查它是否大于 0:

df.Volume.mul(df.Volume.shift(-1)).gt(0).astype(int)

0     1
1     0
2     0
3     1
4     0
5     1
6     1
7     1
8     0
9     0
10    1
11    0
12    0
Name: Volume, dtype: int32

现在您可以看到输出的结构变得清晰了,但是我们需要根据 1 的连续范围递增,我们可以使用 groupby 技巧对连续值进行分组, 然后取 cumsum.