【问题标题】:error in expression evaluation with float() conversion使用 float() 转换的表达式评估错误
【发布时间】:2021-04-15 12:06:49
【问题描述】:

我有一个 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 转换为浮动,则表达式的评估结果是错误的,正如您从上面的控制台行中看到的那样。

感谢任何帮助,因为旧代码给出了错误的值。

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    关于链式比较需要意识到的重要一点是(a &gt; b) &gt;= ca &gt; b &gt;= c 不同。例如:

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

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

    【讨论】:

      【解决方案2】:

      感谢您的回答,我意识到我的旧代码是错误的,但真正的问题是为什么行为会随着浮点转换而改变。

          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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-11
        • 2019-07-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多