2016-06-28 12 views
2

私は、次のコードを持っている:ZeroDivisonErrorを処理する最良の方法は?

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がほぼゼロであるかのように、うまくいくようにしたいと思います。

最もクリーンな方法は何ですか?

+0

'last'が0の場合、' else'ブロックではなく 'if'ブロックを実行しますか? –

+1

'最後の== 0またはnp.abs(...)> 0.1'の場合は?あるいは、記述したとおりに 'epsilon = 0.0000001'を定義し、' /(最後かε) 'を実行してください。 'last == 0 'のときはfalseとみなされ、' epsilon'が代わりに使用されます。 – Bakuriu

+0

そうです、ifブロックを実行します。 – cjm2671

答えて

1

ただ、このことによってあなたの行を置き換えます。左側のアサーションが最初にチェックされているので、これは例外を発生しません

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

1

ない結果が「ほとんど無限大」になりますが、あなたもこれを行うことができますので、あなたが本当に、「ほとんど0」で分割したい場合は必ず:

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

これは、最小の正の正規化浮動小数点数でありますすなわち、ゼロに最も近い値である。

出典:https://docs.python.org/2/library/sys.html#sys.float_info

0

私が正しくanderstand場合last == 0ZeroDivisionErrorを得るyoul'llとき、あなたではないだろうか?もしそうであれば、わずかに修正されたコードのバージョンを考えてみてください:

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 
+0

あなたは '1e-18'の代わりに任意の無限小数を使うことができます –

関連する問題