什么dtype用于pandas数据帧中的货币表示?

时间:2015-04-09 09:49:15

标签: python python-3.x pandas

所以我有一个pandas dataframe对象,其中包含两列小数位的精度,如“133.04”。没有数字有3个或更多小数位,只有两个。

我的尝试:十进制模块

我尝试过使用Decimal模块,但是当我试图像这样重新采样时

gr_by_price = df['price'].resample(timeframe, how='ohlc')

我得到了

pandas.core.groupby.DataError: No numeric types to aggregate

在此之前我检查dtype

print(type(df['price'][0]))
<class 'decimal.Decimal'>

我是这个图书馆和资金处理的新手,也许Decimal不是这个的正确选择? 我该怎么办?

如果我将此列投射到<class 'numpy.float64'>,一切正常。

更新: 现在我正在使用这种方法

d.Decimal("%0.2f" % float(d.Decimal("1.04")))
Decimal('1.04')

来自this question

4 个答案:

答案 0 :(得分:14)

我们遇到了类似的问题,最好的想法是将它乘以100并将其表示为整数
(并使用/ 100作为打印/外部选项)。
它将导致快速精确的计算(1 + 2 == 3不像0.1 + 0.2!= 0.3)

答案 1 :(得分:7)

我过去也遇到过这个问题,我最终使用的解决方案是将货币表示为其最低面额的倍数(即美元的1美分)。因此,类型将是int。如此处所述,此方法的优点是可以执行无损整数计算。

Price (currency) = Multiplyer * Sub_unit

EG。对于美元,价格的单位是美元,子单位是1美分,乘以100。

我想提到的另一个方面是,这种方法适用于不同的货币。例如,日元的最小面额是1日元,在这种情况下乘数是1.印度尼西亚卢比的最小面额是1000卢比,因此乘数也可以是1。您只需记住每种货币的乘数即可。

事实上,您甚至可以创建一个自定义类来为您包装此转换,这可能是最方便的解决方案。

答案 2 :(得分:1)

您需要区分内部值表示和呈现方式(详见MVC here)。正如您所说,您不需要其他类型的浮点数表示,我建议继续使用常规float进行内部表示和数学运算(它的IEEE-754标准)并添加此行

pd.options.display.float_format = '{:6.2f}'.format

在脚本的开头。这将使所有打印值自动舍入到第二个数字,而不会实际更改其值。 (pdpandas)的常见别名。

答案 3 :(得分:0)

Decimal对于您的用例来说似乎是一个非常合理的表示。这里的根本问题是pandas中的Keys聚合器调用cython以获得速度,我认为cython不能使用Decimal。见这里:https://github.com/pandas-dev/pandas/blob/v0.20.3/pandas/core/groupby.py#L1203-L1212

欧洲工商管理学院,我认为最简单的方法就是自己简单地写ohlc,以便它可以在小数上运作

ohlc
相关问题