舍入浮点值不保留舍入小数点

Round Float Values not keeping rounding decimal points

提问人:greenguy 提问时间:5/27/2023 最后编辑:phuclvgreenguy 更新时间:5/27/2023 访问量:77

问:

Image Output

我正在尝试将从 yfinance 中提取的浮点数系列四舍五入到小数点后两位。尽管使用了 和,但 DataFrame 拒绝保留舍入,并为每个序列显示多个小数位。我做错了什么?round(2)astype('float32')

def clean_df(df):
    return (df
    .stack(level=0)
    .swaplevel(0,1,axis=0)
    .sort_index(axis=0, level=None, ascending=True)
    .reset_index(level=[0,1])
    .rename(columns={"level_0": "Symbol"})
    .round({'Open': 2, 'High': 2,'Low': 2,'Close': 2,'Volume': 0})
    .astype({'Symbol':'string','Close':'float32','Open':'float32','High':'float32','Low':'float32','Volume':'int32'})
    )
Python Pandas 数据帧 浮点 舍入

评论

1赞 Nick 5/27/2023
保证以一定数量的小数位显示的唯一方法是转换为字符串,例如使用此处描述的方法之一
0赞 phuclv 5/27/2023
@Nick这不是唯一的方法。您可以使用 Decimal 模块来处理十进制值 beepscore.com/website/2018/10/12/...
2赞 Mark Ransom 5/27/2023
Float32 是错误的类型,在出现不准确之前,它只能容纳大约 5 位数字。
0赞 greenguy 5/27/2023
我正在使用 float32 来保存内存。股票价格应该只有小数点后 2 位,所以我对这方面的不准确感到满意。
0赞 chux - Reinstate Monica 5/30/2023
@greenguy,不是把钱数成美元,而是数到0.01,那么所有值都是整数。对于可能产生小 +/- 分数的中间计算,四舍五入到接近整数。显示小数点后最多 2 位的值。x/100

答:

0赞 Timeless 5/27/2023 #1

我认为您只需要更改浮点格式显示/选项

pd.set_option("display.float_format", lambda x: "%.2f" % x)

def clean_df(df):
    return (df
    .stack(level=1)
    .swaplevel(0,1,axis=0)
    .sort_index(axis=0, level=None, ascending=True)
    .reset_index(level=[0,1])
    .rename(columns={"level_0": "Symbol"})
    )

df = yf.download("AAPL XOM", start="1980-12-12", end="2023-05-27")

输出:

print(clean_df(df))

      Symbol       Date  Adj Close  Close   High    Low   Open     Volume
0       AAPL 1980-12-12       0.10   0.13   0.13   0.13   0.13  469033600
1       AAPL 1980-12-15       0.09   0.12   0.12   0.12   0.12  175884800
2       AAPL 1980-12-16       0.09   0.11   0.11   0.11   0.11  105728000
3       AAPL 1980-12-17       0.09   0.12   0.12   0.12   0.12   86441600
4       AAPL 1980-12-18       0.09   0.12   0.12   0.12   0.12   73449600
...      ...        ...        ...    ...    ...    ...    ...        ...
21403    XOM 2023-05-22     104.97 104.97 107.04 104.88 105.84   12882000
21404    XOM 2023-05-23     106.40 106.40 108.22 105.75 105.99   14394400
21405    XOM 2023-05-24     107.59 107.59 108.51 106.73 107.38   16340300
21406    XOM 2023-05-25     105.66 105.66 106.43 104.71 105.94   14316500
21407    XOM 2023-05-26     104.97 104.97 106.95 104.83 106.47   12367300

[21408 rows x 8 columns]

评论

0赞 greenguy 5/27/2023
不过,这只会改变小数的显示,对吧?我希望数字被改变。
0赞 Timeless 5/27/2023
然后,将返回的 DataFrame 添加为 中的最后一条链。.round(2)clean_df
0赞 greenguy 5/27/2023
无论出于何种原因,这也行不通。它只是没有改变
3赞 Alexander Fasching 5/27/2023
您不能完全像 106.73 那样创建 float32 数字,因为此数字不能表示为 float32。最接近的是 106.73000335693359375,这就是你所看到的。这就是浮点数的工作原理。
1赞 Steve Summit 5/28/2023
@greenguy 请注意,105.750000 显示准确无误,因为 0.75 是 3/4,这是精确的 2 次幂分数。请注意,106.730003 不会准确显示,因为 0.73 不是精确的 2 次幂分数。参见浮点数学坏了吗?