【问题标题】:Conditional Rolling Sum using filter on groupby group rows在 groupby 组行上使用过滤器的条件滚动求和
【发布时间】:2018-12-27 09:55:33
【问题描述】:

我一直在尝试找到一种在 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) 这是执行这些类型操作的“最佳实践”方式吗?

感谢任何帮助,如果我遗漏了什么或需要任何进一步的说明,请告诉我。

【问题讨论】:

    标签: python python-3.x pandas pandas-groupby


    【解决方案1】:

    根据filter 上的文档在groupby 之后,如果它们不符合某些标准,则不应将filter 值放在组内,而是将组作为一个整体,例如sum该组的所有元素的总和大于 2,则该组保留在给定的第一个示例中

    一种方法是先将new[0] 中的所有负值替换为0,例如使用np.clip,然后使用groupbyrollingsum,例如

    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 中的数据,如果您不介意可以使用new[0] = np.clip(new[0],0,np.inf) 更改第0 列,然后执行new.groupby(1)[0].rolling(2).sum() 得到相同的结果。

    【讨论】:

    • 非常感谢!我阅读了文档,但并没有真正理解它不能变成组行级函数。你建议的答案是我在数据科学中假设的最佳实践吗?
    • @clockworkss 对于每组 14 个元素的滚动求和,然后使用函数 groupbyrollingsum 肯定是实现这一目标的好方法。对于如果值为负但仍算作滚动窗口的 14 个元素之一的不求和问题,那么将此值设置为 0 似乎是最简单的事情,np.clip 可能不是最快的,但我认为很容易理解 wat 是做什么的。
    • @clockworkss 在你所说的14天的问题中,是否意味着你的数据的索引是Datetime?如果是,当您执行滚动时,您是否希望在值为负数的日子里看到结果?
    • @clockworks 不客气,然后我想我的回答是一个很好的做法 :) 在 RSI 的情况下,然后去看看这个question,它应该让你更多地了解它,特别是对于 Smoothed RS,解决方案可以使用ewm
    • 谢谢,EWM 听起来很适合我的下一步!
    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    相关资源
    最近更新 更多