抱歉,我是一个新手,希望从R过渡过来!
可重现的数据示例;
df = pd.DataFrame(1.26 + np.random.rand(size)/100.0,
index=pd.date_range('20160101 09:00:00',
periods=size,
freq='60s'),
columns=['ATR20'])
我想在列ATR20中取一个值,并根据列ATR20的前n个值的滚动窗口计算其当前百分位数。
这就是我所得到的:
for n in range(1,len(df)):
print(sum(df.ATR20[n:n+20] > df.ATR20))
这会给出以下错误:
ValueError: Can only compare identically-labeled Series objects
我确信有一种更简单的方法可以用更简洁的语法来做这件事,但是我的搜索还没有找到足够接近的东西。
谢谢。
发布于 2018-06-28 04:23:10
我想这会得到你想要的。我使用了你的例子,数据框中只有10个元素,滚动窗口中有3个元素,这样粘贴到这里就会更短。
size = 10
df = pd.DataFrame(1.26 + np.random.rand(size)/100.0,
index=pd.date_range('20160101 09:00:00',
periods=size,
freq='60s'),
columns=['ATR20'])
# ATR20
# 2016-01-01 09:00:00 1.262522
# 2016-01-01 09:01:00 1.265116
# 2016-01-01 09:02:00 1.265051
# 2016-01-01 09:03:00 1.261109
# 2016-01-01 09:04:00 1.262699
# 2016-01-01 09:05:00 1.266710
# 2016-01-01 09:06:00 1.260186
# 2016-01-01 09:07:00 1.268001
# 2016-01-01 09:08:00 1.263227
# 2016-01-01 09:09:00 1.261331
您可以结合使用df.rolling
和apply
将函数应用于滚动窗口。我想我在这里使用的计算方法或多或少就是你想要的:
window = 3
df.rolling(window).apply(lambda x: sum([x[-1] > i for i in x]) / (window - 1))
# ATR20
# 2016-01-01 09:00:00 NaN
# 2016-01-01 09:01:00 NaN
# 2016-01-01 09:02:00 0.263665
# 2016-01-01 09:03:00 0.000000
# 2016-01-01 09:04:00 0.263932
# 2016-01-01 09:05:00 0.527632
# 2016-01-01 09:06:00 0.000000
# 2016-01-01 09:07:00 0.527024
# 2016-01-01 09:08:00 0.263754
# 2016-01-01 09:09:00 0.000000
https://stackoverflow.com/questions/51070679
复制相似问题