0

我正在使用生命周期库来构建客户生命周期价值模型。该库附带一个名为的方法,该方法conditional_expected_number_of_purchases_up_to_time允许您预测数据集中每个客户在指定时间段内的购买情况。

这是我正在使用的数据框:

df = pd.DataFrame([[aaa@email.com, 6.0, 112.0, 139.0], [bbb@email.com, 11.0, 130.0, 130.0]], columns=['email', 'frequency', 'recency', 'T'])

数据框中的每一行代表一个单独的客户。为了预测每个客户在接下来的 4 个时期内的预期购买次数,我将执行以下代码:

t = 4
df['est_purchases'] = mbgf.conditional_expected_number_of_purchases_up_to_time(t, df['frequency'], df['recency'], df['T'])

我现在想要做的是,对于数据框中的每一行,在他们的余生中估计剩余购买的总数。我们将此数量称为剩余客户购买量 (RCP)。

为此,我定义了两个函数:第一个函数计算两个时间段之间的 RCP 增量,第二个函数通过递增来近似总 RCP,t直到增量 RCP 低于特定容差水平:

## Function to calculate incremental RCP
    def RCP(row):
        dif = (mbgf.conditional_expected_number_of_purchases_up_to_time(t, 
              row['frequency'], row['recency'], row['T'])
            - mbgf.conditional_expected_number_of_purchases_up_to_time((t-1), 
              row['frequency'], row['recency'], row['T']))
        return dif
    
## Create column for incremental RCP
    df['m_RCP'] = df.apply(RCP, axis = 1)

   ## Function to approximate total RCP 
    def approximate(fn, model, rfm, t=1, eps_tol=1e-6, eps=0, **kwargs):
        eps = 0
        cf = 0
        while True:
            cf += df.apply(fn, axis = 1)
            if(cf - eps < eps_tol):
                break
            eps = cf; t+=1
       return cf
    
## Create column for total RCP
    df['t_RCP'] = df.apply(approximate(RCP, model = mbgf, rfm = df), axis = 1)

第一个功能按预期工作。但是当我尝试执行第二个函数(approximate)时,我收到了这个错误:

ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

我希望近似函数迭代单行的 RCP 函数,直到 RCP 值不再增加,并对数据帧中的每一行逐一执行此操作。

我做错了什么,我应该怎么做?

4

1 回答 1

1

您正在调用df.apply(fn, axis=1)返回您分配给的系列cf。然后您将该系列cf - eps与一个常量进行比较,该常量返回一个布尔数组。布尔数组在条件表达式中使用不明确,这是导致错误的原因。

我要做的是定义一个函数,该函数iterated_RCP(row)将数据帧的一行作为输入,并在该行上迭代 RCP 直到它收敛。然后你可以做类似的事情df.assign(t_RCP=df.apply(iterated_RCP, axis=1))

于 2021-11-29T01:08:21.457 回答