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