Coverage for jstark / grocery / grocery_features.py: 100%

40 statements  

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

1from datetime import date 

2 

3from jstark.feature_generator import FeaturePeriodsType 

4from jstark.features.count import Count 

5from jstark.features.net_spend import NetSpend 

6from jstark.features.gross_spend import GrossSpend 

7from jstark.features.recency_days import RecencyDays 

8from jstark.grocery.basket_count import BasketCount 

9from jstark.grocery.store_count import StoreCount 

10from jstark.features.product_count import ProductCount 

11from jstark.features.approx_product_count import ApproxProductCount 

12from jstark.features.customer_count import CustomerCount 

13from jstark.grocery.channel_count import ChannelCount 

14from jstark.features.approx_customer_count import ApproxCustomerCount 

15from jstark.grocery.approx_basket_count import ApproxBasketCount 

16from jstark.features.discount import Discount 

17from jstark.features.min_gross_spend import MinGrossSpend 

18from jstark.features.max_gross_spend import MaxGrossSpend 

19from jstark.features.min_net_spend import MinNetSpend 

20from jstark.features.max_net_spend import MaxNetSpend 

21from jstark.grocery.average_gross_spend_per_basket import AvgGrossSpendPerBasket 

22from jstark.features.quantity import Quantity 

23from jstark.grocery.average_quantity_per_basket import AvgQuantityPerBasket 

24from jstark.features.most_recent_purchase_date import MostRecentPurchaseDate 

25from jstark.features.min_net_price import MinNetPrice 

26from jstark.features.max_net_price import MaxNetPrice 

27from jstark.features.min_gross_price import MinGrossPrice 

28from jstark.features.max_gross_price import MaxGrossPrice 

29from jstark.features.earliest_purchase_date import EarliestPurchaseDate 

30from jstark.grocery.average_discount_per_basket import AvgDiscountPerBasket 

31from jstark.grocery.average_purchase_cycle import AvgPurchaseCycle 

32from jstark.grocery.cycles_since_last_purchase import CyclesSinceLastPurchase 

33from jstark.grocery.basket_periods import BasketPeriods 

34from jstark.grocery.recency_weighted_basket import ( 

35 RecencyWeightedBasket99, 

36 RecencyWeightedBasket90, 

37 RecencyWeightedBasket95, 

38 RecencyWeightedApproxBasket90, 

39 RecencyWeightedApproxBasket95, 

40 RecencyWeightedApproxBasket99, 

41) 

42from jstark.grocery.average_basket import AvgBasket 

43from jstark.features.feature import Feature 

44from jstark.feature_generator import FeatureGenerator 

45 

46 

47class GroceryFeatures(FeatureGenerator): 

48 def __init__( 

49 self, 

50 as_at: date | None = None, 

51 feature_periods: FeaturePeriodsType = None, 

52 feature_stems: set[str] | list[str] | None = None, 

53 first_day_of_week: str | None = None, 

54 use_absolute_periods: bool = False, 

55 ) -> None: 

56 super().__init__( 

57 as_at, 

58 feature_periods, 

59 feature_stems, 

60 first_day_of_week, 

61 use_absolute_periods, 

62 ) 

63 

64 FEATURE_CLASSES: set[type[Feature]] = { 

65 Count, 

66 NetSpend, 

67 GrossSpend, 

68 RecencyDays, 

69 BasketCount, 

70 StoreCount, 

71 ProductCount, 

72 CustomerCount, 

73 ChannelCount, 

74 ApproxBasketCount, 

75 ApproxProductCount, 

76 ApproxCustomerCount, 

77 Discount, 

78 MinGrossSpend, 

79 MaxGrossSpend, 

80 MinNetSpend, 

81 MaxNetSpend, 

82 AvgGrossSpendPerBasket, 

83 Quantity, 

84 AvgQuantityPerBasket, 

85 MostRecentPurchaseDate, 

86 MinNetPrice, 

87 MaxNetPrice, 

88 MinGrossPrice, 

89 MaxGrossPrice, 

90 EarliestPurchaseDate, 

91 AvgDiscountPerBasket, 

92 AvgPurchaseCycle, 

93 CyclesSinceLastPurchase, 

94 BasketPeriods, 

95 RecencyWeightedBasket95, 

96 RecencyWeightedBasket90, 

97 RecencyWeightedBasket99, 

98 RecencyWeightedApproxBasket95, 

99 RecencyWeightedApproxBasket90, 

100 RecencyWeightedApproxBasket99, 

101 AvgBasket, 

102 }