最近值的 Python 百分位数与先前值的 window
Python percentile of recent value vs window of previous values
抱歉,我是一个希望从 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 个值的滚动 window 计算其当前百分位数。
据我所知:
for n in range(1,len(df)):
print(sum(df.ATR20[n:n+20] > df.ATR20))
给出以下错误:
ValueError: Can only compare identically-labeled Series objects
我确信有一种更简单的方法可以使用更简洁的语法来完成此操作,但我的搜索没有找到足够接近的方法。
谢谢。
我认为这会得到您要找的东西。我使用了你的示例,数据框中只有 10 个元素,滚动 window 有 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。我认为我在这里使用的计算或多或少是你正在寻找的:
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
抱歉,我是一个希望从 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 个值的滚动 window 计算其当前百分位数。
据我所知:
for n in range(1,len(df)):
print(sum(df.ATR20[n:n+20] > df.ATR20))
给出以下错误:
ValueError: Can only compare identically-labeled Series objects
我确信有一种更简单的方法可以使用更简洁的语法来完成此操作,但我的搜索没有找到足够接近的方法。
谢谢。
我认为这会得到您要找的东西。我使用了你的示例,数据框中只有 10 个元素,滚动 window 有 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。我认为我在这里使用的计算或多或少是你正在寻找的:
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