我正在尝试用大熊猫处理时态数据,我很难... 以下是DataFrame的示例:
index ip app dev os channel click_time
0 29540 3 1 42 489 2017-11-08 03:57:46
1 26777 11 1 25 319 2017-11-09 11:02:14
2 140926 12 1 13 140 2017-11-07 04:36:14
3 69375 2 1 19 377 2017-11-09 13:17:20
4 119166 9 2 15 445 2017-11-07 12:11:37
这是一个点击预测问题,所以我想创建一个聚合特定IP过去行为的时间窗口(对于给定的IP,过去4小时内的点击次数,8小时?)。
我尝试创建一个简单的新列:
df['minus_8']=df['click_time']-timedelta(hours=8)
我想使用它,以便每行都有一个特定的8小时窗口来汇总我的数据。
我也尝试过重新取样,收效甚微,我对该功能的理解并不是最佳说法。
有人可以帮忙吗?
答案 0 :(得分:1)
如果您只需要选择特定的8小时,您可以执行以下操作:
start_time = datetime.datetime(2017, 11, 9,11, 2, 14)
df[(df['click_time' >= start_time)
& (df['click_time'] <= start_time+datetime.timedelta(0, 60*60*8))]
否则我真的认为你需要更多关注resample
。请注意,如果您希望resample
将您的数据划分为始终一致的8小时块(例如从00:00-08:00,08:00-16:00,16:00-00:00 ),那么您可能希望将数据裁剪到特定的开始时间。
答案 1 :(得分:0)
使用Martin提供的解决方案的一部分,我能够创建这个输出我想要的功能:
def window_filter_clicks(df, h):
df['nb_clicks_{}h'.format(h)]=0
ip_array = df.ip.unique()
for ip in ip_array:
df_ip=df[df['ip']==ip]
for row, i in zip(df_ip['click_time'],df_ip['click_time'].index):
df_window = df_ip[(df_ip['click_time']>= row-timedelta(hours=h)) & (df_ip['click_time']<= row) ]
nb_clicks_4h = len(df_window)
df['nb_clicks_{}h'.format(h)].iloc[i]= nb_clicks_4h
return df
h允许我选择要迭代的窗口的大小。 现在这个工作正常,但它非常慢,我正在使用很多行。 有谁知道如何提高这种功能的速度? (或者,如果有任何类似的内置?)