在Python中聚合时间序列数据中重叠的“所有先前事件”功能

时间:2014-01-08 03:17:32

标签: python pandas time-series data-mining data-extraction

我的问题很普遍,很可能在很多方面解决。但考虑到时间和记忆,什么是聪明的方式?

我有以下表格的用户互动的时间序列数据:

cookie_id     interaction
---------     -----------
1234          did_something
1234          viewed_banner*
1234          did_something
1234          did_something
1234          viewed_and_clicked_banner*
...           ...

我希望它能够训练模型,预测每当显示横幅时用户是否会点击横幅(即用*标记的交互)。为此,我需要在Feed中显示兴趣点(viewed_bannerviewed_and clicked_banner)时汇总以前的所有互动:

cookie_id     interaction
---------     -----------
1234          did_something
1234          viewed_banner               <- point of interest

cookie_id     interaction
---------     -----------
1234          did_something
1234          viewed_banner
1234          did_something
1234          did_something
1234          viewed_and_clicked_banner   <- point of interest

这是问题的核心:将数据拆分成重叠的组!执行此操作后,可以将每个组聚合到例如:

cookie_id   did_something   viewed_banner   viewed_and_cli...   clicked?
---------   -------------   -------------   -----------------   --------
1234        1               0               0                   no
1234        3               1               0                   yes

此处did_somethingviewed_banner中的数字是这些交互的计数(不包括兴趣点),但也可以执行其他类型的聚合。 clicked?属性只描述了两种“兴趣点”中的哪一种是交互Feed中的最后一次互动。

我试图查看Pandas applygroupby方法,但无法想出能够生成所需重叠组的内容。

另一种方法是使用一些for循环,但如果有一种简单有效的方法来解决问题,我宁愿不这样做。

1 个答案:

答案 0 :(得分:1)

以下是我尝试的内容,我认为需要更多数据来验证代码:

data = """cookie_id     interaction
1234          did_something
1234          viewed_banner*
1234          did_something
1234          did_something
1234          viewed_and_clicked_banner*
"""

import pandas as pd
import io

df = pd.read_csv(io.BytesIO(data), delim_whitespace=True)
flag = df.interaction.str.endswith("*")
group_flag = flag.astype(float).mask(~flag).ffill(limit=1).fillna(0).cumsum()
df["interaction"] = df.interaction.str.rstrip("*")
interest_df = df[flag]

def f(s):
    return s.value_counts()

df2 = df.groupby(group_flag).interaction.apply(f).unstack().fillna(0).cumsum()
result = df2[::2].reset_index(drop=True)
result["clicked"] = interest_df.interaction.str.contains("clicked").reset_index(drop=True)
print result

输出:

  did_something  viewed_and_clicked_banner  viewed_banner clicked
0              1                          0              0   False
1              3                          0              1    True

基本思路是将数据帧分成几组:

  • 奇数组是没有*
  • 的连续行
  • 偶数组只有一行*

假设数据框中的第一行没有*

然后为每个组执行value_counts并将结果合并到数据框中。 cumsum()计数和删除偶数行将获得正确的计数。

我不知道如何计算clicked列。你能详细解释一下吗?