Скользящий квантиль над колонной в pandas - PullRequest
1 голос
/ 15 января 2020

У меня есть таблица как таковая

+------+------------+-------+
| Idx  |    date    | value |
+------+------------+-------+
| A    | 20/11/2016 |    10 | 
| A    | 21/11/2016 |    8  | 
| A    | 22/11/2016 |    12 |
| B    | 20/11/2016 |    16 |
| B    | 21/11/2016 |    18 |
| B    | 22/11/2016 |    11 |
+------+------------+-------+

Я хотел бы создать столбец, который создает новый столбец 'Rolling_quantile_value' на основе столбца 'значение' , который вычисляет квантиль на основе прошлого для каждой строки и каждого возможного Idx.

Для приведенного выше примера, если выбран квантиль медиана, выходные данные должны выглядеть следующим образом:

+------+------------+-------+-----------------------+
| Idx  |    date    | value | rolling_median_value  |
+------+------------+-------+-----------------------+
| A    | 20/11/2016 |    10 |      NaN              |
| A    | 21/11/2016 |    8  |      10               |
| A    | 22/11/2016 |    12 |      9                |
| A    | 23/11/2016 |    14 |      10               |
| B    | 20/11/2016 |    16 |      NaN              |
| B    | 21/11/2016 |    18 |      16               |
| B    | 22/11/2016 |    11 |      17               |
+------+------------+-------+-----------------------+

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

Ждем твоих предложений!

1 Ответ

1 голос
/ 15 января 2020

Я думаю, что вы хотите expanding

df['rolling_median_value']=(df.groupby('Idx',sort=False)
                              .expanding(1)['value']
                              .median()
                              .groupby(level=0)
                              .shift()
                              .reset_index(drop=True))
print(df)
  Idx        date  value  rolling_median_value
0   A  20/11/2016     10                   NaN
1   A  21/11/2016      8                  10.0
2   A  22/11/2016     12                   9.0
3   A  23/11/2016     14                  10.0
4   B  20/11/2016     16                   NaN
5   B  21/11/2016     18                  16.0
6   B  22/11/2016     11                  17.0

ОБНОВЛЕНИЕ

df['rolling_quantile_value']=(df.groupby('Idx',sort=False)
                                .expanding(1)['value']
                                .quantile(0.75)
                                .groupby(level=0)
                                .shift()
                                .reset_index(drop=True))
print(df)
  Idx        date  value rolling_quantile_value
0   A  20/11/2016     10                   NaN
1   A  21/11/2016      8                  10.0
2   A  22/11/2016     12                   9.5
3   A  23/11/2016     14                  11.0
4   B  20/11/2016     16                   NaN
5   B  21/11/2016     18                  16.0
6   B  22/11/2016     11                  17.5
...