pyspark 如何计算事务处理是否落在没有循环的特定期间内

c2e8gylq  于 2022-11-01  发布在  Spark
关注(0)|答案(1)|浏览(120)

我有一个Pyspark数据框架,其中包含按客户划分的事务,并将其输入到 Jmeter 板中。对于每个滚动的12个月时间段,我希望计算客户是否为“新”客户(从未购买),“保留”(在当前时间段开始前的12个月内购买了**,并且在当前时间段内购买了**),或“已重新激活”(在之前在过去12个月内购买,在过去12个月内未购买,在当月购买)。

**对“当前时间段”的澄清:**如果当前时间段是截至2022年9月底的滚动12个月,则2021年10月至2022年9月的任何购买福尔斯“当前”时间段。2020年10月至2021年9月的购买属于“前12个月”,而2020年9月及之前的购买属于"前12个月“。

输入:
| 客户标识|事务标识|事务处理日期|
| - -|- -|- -|
| 一个|一个|2019年1月10日|
| 一个|2个|2019年12月15日|
| 一个|三个|2022年9月7日|
中级:
| 客户标识|事务处理标识|事务处理日期|周期|事务处理_当前|事务处理编号_前_12m|事务处理_前一个_前一个_12m|
| - -|- -|- -|- -|- -|- -|- -|
| 一个|一个|2019年1月10日|2022年9月|第0页|第0页|一个|
| 一个|2个|2019年12月15日|2022年9月|第0页|第0页|一个|
| 一个|三个|2022年9月7日|2022年9月|一个|第0页|第0页|
最后:
| 客户标识|事务处理_周期|事务处理_当前|事务处理编号_前_12m|事务处理_前一个_前一个_12m|状态|
| - -|- -|- -|- -|- -|- -|
| 一个|2022年9月|一个|第0页|2个|已重新激活|
我目前的解决方案在每个要求的评估期(2022年1月、2022年2月、2022年3月等)进行循环,对该期的客户状态进行分类。然而,这一步需要花费数小时来处理,因为它必须在数百万行的 Dataframe 上循环几十个不同的时间段。
我觉得我遗漏了一些明显的东西,但是如果不循环遍历每个时间段并检查每个单独的事务是否福尔斯在该时间段的范围内,我如何计算呢?

ktecyv1j

ktecyv1j1#

您可以使用Lag函数来提取用户的上一个订单,然后计算date和previous_date的日期差。

from pyspark.sql import functions as F
from pyspark.sql import Window as W

window = W.partitionBy('customer_id').orderBy('transaction_date')

(
    df
    .withColumn('prev_order_date', F.lag('transaction_date').over(window))
    .withColumn('datediff', F.datediff(F.col('transaction_date'), F.col('prev_order_date')))
).show()

相关问题