python 中基于参数的动态 If-else

Dynamic If-else in python based on parameters

我正在研究用户细分流程('RFM' 细分),其中根据用户所在的 'buckets' 对用户进行分类。

举个简单的例子,根据用户的 activity 和购买(他们的 RFM 分数),用户可能在 'champions' 或 'cannot lose' 桶内。

这都是使用此处解释的算法计算得出的:https://towardsdatascience.com/recency-frequency-monetary-model-with-python-and-how-sephora-uses-it-to-optimize-their-google-d6a0707c5f17

最后是按照这个例子计算的:

if RFM_Score >= 9:
    return "Cannot lose them"
elif ((RFM_Score >= 8) and (RFM_Score < 9)):
    return "Winners"

现在,我想为用户提供配置存储桶边界(和名称)的可能性。

是否可以构建一个可以通过参数配置的动态if-else结构?

我想到了某种字典,像这样:

#The first value in the tuple is the lowerbound, the second value is the upperbound.
params={'cannot lose':(9,), 'winners':(8, 9), [...] 'promising':(4, 5)}
def find_class(value):
    for classname, boundaries in params:
         if value >= boundaries[0]:
             if len(boundaries) == 1:
                 return classname
             elif value < boundaries[1]:
                 return classname

但是,我担心这会使算法变得更加复杂(假设我们 运行 这可能涉及数千万个条目),而我认为简单的 if/else 由于 python 解释器的实现方式,将是最快的。

我想了解一下:(1) dict 方法是否可以接受?哪些是可能的经济衰退; (2) 是不是慢了很多?

你应该看看 pandas.cut,它可以将值划分到桶中并相应地标记它们:

import pandas as pd
values = [8,10,6,4,4,1]
labels = pd.cut(values,  bins = [0,4,5,8,10], 
                labels = ["not so promising", "promising", "winners", "cannot lose them"])

我认为这是非常优化的,并且可能至少不会比基于 foor 循环和 if else 语句的自我实现版本差很多。

默认情况下,区间是右闭区间,所以在上面的例子中它应该是 ((0,4], (4,5], (5, 8], (8, 10])。这意味着该点被分类为大于左边界但不大于右边界的区间。可以使用参数 rightinclude_lowest 调整此行为(请参阅 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.cut.html )