Квантовые числа Pandas

#python #pandas #quantile

#python #pandas #квантиль

Вопрос:

Что не работает:

 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,))
  

Что работает:

Квантовые числа def:

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

quantiles = quantiles.to_dict()

def RScore(x,p,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,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['recency_quartile'] = df_segmented['recency'].apply(RScore, args = ('recency', quantiles,))
df_segmented['frequency_quartile'] = df_segmented['frequency'].apply(FMScore, args = ('frequency', quantiles,))
df_segmented['monetary_quartile'] = df_segmented['monetary'].apply(FMScore, args = ('monetary', quantiles,))
  

Данные:
Данные

ОШИБКА:

Ошибка

Комментарии:

1. Итак, в чем вопрос? Чего ты на самом деле хочешь?

2. Ошибка указывает на то, что у вас нет столбца Average_Transaction_Value в вашем df_segmented

3. Точно так же, как у меня есть recency_quartile, frequency_quartild и monetary_quartile, я хочу иметь atv_quartile. Я использовал тот же подход, что и для новизны и частоты, но я не уверен, почему он не работает. Ошибка также прилагается

4. @Sociopath да, это то, что я понял, но этот столбец есть

5. @SanaShah какое значение в quantiles переменной передается в apply?

Ответ №1:

Проблема с вашим кодом, скорее всего, в содержимом квантилей.

После создания этой переменной распечатайте ее содержимое. Вероятно, он содержит что-то вроде:

 {'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]: (почти в конце вашей трассировки стека),
  • при выполнении d[p] он пытается найти ключ ‘Average_Transaction_Value’ в квантилях,
  • поскольку квантовые числа не содержат этого ключа, генерируется исключение KeyError.

Добавьте ключ ‘Average_Transaction_Value’ к квантилям со значением что-то вроде {0.25: 410.0, 0.5: 560.0, 0.75: 660.0}} и ваш код должен выполняться без ошибок.