Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中基于参数的动态If-else_Python_Analytics - Fatal编程技术网

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

python中基于参数的动态If-else,python,analytics,Python,Analytics,我在一个用户细分过程(“RFM”细分)中工作,根据用户所在的“桶”对用户进行分类 举个简单的例子,根据用户的活动和购买情况(他们的RFM分数),用户可能在“冠军”或“不能输”的范围内 所有这些都是使用一个算法计算的,该算法在这里解释: 最后,按本例计算: if RFM_Score >= 9: return "Cannot lose them" elif ((RFM_Score >= 8) and (RFM_Score < 9)): return "Winners

我在一个用户细分过程(“RFM”细分)中工作,根据用户所在的“桶”对用户进行分类

举个简单的例子,根据用户的活动和购买情况(他们的RFM分数),用户可能在“冠军”或“不能输”的范围内

所有这些都是使用一个算法计算的,该算法在这里解释:

最后,按本例计算:

if RFM_Score >= 9:
    return "Cannot lose them"
elif ((RFM_Score >= 8) and (RFM_Score < 9)):
    return "Winners"
如果RFM\U得分>=9:
return“不能丢失它们”
elif((RFM_分数>=8)和(RFM_分数<9)):
返回“赢家”
现在,我想让用户能够配置存储桶的边界(和名称)

是否可以构建可通过参数配置的动态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
元组中的第一个值是下界,第二个值是上界。 params={'cannotlose':(9,),'winners':(8,9),[…]“providing':(4,5)} def find_类(值): 对于classname,参数中的边界: 如果值>=边界[0]: 如果len(边界)==1: 返回类名 elif值<边界[1]: 返回类名 然而,我感到震惊的是,这将使算法变得更加复杂(想象一下,我们正在对可能数以千万计的条目运行该算法),而我认为由于python解释器的实现方式,简单的if/else将是最快的


我想了解一下:(1)dict方法可以接受吗?哪些是可能的衰退;(2) 速度慢得多吗?

你应该看看熊猫。剪切可以将值划分为多个桶,并相应地标记它们:

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
进行调整(请参阅)

这是一个好主意。我会测试它,看看它是否有效。然后我会发布我的反馈。我刚刚测试过。它非常简单,并且利用了熊猫优化的计算。但是,我似乎无法轻松想象垃圾箱是如何制作的(哪个“类”在哪个范围内)。你能在回答中更好地解释一下吗?