Coverage for jstark / mealkit / cycles_since_last_order.py: 100%

16 statements  

« prev     ^ index     » next       coverage.py v7.13.4, created at 2026-03-23 22:34 +0000

1"""CyclesSinceLastPurchase feature""" 

2 

3import pyspark.sql.functions as f 

4from pyspark.sql import Column 

5 

6from jstark.features.feature import DerivedFeature 

7from .average_purchase_cycle import AvgPurchaseCycle 

8from jstark.features.recency_days import RecencyDays 

9 

10 

11class CyclesSinceLastOrder(DerivedFeature): 

12 def column_expression(self) -> Column: 

13 return f.try_divide( 

14 RecencyDays( 

15 self.as_at, 

16 self.feature_period, 

17 first_day_of_week=self._first_day_of_week, 

18 ).column, 

19 AvgPurchaseCycle( 

20 self.as_at, 

21 self.feature_period, 

22 first_day_of_week=self._first_day_of_week, 

23 ).column, 

24 ) 

25 

26 @property 

27 def description_subject(self) -> str: 

28 return "Cycles since last order" 

29 

30 @property 

31 def commentary(self) -> str: 

32 return ( 

33 "Days since last order divided by average purchase cycle. " 

34 + "This may be a predictor of when a customer is " 

35 + "likely to next order something." 

36 ) 

37 

38 def default_value(self) -> Column: 

39 return f.lit(None)