Pandas groupby скользящий квантиль для группы

Я хочу взять набор данных, состоящий из значения x для каждой минуты в течение нескольких лет, и создать данные за «типичные недели», так что фрейм данных с (60 * 24 * 7) = 10080 строками. Где каждая строка имеет определенные значения квантилей / процентилей, например [0,1, 0,25, 0,5, 0,75, 0,9]. Квантили рассчитываются на основе значения x для этой минуты недели во всем наборе исторических данных, а также пяти минут до и пяти минут после этой минуты A.

Таким образом, вывод будет для каждой минуты недели, значений x для этой минуты и значений этих данных, включая минуты до и минуты после вычисления процентиля, например.

входные данные:

                                x    dow    hour  minute
               time                                     
2016-10-18 07:55:00     29.500000      0       7      55
2016-10-18 07:56:00     35.000000      0       7      56
2016-10-18 07:57:00     24.666667      0       7      57
2016-10-18 07:58:00     31.833333      0       7      58
2016-10-18 07:59:00     35.500000      0       7      59
2016-10-18 08:00:00     35.500000      0       8      00 
2016-10-18 08:01:00     33.500000      0       8      01
...                     ...          ...     ...     ...
2018-10-18 10:01:00     32.500000      6      10      01
2018-10-18 10:02:00     34.500000      6      10      02
2018-10-18 10:03:00     39.500000      6      10      03

выходные данные:

dow    hour    minute    percentile1    percentile2    percentile3    percentile4    percentile5
3         4        58             25             28             33             44             50
...
...

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

df.groupby([df.dow, df.hour, df.minute]).rolling(5).apply(pd.quantile, [0.25, 0.30, 0.50])


person William Grimes    schedule 14.03.2019    source источник
comment
скользящий квантиль не разрешает список, такой как ввод, вы можете делать только float   -  person BENY    schedule 15.03.2019


Ответы (1)


Вы можете сделать с

g=df.groupby(['dow', 'hour', 'minute'])['x']

s=pd.concat({y:g.apply(lambda x : x.rolling(5,min_periods=1).quantile(y)) for y in [0.25,0.30,0.50]},1)
s
Out[298]: 
        0.25       0.30       0.50
0  29.500000  29.500000  29.500000
1  35.000000  35.000000  35.000000
2  24.666667  24.666667  24.666667
3  31.833333  31.833333  31.833333
4  35.500000  35.500000  35.500000
5  33.500000  33.500000  33.500000

yourdf=pd.concat([df,s],axis=1)
person BENY    schedule 14.03.2019
comment
спасибо @ wen-ben Я попробую, просто пытаюсь лучше понять, вы устанавливаете min_periods равным 1, иначе квантиль завершится ошибкой, если все значения равны NaN? - person William Grimes; 15.03.2019
comment
спасибо, но насколько я понимаю, это применимо только к переходу внутри каждой группы, но я хочу, чтобы соседние значения минут из всех групп учитывались при вычислении квантилей? - person William Grimes; 18.03.2019