为什么我得到 'FutureWarning' 和 pandas.concat?

Why do I get a 'FutureWarning' with pandas.concat?

有人遇到过类似的FutureWarning吗?我在使用 Tiingo+pandas_datareader?

时得到了这个

警告如下:

python3.8/site-packages/pandas_datareader/tiingo.py:234: FutureWarning: In a future version of pandas all arguments of concat except for the argument 'objs' will be keyword-only
    return pd.concat(dfs, self._concat_axis)

我认为这个警告不会影响我访问 pandas 数据(在我的例子中,我从 tiingo api 获取),我可以毫无问题地获取我想要的所有数据。 我只想了解我当前的环境是否存在任何风险:

my python3                -  3.8.5, 
Python 3.8.5, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
pandas_datareader version -  0.10.0
pandas version            -  1.3.2

然后我用 python 的 'futureVersion' 测试了我的代码:3.9.6(与 python 3.8.5 相比)。令我惊讶的是,我不再收到任何警告或错误,一切正常:

以下是详细信息更新

platform win32 
- Python 3.9.6, pytest-6.2.4, py-1.10.0, pluggy-0.13.1

如有任何建议,我们将不胜感激。

python 中的大多数函数参数是 "positional or keyword" 个参数。

即如果我有这个功能:

def do_something(x, y):
    pass

然后我可以这样调用它,使用位置参数:

do_something(1, 2)

或者像这样,使用关键字参数:

do_something(x=1, y=2)

或者像这样,混合使用两者(但请注意,您不能在关键字参数后使用位置参数):

do_something(1, y=2)

但您也可以使用仅位置参数或仅关键字参数定义函数

假设我有这个其他功能:

def do_something_else(x, /, y, *, z):
    pass

在这个函数中,我将 x 标记为仅限位置,因为它出现在 / 之前。我将 z 标记为仅限关键字,因为它位于 * 之后。 y 是位置或关键字参数,因为它出现在 / 之后但在 * 之前。这意味着这两次调用函数的尝试都会失败:第一次是因为 z 作为位置参数被调用,第二次是因为 x 作为关键字参数被调用:

do_something_else(1, 2, 3)       # will fail!
do_something_else(x=1, y=2, z=3) # will fail!

然而,这两次尝试都会成功 — y 仍然是位置或关键字参数。

do_something_else(1, 2, z=3)     # fine
do_something_else(1, y=2, z=3)   # fine

`FutureWarning` 消息。

FutureWarning 消息与您使用的 python 版本无关,但与您使用的 pandas 版本有关。 Pandas 是第三方库,不是 python 核心的一部分,因此您使用的 pandas 版本与您使用的 python 版本完全不同正在使用。

警告是让您知道,目前您可以编写 pd.concat(dfs, self._concat_axis),但他们计划在 pandas 的未来版本中更改函数的定义,因此除了 objs 之外的所有参数都是关键字。即,在他们进行此更改后,pd.concat(dfs, self._concat_axis) 将引发错误,您将不得不改为编写 pd.concat(dfs, axis=self._concat_axis)。他们很可能正在考虑进行此更改,因为使用关键字参数调用函数对于其他人来说通常更清晰易读。

不要担心未来的警告,它不会以任何方式影响您的代码。 但是尽量避免这种警告,因为将来不会显示此警告,而是在 pandas 更新时给出错误。这就是它显示未来警告的原因。