首页 > 解决方案 > 使用 float() 转换的表达式评估错误

问题描述

我有一个 pandas 数据框和一个旧例程,它使评估迭代槽线,我想加快它的速度,我已经开始在 pandas 列上使用过滤器而不是迭代,我遇到了一个奇怪的行为:

这是原始代码(在一个 for 循环中,该循环遍历传递给函数的数据帧的所有行)。

    if (float(_data['MACD'][index_value] - _data['MACD SIGNAL'][index_value]) > float(0)) >= float(_data['MACD'][index_value - 1] - _data['MACD SIGNAL'][index_value - 1]):
    gauge_value += 1

这是我的新代码

_data['MACD_SIGNAL_DIFF']=_data['MACD']-_data['MACD SIGNAL']
_data.loc[(_data['MACD_SIGNAL_DIFF']>0.0) & (_data['MACD_SIGNAL_DIFF+1']<=0.0,'Gauge']+=1

我注意到这两个例程为仪表值提供了不同的值,我做了一些研究,结果发现浮点转换很混乱,这是我的发现:

index_value=10

(float(df['MACD'][index_value] - df['MACD SIGNAL'][index_value]) > float(0)) >= float(df['MACD'][index_value - 1] - df['MACD SIGNAL'][index_value - 1])
Out[32]: True

df['MACD'][index_value]-df['MACD SIGNAL'][index_value]
Out[35]: 1.4002172909618273e-06

df['MACD'][index_value-1]-df['MACD SIGNAL'][index_value-1]
Out[36]: 3.53445505941293e-07

1.4002172909618273e-06>0>3.53445505941293e-07
Out[37]: False

df['MACD'][index_value]-df['MACD SIGNAL'][index_value]>0>df['MACD'][index_value-1]-df['MACD SIGNAL'][index_value-1]
Out[38]: False

(float(df['MACD'][index_value] - df['MACD SIGNAL'][index_value]) > float(0)) >= float(df['MACD'][index_value - 1] - df['MACD SIGNAL'][index_value - 1])
Out[39]: True

正如您所看到的,如果我强制从 numpy.float64 转换为浮动表达式的评估结果是错误的,正如您从上面的控制台行中看到的那样。

对我来说,任何帮助都值得赞赏,旧代码给出了错误的值。

标签: pythonpandasnumpy

解决方案


关于链式比较要意识到的重要一点是,(a > b) >= ca > b >= c. 例如:

>>> 0 > 1 >= 0
False
>>> (0 > 1) >= 0
True

您的旧代码和新代码返回不同结果的原因是旧代码不正确。


推荐阅读