【问题标题】:Apply function on a rolling basis within groupby in pandas在 pandas 的 groupby 中滚动应用函数
【发布时间】:2018-09-14 05:54:45
【问题描述】:

我有一个如下所示的数据框。

           symbol    Range             
Date                                      
2018-08-16     spy    1.5
2018-08-17     spy    1.2
2018-08-16     spy    1.3
2018-08-17     spy    1.6
2017-07-17     spy    1.1
2017-07-18     spy    1.9
2018-08-16     nflx   4.5
2018-08-17     nflx   5.2

我添加了一列,通过执行以下操作找到 Range 的第 15 个百分位数:

df['Range_quantile'] = df.groupby(['symbol'])['Range'].transform(lambda x: np.percentile(x.unique(), 15))

对于给定的行,我如何将相同的函数仅应用于按 symbol 分组的滚动基础上的最后 20 行(组内),然后将输出添加为列(Range_quantile_rolling)到数据框?我的示例将lambda x: np.percentile(x.unique(), 15) 函数应用于整个Range 列。

例如,如果我在 groupby 的最后 3 行中添加函数,它可能如下所示:

         symbol    Range     Range_Quantile_Rolling_3        
Date                                      
2018-08-16     spy    1.5      NA
2018-08-17     spy    1.2      NA
2018-08-16     spy    1.3      1.21
2018-08-17     spy    1.6      1.25
2017-07-17     spy    1.1      1.15
2017-07-18     spy    1.9      1.3
2018-08-16     nflx   4.5      NA
2018-08-17     nflx   5.2      NA

【问题讨论】:

  • 组中的最后 20 行?还是前 20 名中的 groupby?
  • 组内的最后 20 行。
  • 我迷路了……
  • @Wen 我正在添加一个示例数据框。

标签: python pandas numpy dataframe


【解决方案1】:

groupbytransformlambda

df.assign(Range=df.groupby('symbol').Range.transform(
    lambda x: x.rolling(3).apply(lambda y: np.percentile(np.unique(y), 15))
))

           symbol  Range
Date                    
2018-08-16    spy    NaN
2018-08-17    spy    NaN
2018-08-16    spy   1.23
2018-08-17    spy   1.23
2017-07-17    spy   1.16
2017-07-18    spy   1.25
2018-08-16   nflx    NaN
2018-08-17   nflx    NaN

【讨论】:

  • 感谢您的解决方案。在第一个例子中,你把Range放在哪里?
  • 我不必这样做,因为它是最后一列要做的事情。但它应该去df.groupby('symbol').Range.rolling(2).apply(lambda x: np.percentile(np.unique(x), 15))
猜你喜欢
  • 2015-05-14
  • 2022-06-11
  • 2019-08-05
  • 2020-07-28
  • 2021-06-19
  • 2021-10-04
  • 2021-09-05
  • 2017-10-14
  • 2018-06-19
相关资源
最近更新 更多