13

我编写了一个简单的脚本来根据每用户平均收入 (ARPU)、利润和客户保持客户的年数 (ltvYears) 来模拟客户生命周期价值 (LTV)。下面是我的脚本。它在“ltvYears = ltvYears + [ltv_loop]”这一行引发错误。错误消息是“TypeError: can only concatenate tuple (not "list") to tuple”。有人可以告诉我是什么原因造成的吗?我怀疑问题可能源于“ltvYears = ('f',[])”,我在其中添加了类型代码以消除另一个错误(将 float 乘以 int)。

我是 Python 新手,所以这段代码很可能是初学者的错误。

lowYears = 0
highYears = 20
modeYears = 3
ARPU = 65.0*12.0
MARGIN = .30
ltvYears = ('f',[])
ltv = []

def ltv(arpu, years, margin):
    return arpu * years * margin

N = 10000    
for n in range(N):
    #estimate LTV
    ltv_loop = random.triangular(lowYears, highYears, modeYears) 
    ltvYears = ltvYears + [ltv_loop]
    ltv = ltv + [ltv(ARPU, ltvYears, MARGIN)]

show = 0

if (show==1):
    #plot ltv histogram
    plt.hist(ltv,bins=10)
    plt.title("LTV Probability Density")
    plt.xlabel("")
    plt.ylabel("$")
    plt.show()

编辑 - 这是我的变量的屏幕截图。 在此处输入图像描述

EDIT2 ---我在下面的帮助下找到了解决方案。总共有三个问题:

  1. 我错误地将相同的名称分配给变量和函数(+1 @autopopulated 指出这一点)
  2. 这条线是多余的“ltvYears = ltvYears + [ltv_loop]”
  3. 此行应该使用“ltv_loop”作为第二个参数“ltv = ltv + [calculateltv(ARPU, ltv_loop, MARGIN)]”

+1 @DonCallisto 和 @RikPoggi 对项目 2 和 3 的帮助

4

5 回答 5

11

ltvYears是一个元组,它被定义为

ltvYears = ('f',[])

所以当谈到这一行时:

ltvYears = ltvYears + [ltv_loop]

Python不知道该怎么做,因为您的错误清楚地表明:

“TypeError:只能将元组(不是“列表”)连接到元组”

不清楚该行的行为应该是什么,因此很难提出解决方案。

也许您只需要将 ltvYears 定义为 alist并调用该.append方法。


编辑

OP在这里说:

ltvYears = ('f',[])我添加了'f'以指示该数组将包含浮点数。在我这样做之前,我遇到了一个关于将浮点数和整数相乘的错误。

你不需要这样做。Python 不是 C。

做就是了:

ltvYears = []

然后:

ltvYears.append(ltv_loop)
于 2012-05-08T21:42:07.407 回答
6

如果 ltvYears 是一个元组,那么你可以像这样连接:

ltvYears += (ltv_loop,)
于 2012-05-08T21:48:47.220 回答
2

从你的代码

ltvYears = ltvYears + [ltv_loop]

ltvYears是一个元组,这就是你得到那个错误的原因。

那是因为您不能将 a 附加list到元组。也许您必须更改ltvYears使其成为列表的类型

于 2012-05-08T21:40:00.640 回答
2

(这与您要询问的问题不同,请参阅@Rik 的回答,但您也遇到了这个问题)

您已经定义了一个与变量同名的函数:

...
ltv = []

def ltv(arpu, years, margin):
    return arpu * years * margin
...

这将用函数对象替换您的列表变量,当然您不能附加到该函数对象,因此该行将失败:ltv = ltv + [ltv(ARPU, ltvYears, MARGIN)]

于 2012-05-08T21:42:40.930 回答
0

它实际上就像错误消息所述的那样简单:不允许连接列表和元组。

ltvYears是一个元组。[ltv_loop]是一个列表。

于 2012-05-08T21:41:40.937 回答