#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}} и ваш код должен выполняться без ошибок.