Pandas矢量化操作-使计数功能,当阈值达到5时重置

yb3bgrhw  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(170)

我是一个新的编程和我的斗争,这件事。任何帮助是赞赏!
我有一个股票的序列,包括价格和信号,如果它将上升(1)或下降(-1).我想把重复的序列计数到另一列'计数'.所以,当有一个序列1,1,1;然后计数将是1,2,3.如果它的**-1,-1,-1**;然后计数将是1,2,3了.
此外,当阈值达到5时,计数重置。无论是1还是-1。
所以,我得到的是:

price  sign
0    13     1
1    12     1
2    11     -1
3    12     -1
4    13     1
5    14     1
6    14     1
7    14     1
8    14     1
9    14     1
10   14     1
.
.
.

字符串
我想要的是:

price  sign  count
0    13     1       1
1    12     1       2
2    11     -1      1
3    12     -1      2
4    13     1       1
5    14     1       2
6    14     1       3
7    14     1       4
8    14     1       5
9    14     1       1
10   14     1       2
.
.
.


我已经用普通的python代码编写了这个代码。但是我不能在Pandas Vectorized Operation中执行这个操作!请帮助我!

uyhoqukh

uyhoqukh1#

通过连续的sign值使用GroupBy.cumcount,并以5为模:

df['count'] = df.groupby(df['sign'].ne(df['sign'].shift()).cumsum()).cumcount() % 5 + 1

print (df)
    price  sign  count
0      13     1      1
1      12     1      2
2      11    -1      1
3      12    -1      2
4      13     1      1
5      14     1      2
6      14     1      3
7      14     1      4
8      14     1      5
9      14     1      1
10     14     1      2

字符串

详情

print (df.assign(consecutive=df['sign'].ne(df['sign'].shift()).cumsum(),
                 counter=df.groupby(df['sign'].ne(df['sign'].shift()).cumsum()).cumcount(),
                 count = df.groupby(df['sign'].ne(df['sign'].shift()).cumsum()).cumcount() % 5 + 1))
    price  sign  consecutive  counter  count
0      13     1            1        0      1
1      12     1            1        1      2
2      11    -1            2        0      1
3      12    -1            2        1      2
4      13     1            3        0      1
5      14     1            3        1      2
6      14     1            3        2      3
7      14     1            3        3      4
8      14     1            3        4      5
9      14     1            3        5      1
10     14     1            3        6      2

svdrlsy4

svdrlsy42#

你可以先创建一个掩码,当符号从正变为负或相反时。2这是为了在符号改变时重置。

mask = df['sign'].ne(df['sign'].shift())

字符串
然后,根据符号的变化创建分组变量

group = mask.cumsum()


使用group by函数进行累计计数,每当重复使用该符号时,您就添加1。

df['count'] = df.groupby(group).cumcount() + 1


如果它达到5,重置为1(因此是+1),我想这是最棘手的部分,这里有一个很好的introduction到lamba函数:

df['count'] = df.groupby(group)['count'].apply(lambda x: (x - 1) % 5 + 1)


然后符号的变化也会将计数重置为1,这是我们在开始时确定的

df.loc[mask, 'count'] = 1


希望这有帮助

相关问题