【问题标题】:Rolling quantiles over a column in pandas在熊猫的列上滚动分位数
【发布时间】:2020-01-15 15:42:43
【问题描述】:

我有一张这样的桌子

+------+------------+-------+
| 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' 创建一个新列 '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 的跳转,但我确信这不是最有效的方法这样做,也不是最优雅的。

期待您的建议!

【问题讨论】:

    标签: python pandas dataframe pandas-groupby data-processing


    【解决方案1】:

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

    【讨论】:

    • 我想如果我想要一个自定义的分位数,我只需要一个函数并将 '.median()' 替换为 '.apply(quantile)' ?
    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 2012-04-03
    • 2017-06-07
    • 2017-09-12
    相关资源
    最近更新 更多