将货币精确保存到pandas商店(如Decimal?)

时间:2014-10-28 02:39:21

标签: python pandas pytables

在熊猫中我使用货币做了很多工作。到目前为止,我一直在使用默认的浮点数,但是处理缺乏精度是令人烦恼且容易出错的。我尝试切换到使用Decimal作为某些部分,虽然它可能会使计算速度慢很多,但却是精确的。但是,当我尝试保存到pandas商店(例如通过pytables的hdf5store)时,我得到: TypeError: Cannot serialize the column [o] because its data contents are [mixed] object dtype

这是我尝试做的简短示例:

import pandas as pd
from decimal import Decimal
teststore = pd.HDFStore('teststore.h5')
df = pd.DataFrame(data={'o':[Decimal('5.1')]})
teststore['test'] = df

..这引发了上述例外。 df.convert_objects(convert_numeric=True)没有帮助。

有没有办法将Decimal保存到pandas商店,如果没有,是否有推荐的方法在pandas商店中精确存储货币?

我使用的是python 2.7.8,pandas 0.14.1和pytables 3.1.1。

1 个答案:

答案 0 :(得分:1)

适用于0.15.0。虽然它实际上是作为一个实际的python对象被腌制,但是使用HDF5几乎没有任何好处。

In [46]: from decimal import Decimal

In [47]: teststore = pd.HDFStore('teststore.h5')

In [48]: df = pd.DataFrame(data={'o':[Decimal('5.1')]})

In [49]: teststore['test'] = df
pandas/io/pytables.py:2487: PerformanceWarning: 
your performance may suffer as PyTables will pickle object types that it cannot
map directly to c-types [inferred_type->mixed,key->block0_values] [items->['o']]

  warnings.warn(ws, PerformanceWarning)

作为一个FYI,通常float64的精度为14-16位,所以不确定为什么不使用它们(你可能需要更改显示打印精度才能看到它)。

In [50]: In [34]: pd.set_option('precision',16)

In [51]: In [35]: s = Series([0.0000000000001,0.000000000000002])

In [52]: s+s
Out[52]: 
0    0.000000000000200
1    0.000000000000004
dtype: float64