【发布时间】:2018-05-13 19:16:02
【问题描述】:
我有一个以下格式的熊猫数据框:
'customer_id','transaction_dt','product','price','units'
1,2004-01-02,thing1,25,47
1,2004-01-17,thing2,150,8
2,2004-01-29,thing2,150,25
3,2017-07-15,thing3,55,17
3,2016-05-12,thing3,55,47
4,2012-02-23,thing2,150,22
4,2009-10-10,thing1,25,12
4,2014-04-04,thing2,150,2
5,2008-07-09,thing2,150,43
我编写了以下代码来创建两个指示 30 天窗口的新字段:
import numpy as np
import pandas as pd
start_date_period = pd.period_range('2004-01-01', '12-31-2017', freq='30D')
end_date_period = pd.period_range('2004-01-30', '12-31-2017', freq='30D')
def find_window_start_date(x):
window_start_date_idx = np.argmax(x < start_date_period.end_time)
return start_date_period[window_start_date_idx]
df['window_start_dt'] = df['transaction_dt'].apply(find_window_start_date)
def find_window_end_date(x):
window_end_date_idx = np.argmin(x > end_date_period.start_time)
return end_date_period[window_end_date_idx]
df['window_end_dt'] = df['transaction_dt'].apply(find_window_end_date)
不幸的是,为我的应用程序按行申请太慢了。如果可能的话,我将不胜感激有关矢量化这些函数的任何提示。
编辑:
生成的数据框应具有以下布局:
'customer_id','transaction_dt','product','price','units','window_start_dt','window_end_dt'
在正式意义上,它不需要重新采样或窗口化。它只需要添加“window_start_dt”和“window_end_dt”列。当前代码有效,如果可能,只需对其进行矢量化即可。
【问题讨论】:
-
只是为了确认一下,您只想提取属于该 30 天窗口的最后一个日期(出现在您的数据中),对吧?
-
@AntoineZambelli 我想我明白你的意思了。我实际上不需要另外做一个 groupby 操作,所以不需要在 windows 中选择第一个/最后一个日期。仅适用于现有行。如有误解,请见谅。
-
好吧,希望我理解正确,我想你想要
resample!
标签: python pandas numpy vectorization