基于参数的Python动态If-else函数

问题描述 投票:0回答:1

我正在进行一个用户细分的过程('RFM'细分),根据用户所处的 "桶 "进行分类。

举个简单的例子,根据用户的活跃度和购买量(他们的RFM得分),用户可能在 "冠军 "或 "不能失去 "桶内。

这些都是通过这里解释的算法计算出来的。https:/towardsdatascience.comrecency-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

但我担心这会使算法变得更复杂 (想象一下我们要在数千万个条目上运行) 而我认为简单的ifelse会最快 因为python解释器的实现方式

我想请教一下。(1) dict的方法是否可以接受?哪些是可能的缺点;(2)是否会慢很多?

python analytics
1个回答
1
投票

你应该看看 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.orgpandas-docsstablereferenceapipandas.cut.html。)

© www.soinside.com 2019 - 2024. All rights reserved.