Python 熊猫滚动窗口百分位数
我试图在滚动窗口中按列计算数据的百分位排名Python 熊猫滚动窗口百分位数,python,pandas,apply,rank,percentile,Python,Pandas,Apply,Rank,Percentile,我试图在滚动窗口中按列计算数据的百分位排名 test=pd.DataFrame(np.random.randn(20,3),pd.date_range('1/1/2000',periods=20),['A','B','C']) test Out[111]: A B C 2000-01-01 -0.566992 -1.494799 0.462330 2000-01-02 -0.550769 -0.699104 0.767
test=pd.DataFrame(np.random.randn(20,3),pd.date_range('1/1/2000',periods=20),['A','B','C'])
test
Out[111]:
A B C
2000-01-01 -0.566992 -1.494799 0.462330
2000-01-02 -0.550769 -0.699104 0.767778
2000-01-03 -0.270597 0.060836 0.057195
2000-01-04 -0.583784 -0.546418 -0.557850
2000-01-05 0.294073 -2.326211 0.262098
2000-01-06 -1.122543 -0.116279 -0.003088
2000-01-07 0.121387 0.763100 3.503757
2000-01-08 0.335564 0.076304 2.021757
2000-01-09 0.403170 0.108256 0.680739
2000-01-10 -0.254558 -0.497909 -0.454181
2000-01-11 0.167347 0.459264 -1.247459
2000-01-12 -1.243778 0.858444 0.338056
2000-01-13 -1.070655 0.924808 0.080867
2000-01-14 -1.175651 -0.559712 -0.372584
2000-01-15 -0.216708 -0.116188 0.511223
2000-01-16 0.597171 0.205529 -0.728783
2000-01-17 -0.624469 0.592436 0.832100
2000-01-18 0.259269 0.665585 0.126534
2000-01-19 1.150804 0.575759 -1.335835
2000-01-20 -0.909525 0.500366 2.120933
我尝试使用。滚动。应用,但我缺少一些东西
pctrank = lambda x: x.rank(pct=True)
rollingrank=test.rolling(window=10,centre=False).apply(pctrank)
对于A列,最终值为2000-01-11至2000-01-20期间长度=10窗口内-0.909525的百分位数。有什么想法吗?您的lambda接收到一个numpy数组,它没有
.rank
方法-它是pandas的系列和数据帧。因此,您可以将其更改为
pctrank = lambda x: pd.Series(x).rank(pct=True).iloc[-1]
或者您可以使用纯numpy,大致如下:
最简单的选择是这样做:
从scipy导入统计信息
200是窗口大小
数据集[名称]=数据集[名称]。滚动(200).应用(lambda x:stats.percentileofscore(x,x[-1])如果您只需要上一次观察的排名,与滚动应用一样,您可以使用:
def pctrank(x):
i = x.argsort().argmax() + 1
n = len(x)
return i/n
时间快了一倍左右这太完美了,正是我想要的。非常感谢。因此,在应用rank()之前,我没有将x定义为熊猫系列。你能解释一下为什么我的lambda会收到numpy数组吗。rolling()和.apply()都是作用于panda数据帧“测试”的panda函数?为什么我的lambda接收numpy数组?我不知道为什么;我只知道错误是这样说的:“numpy.ndarray
没有方法rank
”<代码>滚动
是一种使用系列
和数据帧
的方法<代码>应用
有几种不同的体现。请看一下文档。
def pctrank(x):
i = x.argsort().argmax() + 1
n = len(x)
return i/n