[some我刚刚开始使用PyArrow,所以请原谅我在这里错过了一些明显的东西。
我有一个项目,我正在更新(希望)更好地处理金钱的计算。大多数情况下,这些计算是乘以一个正常的金钱数额的百分比,如9.94 * 0.04
,这样的事情。
我一直在使用pandas v1.4.x,所有的钱都是浮动的,与舍入不一致,这引起了头痛。在上面的例子中,我想要9.94 * 0.04 = 0.40
,使用正常的舍入到两位数。
当我看到pyarrow有一个内置的decimal128
数据类型,应该可以更好地与pandas一起工作时,我打算开始强制decimal.Decimal
对象在任何地方而不是浮点数。
所以,我没有得到很多以下的例外:
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 pyarrow 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(pd.ArrowDtype(pa.decimal128(12, 2)))
#raises exception
字符串
1条答案
按热度按时间6l7fqoea1#
你可以在选角前打电话:
字符串