python - 在 pandas 的 groupby 中滚动应用函数
问题描述
我有一个如下所示的数据框。
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))
对于给定的行,我如何在滚动的基础上仅将相同的函数应用于最后 20 行(组内)symbol
,然后将输出作为列(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
解决方案
groupby
并transform
带有一个lambda
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
推荐阅读
- vb.net - VB.Net and Multiselect Box
- php - 如何使用 php 脚本将百万行插入 MySQL 数据库?
- list - 右手边也被分配
- ruby-on-rails - 使用回形针将图像上传到目录 - Ruby on rails
- python - 捕获 QApplication 中引发的异常
- java - 尝试通过 Odata 服务连接时 ErpConfigContext 和 ODataQueryBuilder 抛出错误
- pandas - 我希望 train_test_split 主要在一个特定的数字范围内进行训练
- python - 有没有一种并行的方法来比较两个大的整数列表?
- javascript - JavaScript 中的堆栈帧和执行上下文是否相同?
- routes - 角度 7 参数