我使用的是pandas 1.2.3(我知道它很老了,但是某个项目的版本被冻结了)。在这个项目中,我使用了以下代码行:df.rolling(n).mean(skipna=False)对于pandas 1.5+,这将给出以下警告:FutureWarning:将额外的kwargs传递给Rolling.mean对结果没有影响,并且被取消。这将在pandas的未来版本中引发TypeError。然而,我在网上找不到任何关于如何用新版本1-1复制旧行为的建议。谢谢您的帮助!
df.rolling(n).mean(skipna=False)
ehxuflar1#
如果你使用的是Pandas 1.2.3,skipna参数在滚动窗口的上下文中没有任何作用。这可能是个好消息,因为你所要做的就是删除skipna=False,你的代码将与Pandas 1.5兼容。如果你的代码依赖于skipna,这也可能是个坏消息,因为这可能表明你的代码有一个bug,如果它期望skipna做一些事情。(这对于skipna=False来说并不是问题,因为这是默认值,但是如果你有skipna=False,你可能在其他地方也有skipna=True。我有三个证据可以证明skipna在滚动窗口的上下文中什么也不做。
skipna=False
skipna=True
首先,下面的测试程序尝试对一个缺失值的序列求平均值,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会不会有效果,只是一个在我的测试程序中没有显示的效果,一个没有记录的效果?
DataFrame.mean()
pandas.core.window.rolling.Rolling.mean()
我用来研究这个问题的第三种方法是在调试器下运行代码。通过在调试器下运行测试程序,我发现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做一些事情,这里需要有代码来实现它,而这里没有。
BaseWindow._apply()
roll_mean()
df.rolling(3).mean(skipna=False)的skipna参数过去什么也不做,现在仍然什么也不做,但现在它会抱怨。
df.rolling(3).mean(skipna=False)
1条答案
按热度按时间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运行了这个测试程序。
字符串
输出量:
型
两者的输出是相同的。如果在计算均值时跳过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参数过去什么也不做,现在仍然什么也不做,但现在它会抱怨。