在 pandas 中的列上滚动分位数

Rolling quantiles over a column in pandas

我有一个 table 这样的

+------+------------+-------+
| 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 |
+------+------------+-------+

我想创建一个基于 'value'[=25 列创建新列 '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               |
+------+------------+-------+-----------------------+

我以一种天真的方式完成了它,我只是放置了一个函数,该函数根据值的先例行逐行创建并标记从一个 Id 到另一个 Id 的跳转,但我确信这不是最有效的这样做的方式,也不是最优雅的。

期待您的建议!

我想你想要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