如何用十进制创建熊猫系列?
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.Series
的float64
转换成一个pd.Series
的decimal
,这样我就可以做到:
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)))
【讨论】:
以上是关于如何用十进制创建熊猫系列?的主要内容,如果未能解决你的问题,请参考以下文章