1

我的问题很笼统,可能可以通过多种方式解决。但是考虑到时间和记忆的聪明方法是什么?

我有以下形式的用户交互的时间序列数据:

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

我希望它训练模型来预测用户是否会在显示横幅时点击横幅(即标有 * 的交互)。为此,我需要在提要中出现兴趣点(或viewed_banner或)时汇总所有先前的交互:viewed_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?属性仅描述了两种“兴趣点”中的哪一种是交互提要中的最后一次交互。

我曾尝试查看 Pandasapplygroupby方法,但无法提出生成所需重叠组的方法。

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

4

1 回答 1

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列是如何计算的。你能详细解释一下吗?

于 2014-01-08T12:47:33.740 回答