在数据框中,我想计算过去10天的价格中有多少比今天的价格高.结果如下所示:
price ct>prev10
50.00
51.00
52.00
50.50
51.00
50.00
50.50
53.00
52.00
49.00
51.00 3
我已经看过这篇文章由DSM回答,但要求不同,因为比较的基数是静态数字而不是当前行:
Achieving “countif” with pd.rolling_sum()
当然我想在没有循环1×1的情况下这样做.非常难过 – 提前感谢任何建议.
解决方法:
您可以在该系列上使用rolling_apply函数.考虑到样本数据的小尺寸,我使用了5的窗口长度,但您可以轻松地更改它.
lambda函数计算滚动组中的项目数(不包括最后一项)大于最后一项.
df = pd.DataFrame({'price': [50, 51, 52, 50.5, 51, 50, 50.5, 53, 52, 49, 51]})
window = 5 # Given that sample data only contains 11 values.
df['price_count'] = pd.rolling_apply(df.price, window,
lambda group: sum(group[:-1] > group[-1]))
>>> df
price price_count
0 50.0 NaN
1 51.0 NaN
2 52.0 NaN
3 50.5 NaN
4 51.0 1
5 50.0 4
6 50.5 2
7 53.0 0
8 52.0 1
9 49.0 4
10 51.0 2
在上面的示例中,第一组是索引值为0-4的价格.你可以看到发生了什么:
group = df.price[:window].values
>>> group
array([ 50. , 51. , 52. , 50.5, 51. ])
现在,将前四个价格与当前价格进行比较:
>>> group[:-1] > group[-1]
array([False, False, True, False], dtype=bool)
然后,您只是将布尔值相加:
>>> sum(group[:-1] > group[-1])
1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。