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])。这意味着该点被分类为大于左边界但不大于右边界的区间。可以使用参数 right
或 include_lowest
调整此行为(请参阅 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.cut.html )
我正在研究用户细分流程('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])。这意味着该点被分类为大于左边界但不大于右边界的区间。可以使用参数 right
或 include_lowest
调整此行为(请参阅 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.cut.html )