我的问题很普遍,很可能在很多方面解决。但考虑到时间和记忆,什么是聪明的方式?
我有以下表格的用户互动的时间序列数据:
cookie_id interaction
--------- -----------
1234 did_something
1234 viewed_banner*
1234 did_something
1234 did_something
1234 viewed_and_clicked_banner*
... ...
我希望它能够训练模型,预测每当显示横幅时用户是否会点击横幅(即用*标记的交互)。为此,我需要在Feed中显示兴趣点(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_something
和viewed_banner
中的数字是这些交互的计数(不包括兴趣点),但也可以执行其他类型的聚合。 clicked?
属性只描述了两种“兴趣点”中的哪一种是交互Feed中的最后一次互动。
我试图查看Pandas apply
和groupby
方法,但无法想出能够生成所需重叠组的内容。
另一种方法是使用一些for循环,但如果有一种简单有效的方法来解决问题,我宁愿不这样做。
答案 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
列。你能详细解释一下吗?