【问题标题】:Rolling quantile over multiple columns在多列上滚动分位数
【发布时间】:2022-11-18 13:55:43
【问题描述】:

具有以下数据框。 我如何执行结合 2 列值的滚动 3 窗口分位数 (0.4)?

### Sample Dataframe
np.random.seed(0) # Freeze randomness
a = pd.DataFrame(np.random.randint(1,10,size=(20, 1)), columns=list('A'))
b = pd.DataFrame(np.random.randint(50,90,size=(20, 1)), columns=list('B'))
df = pd.concat([a,b], axis=1)
df
A B quantile_AB (expected ans)
0 6 75 NaN
1 1 63 NaN
2 4 58 6.0
3 4 59 4.0

(6,1,4,75,63,58) 的第 40 个百分位数应该给我 6.0。

下面的公式分别给出了 2 列的滚动分位数。

df.rolling(3)[['A','B']].quantile(0.4)

【问题讨论】:

  • AB是什么关系?
  • 没有关系。仅以数字为例
  • 交错 (zip) 2 列并在 6 的窗口上采用滚动分位数,最后采用每个第二个值形式? (或者我认为滚动让你也可以直接设置步长 2)
  • 你有代码示例吗?

标签: python pandas dataframe


【解决方案1】:

使用带有滚动分位数的 stack

df.stack(dropna=False).rolling(window=3*len(df.columns)).
   quantile(0.4)[cols-1::cols].reset_index(-1, drop=True)

数据框

    A   B
0   6   75
1   1   63
2   4   58
3   4   59

输出:

0    NaN
1    NaN
2    6.0
3    4.0
dtype: float64

【讨论】:

    【解决方案2】:

    IIUC,使用numpysliding_window_view

    from numpy.lib.stride_tricks import sliding_window_view
    
    m = df[['A', 'B']].to_numpy()
    W = 3
    N = m.shape[1]
    Q = 0.4
    q = np.quantile(np.reshape(sliding_window_view(m, (W, N)), (-1, W*N)), q=Q, axis=1)
    df['quantile_AB'] = pd.Series(q, index=df.index[N:])
    

    输出:

    >>> df
        A   B  quantile_AB
    0   6  75          NaN
    1   1  63          NaN
    2   4  58          6.0
    3   4  59          4.0
    4   8  70          8.0
    5   4  66          8.0
    6   6  55          8.0
    7   3  65          6.0
    8   5  50          6.0
    9   8  68          8.0
    10  7  85          8.0
    11  9  74          9.0
    12  9  79          9.0
    13  2  69          9.0
    14  7  69          9.0
    15  8  64          8.0
    16  8  89          8.0
    17  9  82          9.0
    18  2  51          9.0
    19  6  59          9.0
    

    【讨论】:

    • 感谢 numpy 方法。很好的替代解决方案。更喜欢基于熊猫的解决方案,但投了赞成票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 2022-01-18
    • 2023-04-11
    • 2021-09-23
    • 2012-07-19
    • 2019-08-05
    • 2019-12-29
    相关资源
    最近更新 更多