这是我的previous question的扩展。
在那里,我询问了关于结合groupby和滚动聚合的问题。@mozway非常友好地提供了一个优雅的解决方案。但是,我忘了说我需要考虑数据中的差距。
这是几年来每个客户的月度数据。
在下面的代码片段中,是客户2的相同数据,我们没有期间“200102”(2001年2月)的数据。在最初的问题中,我简单地将周期表示为1,2,3...所有时期的数据都在那里。
df=pd.DataFrame({'cust_id': [1,1,1,1,1,1,2,2,2,2,2],
'period' : [200010,200011,200012,200101,200102,200103,200010,200011,200012,200101,200103],
'volume' : [1,2,3,4,5,6,7,8,9,10,12],
'num_transactions': [3,4,5,6,7,8,9,10,11,12,13]})
字符串
输出将是:
out=pd.DataFrame({'cust_id': [1,1,1,1,1,1,2,2,2,2,2],
'period' : [200010,200011,200012,200101,200102,200103,200010,200011,200012,200101,200103],
'max_vol_3' : [None, None, 3,4,5,6,None,None,9,10,None],
'max_vol_6' :[None,None,None,None,None,6,None,None,None,None,None],
'sum_trans_3': [None, None, 12, 15, 18, 21, None, None, 30, 33, None]})
型
怎么办?
链接文章中的解决方案通过简单地考虑前面的行来计算滚动聚合。但不幸的是,某些时期的数据存在差距。
编辑:
我意识到我的措辞很含糊。
从本质上讲,我想应用一个最小阈值-如果,比如说,3个月的窗口中缺少1个值,那么这3个月的统计数据将被设置为None。
我会强制执行,至少3个月用于3个月的总结和至少5个月用于6个月的总结。
1条答案
按热度按时间mlnl4t2r1#
我试了一下,其实并不简单。您不能在滚动中使用月度期间,因为这些期间不是固定的(29到31天)。所以我用几个月来作弊。
为了方便使用,我将所有内容都封装在一个函数中:
字符串
输出量:
型
在缺失周期时强制NaN
型
输出量:
型