Допустим, у меня есть столбец оценок FICO. Я хотел бы создать еще один столбец FICO_DECILE, который ранжирует оценки FICO по убыванию и назначает децильную группу, т. е. FICO=850 будет иметь FICO_DECILE=1, а что-то вроде FICO=360 будет иметь FICO_DECILE=10.
Я пытался:
# decile rank
df1 = df.with_columns(
(
(pl.col('fico').rank(method='dense')/df.height*10).cast(pl.UInt32).alias('fico_decile')
)
)
Но я получаю только DECILE_GROUP, равный 0 и нулю.
Я не проверял, но это должно сработать, в целом я думаю, что вы на правильном пути. Основная причина, по которой вы получаете эту ошибку, заключается в том, как вы используете rank()
.
Хитрость в том, чтобы использовать descending: bool = False
Я изменил ваш код, чтобы включить это.
df1 = df.with_columns(
(
(pl.col('fico').rank(method='min', descending=True) / df.height * 10)
.ceil()
.cast(pl.UInt32)
.alias('fico_decile')
)
)
Поскольку вы получаете нулевые значения, мы могли бы немного поработать с данными здесь.
см. ссылку: горит
# filter out null FICO scores
fico_df = df.filter(pl.col('fico').is_not_null())
# rank for non-null FICO scores
fico_df = fico_df.with_columns(
(
(pl.col('fico')
.rank(method='min', descending=True)
/ fico_df.height * 10)
.ceil()
.cast(pl.UInt32)
.alias('fico_decile')
)
)
# handle null with lit
null_fico_df = df.filter(pl.col('fico').is_null()).with_columns(
pl.lit(None).alias('fico_decile')
)
# df with valid and invalid
df_final = pl.concat([fico_df, null_fico_df])
# results
df_final.select(['fico', 'fico_decile']).show()
@kstats9pt3 Думаю, даdescending=True
см. ссылку
Спасибо. Я думаю, что это близко, но не создает 10 групп. У меня есть группа, равная нулю, что имеет смысл, поскольку есть недопустимые фико, но после этого у меня есть только группы 1–8. Почему бы это не создать 11 групп (1-10 плюс ноль)?
По-прежнему создается только 8 групп, 1–8, вместо 10 групп. Есть идеи, почему?
@ kstats9pt3, хотите ли вы сохранить нулевые значения? Я подозреваю, что он игнорирует это, потому что вы не можете получить нулевой рейтинг, я думаю, либо вы находите способ изменить его на псевдоним.
Я ссылался на полный фрейм данных с нулевыми значениями в ссылке height
, так что теперь он отлично работает! Отмечу как ответ, еще раз спасибо.
Ах @kstats9pt3 Я вижу, пожалуйста, всегда рад помочь :)
Можете ли вы привести минимальный воспроизводимый пример?