gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:03:22 24 4
gpt4 key购买 nike

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

我尝试了以下代码但返回错误:

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创建 bool 系列:

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

关于Python pandas dataframe 将元素添加到前一行值并创建一个新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52282170/

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