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.000000000001
、2021.0
、7867.540000000001
、7867.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()))
我在本地机器(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.000000000001
、2021.0
、7867.540000000001
、7867.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()))