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
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-23 22:34 +0000
1"""CyclesSinceLastPurchase feature"""
3import pyspark.sql.functions as f
4from pyspark.sql import Column
6from jstark.features.feature import DerivedFeature
7from .average_purchase_cycle import AvgPurchaseCycle
8from jstark.features.recency_days import RecencyDays
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 )
26 @property
27 def description_subject(self) -> str:
28 return "Cycles since last order"
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 )
38 def default_value(self) -> Column:
39 return f.lit(None)