scipy PandasDataFrame的Z分数计算返回不同的类

cbeh67ev  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(132)

我正在尝试使用scipy的zscore方法来计算Pandas的DataFrame的Z-Score。虽然成功了,但是我得到了不同的返回类型,这取决于程序运行的主机。
因此,我猜测这与所涉及的包的不同版本有关。
我还没有找到差异的原因。

  • 为什么两台主机上返回的type不同?

| 主机1|主机2|
| - -|- -|
| Python 3.6.8| Python 3.7.3版|
| Pandas1.1.5|Pandas1.3.1|
| 麻木1.19.5|麻木1.19.2|
| 第1.5.4节|第1.7.3节|
示例:

主机1

import numpy as np
import pandas as pd
from scipy.stats import zscore
df = pd.DataFrame(np.random.randint(100, 200, size=(5, 3)), columns=['A', 'B', 'C'])

# --------------------------------

In [5]: df
Out[5]: 
     A    B    C
0  166  135  141
1  156  110  167
2  104  159  114
3  150  156  157
4  163  113  180

In [10]: zscore(df)
Out[10]: 
array([[ 0.80546745,  0.01940194, -0.47372066],
       [ 0.36290292, -1.19321913,  0.66671797],
       [-1.93843265,  1.18351816, -1.65802232],
       [ 0.0973642 ,  1.03800363,  0.22808773],
       [ 0.67269809, -1.0477046 ,  1.23693729]])

In [11]: zscore(df, ddof=0)
Out[11]: 
array([[ 0.80546745,  0.01940194, -0.47372066],
       [ 0.36290292, -1.19321913,  0.66671797],
       [-1.93843265,  1.18351816, -1.65802232],
       [ 0.0973642 ,  1.03800363,  0.22808773],
       [ 0.67269809, -1.0477046 ,  1.23693729]])

In [12]: type(zscore(df))
Out[12]: numpy.ndarray

主机2

import numpy as np
import pandas as pd
from scipy.stats import zscore
df = pd.DataFrame(np.random.randint(100, 200, size=(5, 3)), columns=['A', 'B', 'C'])

# --------------------------------

In [77]: df
Out[77]: 
     A    B    C
0  151  188  190
1  195  199  103
2  130  174  188
3  168  194  146
4  171  138  129

In [78]: zscore(df)
Out[78]: 
          A         B         C
0 -0.553990  0.428052  1.148875
1  1.477308  0.928963 -1.427210
2 -1.523474 -0.209472  1.089654
3  0.230829  0.701276 -0.153973
4  0.369327 -1.848819 -0.657346

In [79]: zscore(df, ddof=0)
Out[79]: 
          A         B         C
0 -0.553990  0.428052  1.148875
1  1.477308  0.928963 -1.427210
2 -1.523474 -0.209472  1.089654
3  0.230829  0.701276 -0.153973
4  0.369327 -1.848819 -0.657346

In [80]: type(zscore(df))
Out[80]: pandas.core.frame.DataFrame
owfi6suc

owfi6suc1#

如果我们看一看scipy的zscore版本v1.5.4的源代码(例如在主机1上),我们可以看到传递的输入被np.asanyarray(a)转换为numpy数组,然后被进一步处理并返回。(例如在主机2上),代码使用zmap函数,该函数计算传递的数组/DataFrame的z得分,同时保留其类型(请参见此行)。
总之,此行为的罪魁祸首是主机2上的较新scipy版本。希望这有帮助!

相关问题