Я пытаюсь вычислить квантиль (в данном примере квинтиль) для каждой строки в скользящем окне, которое включает в себя не менее 10 точек данных и может включать в себя до полного набора данных.
Обратите внимание, что я использую скользящее окно, чтобы строки, встречающиеся после данной строки, не включались в расчет квантиля. У меня есть код, работающий нормально, когда исходные входные данные сортируются, но, кажется, не получается заставить его работать, когда исходные входные данные не отсортированы - даже если я использую pd.Series.sort_values в функции apply. Большое спасибо заранее за ваше руководство.
import pandas as pd
raw_data = {'data' : [1, 5, 3, 2, 8, 6, 7, 10, 9, 4]*2}
df = pd.DataFrame(raw_data, columns = ['data'])
Quintiles = df['data'].rolling(window=len(df.index), min_periods=10, center=False).apply(lambda x: pd.Series(x).sort_values(axis=0, ascending=True, inplace=False, kind='mergesort', na_position='first')[pd.qcut(x, 5, labels=range(0,5), duplicates='drop')].iloc[-1])
df = df.assign(Quintiles=Quintiles.values)
print(df)
В настоящее время я генерирую следующий вывод, который включает бессмысленные значения (например, 8), когда метки были ограничены между 0 и 5.
data Quintiles
0 1 NaN
1 5 NaN
2 3 NaN
3 2 NaN
4 8 NaN
5 6 NaN
6 7 NaN
7 10 NaN
8 9 NaN
9 4 5.0
10 1 1.0
11 5 3.0
12 3 5.0
13 2 1.0
14 8 2.0
15 6 3.0
16 7 2.0
17 10 8.0
18 9 8.0
19 4 5.0
Опять же, когда исходные данные отсортированы, квантили генерируются точно. Спасибо, что помогли мне увидеть ошибку в моем коде.