【问题标题】:Best way to handle ZeroDivisonError?处理 ZeroDivisionError 的最佳方法?
【发布时间】:2016-06-28 10:20:27
【问题描述】:

我有以下代码:

def chunk_trades(A):
    last = A[0]
    new = []
    for x in A.iteritems():
        if np.abs((x[1]-last)/last) > 0.1:
            new.append(x[1])
            last = x[1]
        else:
            new.append(last)
    s = pd.Series(new, index=A.index)
    return s

有时last 可以为零。在这种情况下,我希望它优雅地继续下去,好像last 几乎为零。

最干净的方法是什么?

【问题讨论】:

  • 所以如果last 为零,您希望执行if 块,而不是else 块,对吧?
  • if last == 0 or np.abs(...) > 0.1?或者完全按照您的描述进行操作,定义epsilon = 0.0000001,然后执行/ (last or epsilon)。当last == 0 被认为是错误的,epsilon 将被使用。
  • 没错,我要执行 if 块。

标签: python python-3.x


【解决方案1】:

只需将您的行替换为:

if not last or np.abs((x[1]-last)/last) > 0.1:

这不会引发异常,因为首先检查左断言。

【讨论】:

    【解决方案2】:

    不确定您是否真的想除以“几乎 0”,因为结果将是“几乎无穷大”,但您也可以这样做:

    if last == 0:
       last = sys.float_info.min
    

    这是最小正归一化浮点数,即最接近零的值。

    来源:https://docs.python.org/2/library/sys.html#sys.float_info

    【讨论】:

      【解决方案3】:

      如果我理解正确,当last == 0 你会得到ZeroDivisionError,不是吗?如果是,请考虑对您的代码进行以下稍微修改的版本:

      def chunk_trades(A):
          last = A[0]
          new = []
          for x in A.iteritems():
              try:
                  if np.abs((x[1]-last)/last) > 0.1:
                      new.append(x[1])
                      last = x[1]
                  else:
                      new.append(last)
              except ZeroDivisionError:
                  eps = 1e-18 # arbitary infinitesmall number
                  last = last + eps
                  if np.abs((x[1]-last)/last) > 0.1:
                      new.append(x[1])
                      last = x[1]
                  else:
                      new.append(last)
      
          s = pd.Series(new, index=A.index)
          return s
      

      【讨论】:

      • 你可以使用任何无穷小的数字来代替1e-18
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 2019-08-06
      • 2013-09-02
      • 2019-02-23
      相关资源
      最近更新 更多