Точно рассчитать квантили на скользящем окне, используя панд - PullRequest
0 голосов
/ 18 мая 2019

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

Опять же, когда исходные данные отсортированы, квантили генерируются точно. Спасибо, что помогли мне увидеть ошибку в моем коде.

...