【问题标题】:Aggregating overlapping "all-previous-events" features from time series data - in Python从时间序列数据中聚合重叠的“所有先前事件”特征 - 在 Python 中
【发布时间】:2014-01-26 00:09:01
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 我不清楚你想要的输出是如何产生的。 did_something 列是从该用户到该点的数据中 interaction 下的累积 did_somethings 数吗?另外,为什么viewed_banner 在所需输出中的第一行是 0?
  • 你能详细解释一下你是如何计算的吗?
  • 对不起。可以看到我遗漏了一些细节。我现在试图更详细地解释它。感谢您准确指出我错过了@TomAugspurger。

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


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

【讨论】:

  • 哇!相当复杂,但这是我正在寻找的非迭代解决方案。谢谢!
猜你喜欢
  • 2017-11-28
  • 1970-01-01
  • 2019-09-16
  • 2015-05-28
  • 2022-06-13
  • 2018-01-14
  • 2016-06-14
  • 1970-01-01
  • 2017-09-11
相关资源
最近更新 更多