【问题标题】:How to get "true" decimal place precision with pandas round?如何使用熊猫轮获得“真正的”小数位精度?
【发布时间】:2021-12-04 23:24:01
【问题描述】:

我错过了什么?我尝试将.round(3) 附加到 api 调用的末尾,但它不起作用,并且在单独的调用中也不起作用。所有列的数据类型为numpy.float32

>>> summary_data = api._get_data(units=list(units.id),
                             downsample=downsample,
                             table='summary_tb',
                             db=db).astype(np.float32)
>>> summary_data.head()


    id  asset_id    cycle   hs      alt     Mach        TRA         T2
0   10.0    1.0     1.0     1.0     3081.0  0.37945     70.399887   522.302124
1   20.0    1.0     1.0     1.0     3153.0  0.38449     70.575668   522.428162
2   30.0    1.0     1.0     1.0     3229.0  0.39079     70.575668   522.645020
3   40.0    1.0     1.0     1.0     3305.0  0.39438     70.575668   522.651184
4   50.0    1.0     1.0     1.0     3393.0  0.39690     70.663559   522.530090

>>> summary_data = summary_data.round(3)
>>> summary_data.head()

    id  asset_id    cycle   hs      alt     Mach    TRA         T2
0   10.0    1.0     1.0     1.0     3081.0  0.379   70.400002   522.302002
1   20.0    1.0     1.0     1.0     3153.0  0.384   70.575996   522.427979
2   30.0    1.0     1.0     1.0     3229.0  0.391   70.575996   522.645020
3   40.0    1.0     1.0     1.0     3305.0  0.394   70.575996   522.651001
4   50.0    1.0     1.0     1.0     3393.0  0.397   70.664001   522.530029


>>> print(type(summary_data))

pandas.core.frame.DataFrame

>>> print([type(summary_data[col][0]) for col in summary_data.columns])

[numpy.float32,
 numpy.float32,
 numpy.float32,
 numpy.float32,
 numpy.float32,
 numpy.float32,
 numpy.float32,
 numpy.float32]

事实上,看起来确实发生了某种形式的舍入,但发生了一些奇怪的事情。提前致谢。

编辑

重点是使用 32 位浮点数,而不是 64 位。从那以后我使用了pd.set_option('precision', 3),但根据documentation,这只会影响显示,但不会影响基础值。正如下面的评论中提到的,我试图最小化原子操作的数量。 70.575996 与 70.57600 的计算成本更高,这是我要解决的问题。提前致谢。

【问题讨论】:

    标签: python pandas numpy rounding


    【解决方案1】:

    嗯,这可能是一个浮点问题。您可以将 dtype 更改为 float 而不是 np.float32

    >>> summary_data.astype(float).round(3)
         id  asset_id  cycle   hs     alt   Mach     TRA       T2
    0  10.0       1.0    1.0  1.0  3081.0  0.379  70.400  522.302
    1  20.0       1.0    1.0  1.0  3153.0  0.384  70.576  522.428
    2  30.0       1.0    1.0  1.0  3229.0  0.391  70.576  522.645
    3  40.0       1.0    1.0  1.0  3305.0  0.394  70.576  522.651
    4  50.0       1.0    1.0  1.0  3393.0  0.397  70.664  522.530
    

    如果你之后将其改回np.float32,它会重新显示问题:

    >>> summary_data.astype(float).round(3).astype(np.float32)
         id  asset_id  cycle   hs     alt   Mach        TRA          T2
    0  10.0       1.0    1.0  1.0  3081.0  0.379  70.400002  522.302002
    1  20.0       1.0    1.0  1.0  3153.0  0.384  70.575996  522.427979
    2  30.0       1.0    1.0  1.0  3229.0  0.391  70.575996  522.645020
    3  40.0       1.0    1.0  1.0  3305.0  0.394  70.575996  522.651001
    4  50.0       1.0    1.0  1.0  3393.0  0.397  70.664001  522.530029
    

    【讨论】:

    • 感谢您的回答。据我所知,float 是 c double 类型,使用 64 字节的内存,而我正在尝试使用 32 字节。看起来主持人提供的第二个链接“似乎”解决了我的问题,但我对计算费用还有更多疑问,这是我想要减少的。 70.575996 会导致比 70.576 更多的原子操作吗?是的,它确实。但根据 pandas 的说法,pd.set_option('precision', 3) 只影响显示,不影响底层价值。所以我的问题在某种意义上似乎仍然有效。
    • 好的,听起来很有趣。如果您的问题独特的,请在问题正文中说明这一点,我们可能会重新打开它。 (顺便说一句,Henry Ecker 不是版主——他只是一个拥有金色 Python 徽章的普通用户,这使他可以用 Python 标签结束问题,而无需其他用户的批准,因为他被认为有足够的经验:)
    • 位不是字节^^
    • 看来问题已重新打开,谢谢!我现在在我的项目中回到这一点,并记住了我为什么需要它。有更新吗?
    猜你喜欢
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 2019-01-31
    • 2023-03-05
    相关资源
    最近更新 更多