def obtain_history_decay_factor(self, product_id): """ Produces a history decay factor according to some mathematical function of the number of previous recommendations of a certain product to a certain user. :param product_id: The id of the product. """ if self.history_decay_function_name is None: return 1 if self.user_impressions_summary is not None: latest_impressions_count = self.user_impressions_summary.get(product_id, (0, None))[0] else: latest_impressions_count = 0 result = 1 if self.history_decay_function_name == "linear": ttl = self.history_decay_linear_function_ttl result = df.linear(latest_impressions_count, ttl) elif self.history_decay_function_name == "rational": result = df.rational(latest_impressions_count) elif self.history_decay_function_name == "exponential": halflife = self.history_decay_exponential_function_halflife result = df.exponential(latest_impressions_count, halflife) elif self.history_decay_function_name == "step": ttl = self.history_decay_step_function_ttl result = df.step(latest_impressions_count, 1, -1, ttl) return result
def obtain_product_age_decay_factor(self, product_date, present_date): """ Produces an age decay factor according to some mathematical function of the number of units of time (days, weeks) since the product was added to the system. :param product_date: The date of the product. :param present_date: The current date. """ if self.product_age_decay_function_name is None: return 1 product_age_in_days = None if product_date is not None: try: utc_product_date = pytz.utc.localize(product_date) except Exception: utc_product_date = product_date product_age = present_date - utc_product_date product_age_in_days = product_age.days result = 1 if self.product_age_decay_function_name == "linear": ttl = self.product_age_decay_linear_function_ttl result = df.linear(product_age_in_days, ttl) elif self.product_age_decay_function_name == "rational": result = df.rational(product_age_in_days) elif self.product_age_decay_function_name == "exponential": halflife = self.product_age_decay_exponential_function_halflife result = df.exponential(product_age_in_days, halflife) elif self.product_age_decay_function_name == "step": ttl = self.product_age_decay_step_function_ttl result = df.step(product_age_in_days, 1, -1, ttl) return result