Coverage for jstark/features/cycles_since_last_purchase.py: 100%

17 statements  

« prev     ^ index     » next       coverage.py v7.4.3, created at 2024-02-25 20:09 +0000

1"""CyclesSinceLastPurchase feature""" 

2import pyspark.sql.functions as f 

3from pyspark.sql import Column 

4 

5from .feature import DerivedFeature 

6from .earliest_purchase_date import EarliestPurchaseDate 

7from .most_recent_purchase_date import MostRecentPurchaseDate 

8from .basket_count import BasketCount 

9 

10 

11class CyclesSinceLastPurchase(DerivedFeature): 

12 def column_expression(self) -> Column: 

13 return ( 

14 f.datediff( 

15 MostRecentPurchaseDate(self.as_at, self.feature_period).column, 

16 EarliestPurchaseDate(self.as_at, self.feature_period).column, 

17 ) 

18 ) / BasketCount(self.as_at, self.feature_period).column 

19 

20 @property 

21 def description_subject(self) -> str: 

22 return "Cycles since last purchase" 

23 

24 @property 

25 def commentary(self) -> str: 

26 return ( 

27 "Days since last purchase divided by average purchase cycle. " 

28 + "This may be a very good predictor of when a customer is " 

29 + "likely to next buy a particular product." 

30 ) 

31 

32 def default_value(self) -> Column: 

33 return f.lit(None)