pandas 滚动平均值 returns 不同机器上的不同结果

pandas rolling mean returns different results on different machines

我在本地机器(Python 3.9.5,pandas 0.25.3)和远程机器(Python 3.7.4,pandas 0.25.1) 我收到了不同的结果。

输入为:

jsn_str = '{"user_1":{"77":4514.0,"44":7867.54,"67":10406.54,"12":7151.0,"56":1921.0,"36":9471.0,"47":2021.0,"25":3211.0,"26":2021.0,"15":4651.0,"71":8805.0,"62":352.0}}'

我使用代码:

pd.DataFrame(json.loads(jsn_str), index=(str(x) for x in range(93))).fillna(method='ffill').fillna(0).sum(axis=1).rolling(window=1).mean().fillna(0).unique()

在我的本地机器上,我收到了预期的结果:

array([    0.  ,  7151.  ,  4651.  ,  3211.  ,  2021.  ,  9471.  ,
        7867.54,  1921.  ,   352.  , 10406.54,  8805.  ,  4514.  ])

但是在远程机器上,结果是:

array([    0.  ,  7151.  ,  4651.  ,  3211.  ,  **2021.**  ,  9471.  ,
        **7867.54**,  **7867.54**,  **2021.**  ,  1921.  ,   352.  , 10406.54,
        8805.  ,  4514.  ])

我又出现了 1 次 2021. 和 7867.54,因为出于某种原因,当我应用 rolling(window=1).mean() 时,我得到了浮点数的随机结果: 2021.0000000000012021.07867.5400000000017867.540000000002,当我取唯一值时,上面的所有值都会被考虑。

这种现象发生在我的更多例子中,我不明白为什么以及什么时候突然随机发生。 (而且我无法从我的代码中删除 rolling(window=1).mean()

有人遇到过这种情况吗?有什么建议吗?

我制作了几个 python 环境,并且能够使用两个 python 3.7 环境和不同 pandas 版本重现此行为,所以它似乎是与 pandas 版本 0.25.1.

直接或间接相关

我修改并使用了以下代码片段。

import pandas as pd
import numpy as np
import json
import sys
print(sys.version)
print(pd.__version__)
jsn_str = '{"user_1":{"77":4514.0,"44":7867.54,"67":10406.54,"12":7151.0,"56":1921.0,"36":9471.0,"47":2021.0,"25":3211.0,"26":2021.0,"15":4651.0,"71":8805.0,"62":352.0}}'
df = pd.DataFrame(json.loads(jsn_str), index=(str(x) for x in range(93))).fillna(method='ffill').fillna(0).sum(axis=1)
print(len(df.rolling(window=1).mean().fillna(0).unique()))
print(len(df.rolling(window=1).apply(np.mean, raw=False).fillna(0).unique()))
print(len(df.rolling(window=1).apply(np.mean, raw=True).fillna(0).unique()))
print(len(df.rolling(window=1).apply(pd.Series.mean, raw=False).fillna(0).unique()))

环境 1 输出

3.7.11 (default) [MSC v.1916 64 bit (AMD64)]
1.3.0
12
12
12
12

环境 2 输出

3.7.11 (default) [MSC v.1916 64 bit (AMD64)]
0.25.1
14 # this is our culprit
12
12
12

那么,您可以做的事情:

要么更改您的 pandas 版本并使用更新的版本,要么,

如果您必须使用 pandas 0.25.1,您或许可以使用此处显示的应用变体之一,而不是使用似乎有这种奇怪行为的 ..rolling..mean

print(len(df.rolling(window=1).apply(pd.Series.mean, raw=False).fillna(0).unique()))