Панды групповой прокат квантиль для группы - PullRequest
1 голос
/ 15 марта 2019

Что я хочу сделать, это взять набор данных, состоящий из значения 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])

1 Ответ

1 голос
/ 15 марта 2019

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

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...