分位数熊猫

问题描述

什么不起作用:

def ATVscore(x,p,d):
    if x <= d[p][0.25]:
        return 4
    elif x <= d[p][0.50]:
        return 3
    elif x <= d[p][0.75]: 
        return 2
    else:
        return 1



df_segmented['atv_quartile'] = df_segmented['Average_Transaction_Value'].apply(ATVscore,args = ('Average_Transaction_Value',quantiles,))

工作原理:

分位数:

quantiles = df_final_table.quantile(q=[0.25,0.5,0.75])

quantiles = quantiles.to_dict()

def Rscore(x,d):
    if x <= d[p][0.25]:
        return 1
    elif x <= d[p][0.50]:
        return 2
    elif x <= d[p][0.75]: 
        return 3
    else:
        return 4
    
def FMscore(x,d):
    if x <= d[p][0.25]:
        return 4
    elif x <= d[p][0.50]:
        return 3
    elif x <= d[p][0.75]: 
        return 2
    else:
        return 1

df_segmented['recency_quartile'] = df_segmented['recency'].apply(Rscore,args = ('recency',))
df_segmented['frequency_quartile'] = df_segmented['frequency'].apply(FMscore,args = ('frequency',))
df_segmented['monetary_quartile'] = df_segmented['monetary'].apply(FMscore,args = ('monetary',))

数据:

Data

错误

Error

解决方法

代码问题最有可能是分位数的内容。

创建此变量后,打印其内容。 可能包含以下内容:

{'recency':   {0.25: 350.0,0.5: 500.0,0.75: 600.0},'frequency': {0.25: 370.0,0.5: 520.0,0.75: 620.0},'monetary':  {0.25: 390.0,0.5: 540.0,0.75: 640.0}}

(作为每个嵌入式词典的值,我传递了任意值)。

现在,当您应用 ATVScore 且其余参数为 'Average_Transaction_Value'作为 p 分位数作为 d ,此函数:

  • 试图执行if x <= d[p][0.25]:(几乎在您的末尾 StackTrace),
  • 执行d[p]会尝试找到'Average_Transaction_Value' 输入分位数
  • 由于分位数不包含此密钥,因此会出现 KeyError 异常 被抛出。

'Average_Transaction_Value'键添加到分位数,其值为 类似于 {0.25:410.0,0.5:560.0,0.75:660.0}} 并且您的代码应该没有错误地运行。