Метод 1 mul
& np.ceil
Вы были достаточно близки с рангом. Просто умножьте на 5 с .mul
, чтобы получить желаемый квантиль, также округлите до np.ceil
:
np.ceil(df.rank(axis=1, pct=True).mul(5))
Output
AC BO C CCM CL CRD CT DA GC GF
2010-01-19 5.0 2.0 2.0 4.0 1.0 1.0 3.0 4.0 5.0 3.0
2010-01-20 2.0 2.0 5.0 1.0 1.0 3.0 4.0 5.0 3.0 4.0
2010-01-21 5.0 2.0 2.0 4.0 1.0 1.0 3.0 4.0 5.0 3.0
Если вы хотите целые числа, используйте astype
:
np.ceil(df.rank(axis=1, pct=True).mul(5)).astype(int)
Или еще лучше
Начиная с версии панд 0.24.0 у нас есть обнуляемое целое число тип: Int64
.
Таким образом, мы можем использовать:
np.ceil(df.rank(axis=1, pct=True).mul(5)).astype('Int64')
Output
AC BO C CCM CL CRD CT DA GC GF
2010-01-19 5 2 2 4 1 1 3 4 5 3
2010-01-20 2 2 5 1 1 3 4 5 3 4
2010-01-21 5 2 2 4 1 1 3 4 5 3
Метод 2 scipy.stats.percentileofscore
d = df.apply(lambda x: [np.ceil(stats.percentileofscore(x, a, 'rank')*0.05) for a in x], axis=1).values
pd.DataFrame(data=np.concatenate(d).reshape(d.shape[0], len(d[0])),
columns=df.columns,
dtype='int',
index=df.index)
Output
AC BO C CCM CL CRD CT DA GC GF
2010-01-19 5 2 2 4 1 1 3 4 5 3
2010-01-20 2 2 5 1 1 3 4 5 3 4
2010-01-21 5 2 2 4 1 1 3 4 5 3