python - 使用 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 转换为浮动表达式的评估结果是错误的,正如您从上面的控制台行中看到的那样。
对我来说,任何帮助都值得赞赏,旧代码给出了错误的值。
解决方案
关于链式比较要意识到的重要一点是,(a > b) >= c
它与a > b >= c
. 例如:
>>> 0 > 1 >= 0
False
>>> (0 > 1) >= 0
True
您的旧代码和新代码返回不同结果的原因是旧代码不正确。
推荐阅读
- reactjs - 如何在 material-ui/pickers 中使用 shouldDisableTime?
- python - 错误:输入包含 NaN、无穷大或对于 dtype('float32') 来说太大的值
- html - 在手风琴(ngb-accordion)中单击面板(ngb-panel)时如何防止重新加载ng-template
- python - 如何使用数据框值在 python 中创建 3d 数组?
- android - 如何在清单中添加查询声明以使用相机
- angular - 使用提供者创建另一个提供者
- vega-lite - 在层图中的顶层定义参数会产生重复信号错误
- python - 如何根据熊猫中的时间仅更改某些特定行的日期?
- powershell - 如何在一行的 Windows 批处理文件输出中获取 PowerShell 命令和命令 ECHO 的输出?
- python - 如何禁用菜单“运行代码”和“在终端中运行代码”?