Как создать столбец децилей в полярах Python?

Допустим, у меня есть столбец оценок 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 году.


1
50
1

Ответ:

Решено

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