Допустим, у меня есть столбец оценок 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 и нулю.
🤔 А знаете ли вы, что...
Python был создан Гвидо ван Россумом и впервые выпущен в 1991 году.
Я не проверял, но это должно сработать, в целом я думаю, что вы на правильном пути. Основная причина, по которой вы получаете эту ошибку, заключается в том, как вы используете 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()