Coverage for jstark / mealkit / cuisine_count.py: 100%
208 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"""CuisineCount feature"""
3import pyspark.sql.functions as f
4from pyspark.sql import Column
6from jstark.features.distinctcount_feature import DistinctCount
7from jstark.features.count_if import CountIf
10class CuisineCount(DistinctCount):
11 def column_expression(self) -> Column:
12 return f.col("Cuisine")
14 @property
15 def description_subject(self) -> str:
16 return "Distinct count of Cuisines"
18 @property
19 def commentary(self) -> str:
20 return (
21 "The number of cuisines. Typically the dataframe supplied "
22 + "to this feature will have many recipes for the same cuisine, "
23 + "this feature allows you to determine how many distinct cuisines "
24 + "have been ordered."
25 )
28class CuisineCountIf(CountIf):
29 CUISINE_NAME: str = ""
31 def column_expression(self) -> Column:
32 # Compare lowercase cuisine to class's CUISINE_NAME (also lowercase)
33 return f.lower(f.col("Cuisine")) == self.CUISINE_NAME.lower()
35 @property
36 def description_subject(self) -> str:
37 return f"Count of {self.CUISINE_NAME.capitalize()} recipes"
39 @property
40 def commentary(self) -> str:
41 name = self.CUISINE_NAME.capitalize()
42 return (
43 f"The number of {name} recipes. Typically the "
44 + "dataframe supplied to this feature will have "
45 + "many recipes for the same cuisine, this feature "
46 + f"allows you to determine how many {name} "
47 + "recipes have been ordered."
48 )
51# This list of classes was based upon all the observed cuisines in
52# all recipes from a well-known mealkit provider in 2025
53class ItalianCuisineCount(CuisineCountIf):
54 CUISINE_NAME = "italian"
57class FrenchCuisineCount(CuisineCountIf):
58 CUISINE_NAME = "french"
61class SpanishCuisineCount(CuisineCountIf):
62 CUISINE_NAME = "spanish"
65class SrilankanCuisineCount(CuisineCountIf):
66 CUISINE_NAME = "srilankan"
69class LebaneseCuisineCount(CuisineCountIf):
70 CUISINE_NAME = "lebanese"
73class GreekCuisineCount(CuisineCountIf):
74 CUISINE_NAME = "greek"
77class VietnameseCuisineCount(CuisineCountIf):
78 CUISINE_NAME = "vietnamese"
81class DanishCuisineCount(CuisineCountIf):
82 CUISINE_NAME = "danish"
85class WesternEuropeCuisineCount(CuisineCountIf):
86 CUISINE_NAME = "westerneurope"
89class FusionCuisineCount(CuisineCountIf):
90 CUISINE_NAME = "fusion"
93class DutchCuisineCount(CuisineCountIf):
94 CUISINE_NAME = "dutch"
97class KoreanCuisineCount(CuisineCountIf):
98 CUISINE_NAME = "korean"
101class SouthEastAsianCuisineCount(CuisineCountIf):
102 CUISINE_NAME = "southeast-asian"
105class MalaysianCuisineCount(CuisineCountIf):
106 CUISINE_NAME = "malay"
109class AmericanCuisineCount(CuisineCountIf):
110 CUISINE_NAME = "american"
113class AsianCuisineCount(CuisineCountIf):
114 CUISINE_NAME = "asian"
117class IndianCuisineCount(CuisineCountIf):
118 CUISINE_NAME = "indian"
121class GermanCuisineCount(CuisineCountIf):
122 CUISINE_NAME = "german"
125class CentralAmericaCuisineCount(CuisineCountIf):
126 CUISINE_NAME = "central america"
129class ArgentinianCuisineCount(CuisineCountIf):
130 CUISINE_NAME = "argentinian"
133class NorthAmericanCuisineCount(CuisineCountIf):
134 CUISINE_NAME = "north american"
137class NewZealandCuisineCount(CuisineCountIf):
138 CUISINE_NAME = "new zealand"
141class CanadianCuisineCount(CuisineCountIf):
142 CUISINE_NAME = "canadian"
145class SwedishCuisineCount(CuisineCountIf):
146 CUISINE_NAME = "swedish"
149class EgyptianCuisineCount(CuisineCountIf):
150 CUISINE_NAME = "egyptian"
153class NorthernEuropeanCuisineCount(CuisineCountIf):
154 CUISINE_NAME = "northern europe"
157class CajunCuisineCount(CuisineCountIf):
158 CUISINE_NAME = "cajun"
161class AustrianCuisineCount(CuisineCountIf):
162 CUISINE_NAME = "austrian"
165class MexicanCuisineCount(CuisineCountIf):
166 CUISINE_NAME = "mexican"
169class MediterraneanCuisineCount(CuisineCountIf):
170 CUISINE_NAME = "mediterranean"
173class ThaiCuisineCount(CuisineCountIf):
174 CUISINE_NAME = "thai"
177class ChineseCuisineCount(CuisineCountIf):
178 CUISINE_NAME = "chinese"
181class LatinAmericanCuisineCount(CuisineCountIf):
182 CUISINE_NAME = "latin american"
185class SouthAsiaCuisineCount(CuisineCountIf):
186 CUISINE_NAME = "south asia"
189class MiddleEasternCuisineCount(CuisineCountIf):
190 CUISINE_NAME = "middleeastern"
193class TraditionalCuisineCount(CuisineCountIf):
194 CUISINE_NAME = "traditional"
197class SteakhouseCuisineCount(CuisineCountIf):
198 CUISINE_NAME = "steakhouse"
201class PacificislandsCuisineCount(CuisineCountIf):
202 CUISINE_NAME = "pacificislands"
205class EastAsiaCuisineCount(CuisineCountIf):
206 CUISINE_NAME = "east asia"
209class BritishCuisineCount(CuisineCountIf):
210 CUISINE_NAME = "british"
213class CaribbeanCuisineCount(CuisineCountIf):
214 CUISINE_NAME = "caribbean"
217class FilipinoCuisineCount(CuisineCountIf):
218 CUISINE_NAME = "filipino"
221class TurkishCuisineCount(CuisineCountIf):
222 CUISINE_NAME = "turkish"
225class BelgianCuisineCount(CuisineCountIf):
226 CUISINE_NAME = "belgian"
229class SouthAmericanCuisineCount(CuisineCountIf):
230 CUISINE_NAME = "south american"
233class NorthAfricanCuisineCount(CuisineCountIf):
234 CUISINE_NAME = "north african"
237class SouthAfricanCuisineCount(CuisineCountIf):
238 CUISINE_NAME = "south african"
241class WestAfricanCuisineCount(CuisineCountIf):
242 CUISINE_NAME = "west african"
245class EastAfricanCuisineCount(CuisineCountIf):
246 CUISINE_NAME = "east african"
249class WesternEuropeanCuisineCount(CuisineCountIf):
250 CUISINE_NAME = "western-european"
253class PortugueseCuisineCount(CuisineCountIf):
254 CUISINE_NAME = "portuguese"
257class PeruvianCuisineCount(CuisineCountIf):
258 CUISINE_NAME = "peruvian"
261class JapaneseCuisineCount(CuisineCountIf):
262 CUISINE_NAME = "japanese"
265class PacificIslandsCuisineCount(CuisineCountIf):
266 CUISINE_NAME = "pacific-islands"
269class SouthernEuropeCuisineCount(CuisineCountIf):
270 CUISINE_NAME = "southern europe"
273class AfricanCuisineCount(CuisineCountIf):
274 CUISINE_NAME = "african"
277class CentralAsiaCuisineCount(CuisineCountIf):
278 CUISINE_NAME = "centralasia"
281class NorthamericaCuisineCount(CuisineCountIf):
282 CUISINE_NAME = "northamerica"
285class EuropeanCuisineCount(CuisineCountIf):
286 CUISINE_NAME = "european"
289class MoroccanCuisineCount(CuisineCountIf):
290 CUISINE_NAME = "moroccan"
293class AustralianCuisineCount(CuisineCountIf):
294 CUISINE_NAME = "australian"
297class HungarianCuisineCount(CuisineCountIf):
298 CUISINE_NAME = "hungarian"
301class IranianCuisineCount(CuisineCountIf):
302 CUISINE_NAME = "iranian"
305class SoutheastAsiaCuisineCount(CuisineCountIf):
306 CUISINE_NAME = "southeast asia"
309class HawaiianCuisineCount(CuisineCountIf):
310 CUISINE_NAME = "hawaiian"
313class ScandinavianCuisineCount(CuisineCountIf):
314 CUISINE_NAME = "scandinavian"
317class BrazilianCuisineCount(CuisineCountIf):
318 CUISINE_NAME = "brazilian"
321class IndonesianCuisineCount(CuisineCountIf):
322 CUISINE_NAME = "indonesian"
325class MongolianCuisineCount(CuisineCountIf):
326 CUISINE_NAME = "mongolian"
329class RussianCuisineCount(CuisineCountIf):
330 CUISINE_NAME = "russian"
333class SouthAsianCuisineCount(CuisineCountIf):
334 CUISINE_NAME = "south-asian"
337class BulgarianCuisineCount(CuisineCountIf):
338 CUISINE_NAME = "bulgarian"
341class FusionCuisineCusiineCount(CuisineCountIf):
342 CUISINE_NAME = "fusion-cuisine"
345class IrishCuisineCount(CuisineCountIf):
346 CUISINE_NAME = "irish"
349class GeorgianCuisineCount(CuisineCountIf):
350 CUISINE_NAME = "georgian"
353class SouthwestCuisineCount(CuisineCountIf):
354 CUISINE_NAME = "southwest"
357class CambodianCuisineCount(CuisineCountIf):
358 CUISINE_NAME = "cambodian"
361class LatinCuisineCount(CuisineCountIf):
362 CUISINE_NAME = "latin"
365class CubanCuisineCount(CuisineCountIf):
366 CUISINE_NAME = "cuban"
369class SoutheastCuisineCount(CuisineCountIf):
370 CUISINE_NAME = "southeast"
373class SouthHyphenAfricanCuisineCount(CuisineCountIf):
374 CUISINE_NAME = "south-african"
377class JamaicanCuisineCount(CuisineCountIf):
378 CUISINE_NAME = "jamaican"
381class IsrealiCuisineCount(CuisineCountIf):
382 CUISINE_NAME = "israeli"
385class EasteuropeanCuisineCount(CuisineCountIf):
386 CUISINE_NAME = "easteuropean"
389class SingaporeanCuisineCount(CuisineCountIf):
390 CUISINE_NAME = "singaporean"
393class NordicCuisineCount(CuisineCountIf):
394 CUISINE_NAME = "nordic"
397class WestHyphenAfricanCuisineCount(CuisineCountIf):
398 CUISINE_NAME = "west-african"
401class NortheastCuisineCount(CuisineCountIf):
402 CUISINE_NAME = "northeast"
405class TonganCuisineCount(CuisineCountIf):
406 CUISINE_NAME = "tongan"
409class WestafricaCuisineCount(CuisineCountIf):
410 CUISINE_NAME = "westafrica"
413class ZanzibarianCuisineCount(CuisineCountIf):
414 CUISINE_NAME = "zanzibarian"
417class MidwestCuisineCount(CuisineCountIf):
418 CUISINE_NAME = "midwest"