使用Pandas选择,切片和聚合时态数据

时间:2018-03-30 19:03:40

标签: python pandas time-series

我正在尝试用大熊猫处理时态数据,我很难... 以下是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小时窗口来汇总我的数据。

我也尝试过重新取样,收效甚微,我对该功能的理解并不是最佳说法。

有人可以帮忙吗?

2 个答案:

答案 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允许我选择要迭代的窗口的大小。 现在这个工作正常,但它非常慢,我正在使用很多行。 有谁知道如何提高这种功能的速度? (或者,如果有任何类似的内置?)