[最后的一些示例数据] 我刚刚开始使用 PyArrow,所以如果我在这里遗漏了一些明显的东西,请原谅我。
我正在更新一个项目,以(希望)更好地处理金钱计算。大多数情况下,这些计算是将正常金额乘以百分比,例如
9.94 * 0.04
,类似的东西。
我一直在使用pandas v1.4.x,只是将所有的钱都作为浮点数,并且与四舍五入不一致,这引起了头痛。在上面的示例中,我想要
9.94 * 0.04 = 0.40
,使用正常四舍五入到两位数。
当我看到 pyarrow 有一个内置的
decimal.Decimal
数据类型应该与 pandas 配合得更好时,我打算开始在任何地方强制使用 decimal128
对象而不是浮点数。
所以,我没有遇到很多以下异常:
pyarrow.lib.ArrowInvalid:重新调整 Decimal128 值会导致数据丢失
我还对精度进行了更改,虽然没有引发异常,但我认为我不想要。
例如,我有一个 pandas 数据框,其中有一列名为“Pay Rate”,dtype 为
pa.decimal128(12,2)
。当我执行 df['Pay Rate'] * decimal.Decimal('0.04')
时,结果是 pa.decimal128(15,4)
类型。我假设它正在以合理但我不想要的方式将两个事物的精度相乘合并在一起。 (注意:如果我只是做df['Pay Rate'] * 0.04
,结果是double[pyarrow]
类型。)
我希望这里的转换结束会产生类型为
decimal128(12,2)
的列,因此我也在尝试 df['my_col'] = df['my_col'].astype(pd.ArrowDtype(pa.decimal128(12,2))
,然后有时会出现上述有关数据丢失的错误。
对我来说,存在数据丢失是有道理的,因为我确实告诉它只删除一些小数点,但我真正想要的是它进行四舍五入,然后,是的,删除它们。
是否有一些功能开关可以处理我所缺少的功能?
import pandas as pd
import pyarras as pa
from decimal import Decimal
data = {'col1': {0: Decimal('39.60'), 1: Decimal('39.60'), 2: Decimal('21.60'), 3: Decimal('7.20'), 4: Decimal('18.00'), 5: Decimal('18.00'), 6: Decimal('72.00'), 7: Decimal('30.60'), 8: Decimal('36.00'), 9: Decimal('41.40')}, 'col2': {0: Decimal('0.98'), 1: Decimal('1.00'), 2: Decimal('0.97'), 3: Decimal('0.46'), 4: Decimal('0.52'), 5: Decimal('1.00'), 6: Decimal('1.00'), 7: Decimal('1.00'), 8: Decimal('1.00'), 9: Decimal('1.00')}}
df = pd.DataFrame(data,dtype=pd.ArrowDtype(pa.decimal128(12, 2)))
df['col3'] = df['col1'] * df['col2']
#df['col3'] has a dtype of decimal128(25,4)
df['col3'].astype(pa.decimal128(12, 2))
#raises exception
您可以在投射前打电话:
df['col3'].round(2).astype(pd.ArrowDtype(pa.decimal128(12, 2)))