Python对长浮点数使用z分数后均值不为0

最近我遇到一个大问题,就是对于很长的浮点数进行标准化时(z分数),标准化后的均值不为0!
这导致我后续基于此标准化值进行的指标构建可能不能准确的比较大小!
求解决~


import pandas as pd
import math

df = pd.DataFrame(data=[[1.16482132131231231248,1.211],
                        [-52.2123123123123,5.123123]],
                          columns=["A","B"])

# 标准化
df["A_zScore"] = [(x-df["A"].mean(0))/df["A"].std(0) for x in df["A"].values]
df["B_zScore"] = [(x-df["B"].mean(0))/df["B"].std(0) for x in df["B"].values]
# 任意公式构造一个指标
df["r"] = [(x1**2+x2**2)**0.5 for x1,x2 in zip(df["A_zScore"].values,df["B_zScore"].values)]
print("\n",df)

# 结果发现均值不为0
print(df["A_zScore"].mean())
print(df["B_zScore"].mean())

# 这导致我后续基于该标准化值计算的各种指标无法正常比较大小
print(df.iloc[0,4] > df.iloc[1,4])
# 也就导致了排序失效
print(df.sort_values(by=["r","A"], ascending=[False,True]))

img

print(df.sort_values(by=["r","A"], ascending=[False,True], key=lambda x: round(x,3)))

img


以上是我暂时的解决方法,在排序时,将数据保留到3位小数,这样使得,本来应当相等的值变得相等,使得后面的排序依据可以正常判定

还有没有其他的方法呀,比如说能否直接从源头解决这个长浮点数的标准化问题?

有误差很正常,比较的时候,采用和比较的数相减取绝对值,看是否小于epsilon(epsilon是一个人为规定的非常非常小的数)