我一直在尝试没有成功的方法,试图找到一种在python中创建“ average_gain_up”的方法,并且有点卡住了。对groupby来说是新手,它在如何处理我尚未设法掌握的功能方面有些东西,因此如何思考这些类型的问题背后的任何直觉都将有所帮助。
问题: 创建滚动的14天总和,仅当值> 0时才求和。
new=pd.DataFrame([[1,-2,3,-2,4,5],['a','a','a','b','b','b']])
new= new.T #transposing into a friendly groupby format
#Group by a or b, filter to only have positive values and then sum rolling, we
keep NAs to ensure the sum is ran over 14 values.
groupby=new.groupby(1)[0].filter(lambda x: x>0,dropna=False).rolling(14).sum()
预期总和框架:
x.all()/ len(x)结果:
这将引发类型错误“过滤器必须返回布尔结果”。 通过阅读其他答案,我明白了,我在问一个系列/框架是否优于0。 上面的代码适用于len(x),在这种情况下也是有意义的。
我也尝试过all(),但是它的行为不符合预期。 .all()函数为每个组返回一个布尔值,然后总和就是一个简单的滚动总和。
我尝试创建一个布尔值列表,以说明哪些值是正值,哪些不是,但这也会产生错误,这一次我不确定为什么。
groupby1=new.groupby(1)[0]
groupby2=[y>0 for x in groupby1 for y in x[1] ]
groupby_try=new.groupby(1)[0].filter(lambda x:groupby2,dropna=False).rolling(2).sum()
1)我如何使上面的代码起作用,我在想什么呢?
2)这是进行此类操作的“最佳实践”方法吗?
任何帮助表示赞赏,如果我有任何遗漏或需要进一步澄清,请告诉我。
答案 0 :(得分:1)
根据groupby
之后filter
上的文档,不应将filter
的值放在一个组中,而是将整个组(如果它们不满足某些条件)进行分组,例如就像该组中所有元素的sum
都大于2一样,则该组将保留在给定的第一个示例中
一种方法可能是先在new[0]
中将所有负值替换为0,例如使用np.clip
,然后再使用groupby
,rolling
和{{1} },例如
sum
这种方法可以防止修改print (np.clip(new[0],0,np.inf).groupby(new[1]).rolling(2).sum())
1
a 0 NaN
1 1.0
2 3.0
b 3 NaN
4 4.0
5 9.0
Name: 0, dtype: float64
中的数据,如果您不介意,可以使用new
更改列0,然后执行new[0] = np.clip(new[0],0,np.inf)
来得到相同的结果。 / p>