在熊猫中我使用货币做了很多工作。到目前为止,我一直在使用默认的浮点数,但是处理缺乏精度是令人烦恼且容易出错的。我尝试切换到使用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。
答案 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