如何用十进制创建熊猫系列?

Posted

技术标签:

【中文标题】如何用十进制创建熊猫系列?【英文标题】:How to create Pandas Series with Decimal? 【发布时间】:2016-10-31 21:06:30 【问题描述】:

我正在计算一些给出 FloatingPointErrors 的标准偏差。我想尝试将数据系列转换为十进制(使用https://docs.python.org/3/library/decimal.html),看看这是否能解决我的问题。

我似乎无法制作decimal 的熊猫系列。

我怎样才能把一个普通的pd.Seriesfloat64 转换成一个pd.Seriesdecimal,这样我就可以做到:

Series.pct_change().ewm(span=35, min_periods=35).std()

【问题讨论】:

【参考方案1】:

这样的东西会起作用吗?

def column_round(decimals):
     return partial(Series.round, decimals=decimals)

df.apply(column_round(2))

或者让我们使用np.vectorize 这样我们就可以使用decimal.quantize 函数进行舍入,这将使变量保留为小数而不是np.float64

npquantize = np.vectorize(decimal.Decimal.quantize)

我一直在研究它,这似乎解决了 pct_change 的问题

ts.diff().div(ts.shift(1))

【讨论】:

如果我理解正确的话,这仍然使用浮点运算;我想强制执行十进制算术。 您是否考虑过将系列转换为 numpy 数组并在应用 todecimal 之前应用 np.vectorize?【参考方案2】:

我认为您可以直接使用 Decimal 类型创建 DataFrame 并使用值进行操作

import pandas as pd
import numpy as np
from decimal import *

df = pd.DataFrame(
    'DECIMAL_1': [Decimal('2342.2345234'), Decimal('564.5678'), Decimal('76867.8923892')],
    'DECIMAL_2': [Decimal('67867.43534534323'), Decimal('67876.345345'), Decimal('234234.2345345')]
)
df['DECIMAL_3'] = df['DECIMAL_1'] + df['DECIMAL_2']
df.dtypes

缺点可能是列dtype 将是object,恐怕性能会下降。无论如何,我认为任何使用 Decimal 的操作都需要比使用浮点数更多的计算。

也许最好的解决方案是拥有 DataFrame 的副本。一个带有浮点数的 DF,另一个带有小数的 DF。如果您需要进行快速操作,您可以使用带有浮点数的 DF,如果您需要比较或为某些具有特定精度的单元格分配新值,您可以使用使用 Decimal 创建的 DF。

告诉我你对我的建议的看法。

注意:我用 DataFrame 做了我的例子,但是 DataFrame 是用 Series 构建的

【讨论】:

【参考方案3】:
from decimal import Decimal

df['col_a'] = df['col_a'].apply(lambda x: Decimal(str(x)))

【讨论】:

以上是关于如何用十进制创建熊猫系列?的主要内容,如果未能解决你的问题,请参考以下文章

PySpark:如何用逗号指定列作为十进制

如何用qbytearray读取二进制文件

python如何用format进行进制转换与如何删除进制前缀

如何用python异或二进制

如何用C++显示二进制

如何用python把二进制数转换为十进制数?