在关系数据库中,我经常在SQL中执行的一个查询是将一个表连接回它自己,并根据同一id的记录在时间上向后或向前汇总每一行。在
例如,假设table1为'ID'、'Date'、'Var1'列
在SQL中,我可以将过去3个月内每个记录的var1相加,如下所示:
Select a.ID, a.Date, sum(b.Var1) as sum_var1
from table1 a
left outer join table1 b
on a.ID = b.ID
and months_between(a.date,b.date) <0
and months_between(a.date,b.date) > -3
有没有办法在熊猫身上做到这一点?在
似乎您需要
GroupBy
+rolling
。以与SQL中编写的逻辑完全相同的方式实现逻辑可能很昂贵,因为它将涉及重复的循环。以数据帧为例:您可以添加一个列,该列按组在一个固定的周期内回顾并求和一个变量。首先使用^{} 定义函数:
^{pr2}$然后将其应用于
GroupBy
对象并提取赋值值:似乎}(70天)得到{}。这是有道理的,因为“月”是模棱两可的,因为月份有不同的天数。在
pd.Series.rolling
与月份无关,例如使用'2M'
(2个月)而不是{另一点值得一提的是,您可以直接使用
GroupBy
+rolling
,绕过apply
,可能更有效,但这需要确保索引是monotic的。例如,通过sort_index
:我认为
pandas.DataFrame.rolling()
不支持滚动窗口聚合(以月为单位);目前,必须指定固定的天数或其他固定长度的时间段。在但正如@jpp所提到的,您可以使用python循环在以日历月为单位指定的窗口大小上执行滚动聚合,每个窗口中的天数会有所不同,这取决于您要滚动的日历的哪个部分。在
以下方法基于this SO answer和@jpp:
最后一列给出了回溯窗口的大小(以天为单位),从该日期开始向后看,包括开始日期和结束日期。在
在
^{pr2}$2016-05-31
之前看“3个月”会让你在2015-02-31
找到,但2015年2月只有28天。正如您在上述健全性检查中的序列90, 91, 92, 93
中看到的,这种DateOffset
方法将5月的最后四天映射到2月的最后一天:我不知道这是否与SQL的行为相匹配,但无论如何,您都需要测试一下,并确定这在您的情况下是否有意义。在
你可以用lambda来实现。在
我们应该为
完整的例子是
^{pr2}$相关问题 更多 >
编程相关推荐