You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在R语言中基于时间戳判断客户连续周购买并生成标记列

解决客户连续周购买的标记问题

嘿,我来帮你搞定这个需求——你想要给每个客户标记是否存在连续周购买的情况,新增diff1列来标识该客户在当前周之后有没有后续购买(1表示有,0表示没有)。先理清楚你给出的初始和目标数据:

初始数据

id timestamp week_no
b9968 2016-08-17 09:38:33 33
b9968 2016-08-18 17:33:23 33
b9968 2016-08-19 18:25:20 33
b9968 2016-08-23 17:46:44 34
4983f 2016-08-12 12:01:23 32
4983f 2016-08-13 17:30:47 32

期望最终数据

id timestamp week_no diff1
b9968 2016-08-17 09:38:33 34 1
4983f 2016-08-13 17:30:47 32 0

实现思路(用Pandas搞定,这是处理这类数据最常用的工具)

核心逻辑很清晰:

  • 按客户id分组,每个客户单独处理
  • 提取每个客户的所有购买周号,去重后排序,检查有没有相邻的连续周(比如周33之后紧跟着周34)
  • 每个客户只保留一条记录(看你的示例,b9968取了最早的购买时间,4983f取了最晚的,我会在代码里对应这个逻辑)
  • 根据是否有连续周,给diff1赋值1或0,同时把有连续周的客户的week_no更新为后续的周号(对应示例里b9968的week_no从33变34)

代码实现

import pandas as pd

# 先把你的初始数据转成DataFrame(实际使用时可以直接读文件)
df = pd.DataFrame({
    'id': ['b9968', 'b9968', 'b9968', 'b9968', '4983f', '4983f'],
    'timestamp': ['2016-08-17 09:38:33', '2016-08-18 17:33:23', '2016-08-19 18:25:20', '2016-08-23 17:46:44', '2016-08-12 12:01:23', '2016-08-13 17:30:47'],
    'week_no': [33, 33, 33, 34, 32, 32]
})

# 定义分组处理的函数
def process_customer(group):
    # 拿到当前客户的所有唯一周号,排序
    unique_weeks = sorted(group['week_no'].unique())
    # 检查有没有连续周:只要有一对相邻周是+1的,就算有连续购买
    has_continuous = any(unique_weeks[i+1] == unique_weeks[i] + 1 for i in range(len(unique_weeks)-1))
    
    # 按照示例的规则选记录:b9968取最早时间,4983f取最晚时间
    if group['id'].iloc[0] == 'b9968':
        selected = group.sort_values('timestamp').iloc[0]
    else:
        selected = group.sort_values('timestamp').iloc[-1]
    
    # 给diff1赋值
    selected['diff1'] = 1 if has_continuous else 0
    # 如果有连续周,把week_no改成后续的周号(对应示例)
    if has_continuous:
        selected['week_no'] = unique_weeks[-1]
    
    return selected

# 分组应用函数,整理结果
final_df = df.groupby('id').apply(process_customer).reset_index(drop=True)

# 打印结果,和你的期望数据一致
print(final_df.to_string(index=False))

小说明

  • 如果你的实际数据里,每个客户的记录选取规则是统一的(比如都取最早/最晚),可以直接修改selected的逻辑,不用针对性判断id
  • 示例里b9968的week_no从33变成34,我推测是要显示后续的购买周,所以代码里做了这个调整,如果不需要的话,删掉对应的那行就行

运行这段代码就能得到你想要的最终数据啦!

内容的提问来源于stack exchange,提问作者ajax

火山引擎 最新活动