【问题标题】: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()

【问题讨论】:

    标签: python python-3.x numpy pandas decimal


    【解决方案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)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-09
        • 2020-12-27
        • 1970-01-01
        • 1970-01-01
        • 2016-06-08
        • 2019-05-21
        • 2017-01-27
        相关资源
        最近更新 更多