我试图根据存储在单独表中的日期值计算熊猫中基于时间的聚合。
第一张桌子的顶部是这样的:
COMPANY_ID DATE MEASURE
1 2010-01-01 00:00:00 10
1 2010-01-02 00:00:00 10
1 2010-01-03 00:00:00 10
1 2010-01-04 00:00:00 10
1 2010-01-05 00:00:00 10
下面是创建表的代码:
table_a = pd.concat(\
[pd.DataFrame({'DATE': pd.date_range("01/01/2010", "12/31/2010", freq="D"),\
'COMPANY_ID': 1 , 'MEASURE': 10}),\
pd.DataFrame({'DATE': pd.date_range("01/01/2010", "12/31/2010", freq="D"),\
'COMPANY_ID': 2 , 'MEASURE': 10})])
第二张桌子,桌子b看起来是这样的:
COMPANY END_DATE
1 2010-03-01 00:00:00
1 2010-06-02 00:00:00
2 2010-03-01 00:00:00
2 2010-06-02 00:00:00
创建它的代码是:
table_b = pd.DataFrame({'END_DATE':pd.to_datetime(['03/01/2010','06/02/2010','03/01/2010','06/02/2010']),\
'COMPANY':(1,1,2,2)})
我希望能够在表b中的结束日期之前的每30天内获取每个公司ID的度量值列的总和
这(我认为)相当于SQL:
select
b.COMPANY_ID,
b.DATE
sum(a.MEASURE) AS MEASURE_TO_END_DATE
from table_a a, table_b b
where a.COMPANY = b.COMPANY and
a.DATE < b.DATE and
a.DATE > b.DATE - 30
group by b.COMPANY;
谢谢你的帮助
好吧,我可以想出一些办法。(1) 基本上是在
company
上合并来放大数据帧,然后在合并后的30天窗口上过滤。这应该很快,但可能会占用大量内存。(2) 将30天窗口上的合并和筛选移动到groupby中。这将导致每个组的合并,因此速度会慢一些,但应该使用较少的内存选项1
假设您的数据如下所示(我扩展了您的示例数据):
为30天窗口创建开始日期:
现在进行合并,然后根据
date
是否在beg_date
和end_date
范围内进行选择:您可以通过对
company
和end_date
分组来计算30天的窗口和:选项#2将所有合并移动到groupby中。这对记忆应该更好,但我想得慢得多:
另一个选项现在,如果您的窗口从未重叠(如示例数据中所示),您可以执行以下操作,作为不会炸毁数据帧但速度非常快的替代方法:
此合并实质上是将窗口结束日期插入到数据框中,然后(按组)填充结束日期,这将为您提供一个结构,以便轻松创建汇总窗口:
另一种方法是将第一个数据帧重新采样为每日数据,然后使用30天的窗口计算滚动和;并在您感兴趣的结尾选择日期。这也可能是相当密集的记忆。
相关问题 更多 >
编程相关推荐