pandas -滚动平均值中的额外kwargs已弃用

mlmc2os5  于 6个月前  发布在  其他
关注(0)|答案(1)|浏览(61)

我使用的是pandas 1.2.3(我知道它很老了,但是某个项目的版本被冻结了)。在这个项目中,我使用了以下代码行:df.rolling(n).mean(skipna=False)
对于pandas 1.5+,这将给出以下警告:FutureWarning:将额外的kwargs传递给Rolling.mean对结果没有影响,并且被取消。这将在pandas的未来版本中引发TypeError。
然而,我在网上找不到任何关于如何用新版本1-1复制旧行为的建议。
谢谢您的帮助!

ehxuflar

ehxuflar1#

如果你使用的是Pandas 1.2.3,skipna参数在滚动窗口的上下文中没有任何作用。
这可能是个好消息,因为你所要做的就是删除skipna=False,你的代码将与Pandas 1.5兼容。如果你的代码依赖于skipna,这也可能是个坏消息,因为这可能表明你的代码有一个bug,如果它期望skipna做一些事情。(这对于skipna=False来说并不是问题,因为这是默认值,但是如果你有skipna=False,你可能在其他地方也有skipna=True
我有三个证据可以证明skipna在滚动窗口的上下文中什么也不做。

测试程序

首先,下面的测试程序尝试对一个缺失值的序列求平均值,skipna设置为True和False。我使用Pandas 1.2.3运行了这个测试程序。

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': [1, 2, 3, np.nan, 5, 6, 7]})
print(df['a'].rolling(3).mean(skipna=True))
print(df['a'].rolling(3).mean(skipna=False))

字符串
输出量:

0    NaN
1    NaN
2    2.0
3    NaN
4    NaN
5    NaN
6    6.0
Name: a, dtype: float64
0    NaN
1    NaN
2    2.0
3    NaN
4    NaN
5    NaN
6    6.0
Name: a, dtype: float64


两者的输出是相同的。如果在计算均值时跳过NA值,则位置2到6中的所有值都不应该是NA。实际上,这意味着无论是否设置了skipna,滚动均值都不会跳过NA值。

文档

第二,我读了Pandas 1.2的文档中关于skipna的内容。在这里,我们需要注意我们是否阅读了正确的页面。我们想要的不是DataFrame.mean(),而是pandas.core.window.rolling.Rolling.mean()
这个页面没有记录skipna参数。假设,如果有人经历了编写代码来实现skipna的麻烦,他们会记录它。另一方面,它确实有一个包罗万象的**kwargs参数,它被记录为“正在审查”。
skipna会不会有效果,只是一个在我的测试程序中没有显示的效果,一个没有记录的效果?

阅读Pandas代码

我用来研究这个问题的第三种方法是在调试器下运行代码。
通过在调试器下运行测试程序,我发现Pandas中负责计算滚动平均值的代码。此代码不实现任何类型的skipna功能。
下面是如何实现滚动平均值。

  • df.rolling(3).mean()被调用,它调用
  • pandas/core/window/rolling.py:Rolling.mean()被调用,它调用
  • pandas/core/window/rolling.py:RollingAndExpandingMixin.mean()被调用,它调用
  • pandas/core/window/rolling.py:BaseWindow._apply()被调用,它调用
  • pandas/_libs/window/aggregations.pyx:roll_mean(),计算滚动平均值。

在这条链条上有两件事让斯基普纳什么都做不了。
首先,在调用BaseWindow._apply()之前,skipna一直被携带在kwargs变量中。但在该函数中,kwargs参数未被使用。即使roll_mean()实现了skipna,skipna参数也无法到达roll_mean()
其次,如果您阅读roll_mean()的源代码,它不会跳过NA值,也不会检查NA值。
为了让skipna做一些事情,这里需要有代码来实现它,而这里没有。

总结

df.rolling(3).mean(skipna=False)的skipna参数过去什么也不做,现在仍然什么也不做,但现在它会抱怨。

相关问题