应用于自定义函数

2024-04-19 07:03:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我想以滚动方式申请pandas.rank。 我尝试使用pandas.rolling.apply,但不幸的是,rolling与“rank”不兼容

附近有路吗

df = pd.DataFrame(np.random.randn(10, 3))

def my_rank(x):
   return x.rank(pct=True)

df.rolling(3).apply(my_rank)

Tags: dataframepandasdfreturnmydefnp方式
1条回答
网友
1楼 · 发布于 2024-04-19 07:03:41

代码:

def my_rank(x):
   return pd.Series(x).rank(pct=True).iloc[-1]

df.rolling(3).apply(my_rank)

输出:

          0         1         2
0       NaN       NaN       NaN
1       NaN       NaN       NaN
2  0.666667  0.333333  0.666667
3  1.000000  0.333333  1.000000
4  0.666667  1.000000  0.333333
5  0.333333  0.666667  0.666667
6  1.000000  0.333333  0.666667
7  0.333333  0.333333  1.000000
8  1.000000  0.666667  1.000000
9  0.666667  1.000000  0.666667

说明:

您的代码(非常好的可复制示例,顺便说一句!)引发了以下错误: AttributeError: 'numpy.ndarray' object has no attribute 'rank'。 这意味着my_rank函数中的x被传递为numpy数组,而不是pandas系列。因此,首先我将return x.rank...更新为return pd.Series(x).rank..

然后我得到了以下错误: TypeError: cannot convert the series to <class 'float'> 这是有意义的,因为pd.Series.rank接受一系列n个数字并返回一系列n个数字(排序)。但是,由于我们不是在一个序列上调用rank一次,而是在一个序列的滚动窗口上重复调用rank,因此每次滚动计算只需要一个数字作为输出。因此iloc[-1]

相关问题 更多 >