各位大佬好,我是一个python小白,最近想把一个数值计算的函数给从pandas版本写成numpy版本,甚至更进阶一点,写成cython化以加速代码运行,代码和我遇到的问题如下:
1、原本的pandas版本的函数是
[Python] 纯文本查看 复制代码 def pandas(data):
df = pd.DataFrame(data)
f1 = df.expanding().mean()
f2 = df.expanding().std()
shuchu= (df-f1) / f2
return shuchu
我改写后的numpy版本如下:
[Python] 纯文本查看 复制代码 def numpy(data):
cumsum = np.cumsum(data)
index = np.arange(1, len(data) + 1)
mean_data = np.divide(cumsum, index)
expanding_std = np.sqrt(np.maximum(0, np.subtract(np.divide(np.cumsum(data**2), index), mean_data**2)))
shuchu = np.divide(np.subtract(data,mean_data),expanding_std)
return shuchu
上面这个numpy代码其中计算std标准差的部分在数学公式上是没错的,之所以加了一个和0比较大小的部分是因为一个bug,也就是我想问的一个问题,如下
numpy似乎有精度的问题,0减去0理论上得出的结果应该是0,但是它有时候会计算得出1e-6之类的接近0的极小值,有时候是正数极小值有时候是负数(所以我上面的代码加了一个和0比大小,以免sqrt里的值是负数极小值,会报错)
这个问题,导致数值运算会出错,比如10除一个(0减去0),一般会把计算结果处理成0,但是因为这个精度问题可能就会变成一个大值,比如1e+8之类的
我想问这个问题该怎么解决:
1、我试过用round去压缩精度,但是这会使得其他的数据的计算结果出现微小偏差
2、同时因为我是想为了加速代码的,所以不可能为了精度又去用上一些高精度的数据处理库,这样会大量提高内存和时间的消耗
3、关键是pandas为什么不会出现这种精度问题,比如一个都是0的数据序列去求mean和std,numpy有时候不会出错,有时候会出错,计算出一些极小值,但是pandas比较稳定,目前没看到出错过
总而言之,我想要一个解决方案,解决这个精度问题,同时不要大幅提高内存和时间消耗,请提供一个python代码,或者cython代码,谢谢!
各位大佬快来,我会经常登录吾爱,并且和你讨论细节的,如果你给出的方案是我需要的,我会立刻结算悬赏,跪求各位大佬帮帮忙。 |