我想计算每个元素未来的连续增加或减少计数。
假设我有一个系列:
l=[10, 9, 8, 9, 10, 9, 10, 11, 10, 12, 10]
s=pd.Series(l)
预期输出为:
o=[-2, -1, 2, 1, -1, 2, 1, -1, 1, -1, 0]
解释如下:
第一个元素是10,接下来是9,接下来是8,所以,减少了2次,所以输出是-2,对于第三个元素是8,增加了2次(接下来是9, 10),所以输出为 2。
关键点是连续的,一旦有反向数据,就应该停止向前看。
我该如何实现?我认为 for 循环不够好
答案 0 :(得分:1)
第一次得到差异的迹象。然后找出有多少是连续的相同符号。如果相同,则添加数量。 试试:
import numpy as np
l=np.array([10, 9, 8, 9, 10, 9, 10, 11, 10, 12, 10])
sign = np.sign(np.diff(l))
count = {}
for i in range(len(sign)-1):
count[i] = sign[i]
for j in range(i+1, len(sign)):
if sign[i]==sign[j]:
count[i] += sign[j]
else:
break
count[i+1] = 0
res = count.values()
资源:
dict_values([-2, -1, 2, 1, -1, 2, 1, -1, 1, 0])
编辑:
如果您想使用 pandas
df = pd.DataFrame(sign, columns=['col'])
df = df[::-1]
x = df.groupby((df['col'] != df['col'].shift(1)).cumsum()).cumsum()['col']
x.iloc[0]=0
x = x.values[::-1]
x:
array([-2, -1, 2, 1, -1, 2, 1, -1, 1, 0])
而不是:
(df['col'] != df['col'].shift(1)).cumsum()
你可以使用
df.col.diff().ne(0).cumsum()