2016-10-25 6 views
0

2つの時系列の差分がどれほど近いかを調べるコードを書いたことがあります。これは、予想される差分の位置から最も近い実際の変化からの距離を求め、どのくらい離れているか。私はこのようなもの持っているコードで複数のエリフ文を圧縮する

nearest_change = np.abs(actual_changes[actual_changes == change].index - time).min() 

minutes_off = nearest_change.seconds/60 
if minutes_off < 15: 
    sum += 1 
elif minutes_off < 30: 
    sum += .8 
elif minutes_off < 45: 
    sum += .6 
elif minutes_off < 60: 
    sum += .4 
elif minutes_off < 65: 
    sum += .2 

return sum/count 

は、スコアリングのこの種を達成するために、より多くのニシキヘビと簡潔な方法はありますか?

+2

pythonicではないが、minutes_off <65 else 0の場合、sum + = 1 - .2 *(minutes_off/15)はかなり簡潔である。 –

+0

これは主に意見に基づく質問のように思えます。なぜならそれを行う最善の方法はかなり主観的なものですから....しかし面白い質問です。 –

+0

[Python:間隔から値へのマッピング](http://stackoverflow.com/questions/1199053/python-mapping-from-intervals-to- valuesues) –

答えて

0

はい、あります。私は同じ効果を達成するためにより多くのコードを使用していますが、遅いですが、この方が優れていると思います。しかしそれは反復を避ける。

class ScoreAccessDict(dict): 
    def __init__(self, *args, f, **kwargs): 
     self.f = f 
     super().__init__(*args, **kwargs) 

    def __getitem__(self, item): 
     iterator = iter(self.keys()) 

     try: 
      best = next(iterator) 
     except StopIteration: 
      raise KeyError(item) 

     for k in iterator: 
      if self.f(best, item) < self.f(k, item): 
       best = k 

     return super().__getitem__(best) 

    def get(self, key, default=None): 
     try: 
      return self[key] 
     except KeyError: 
      return default 

とそれを使用する:

nearest_change = np.abs(actual_changes[actual_changes == change].index - time).min() 

minutes_off = nearest_change.seconds/60 # spaces between operands and the operator 

d = ScoreAccessDict({15: 1, 30: 0.8, 45: 0.6, 60: 0.4, 65: 0.2, float('inf'): 0}, f = lambda x, y: x if x < y else -x) 

return s + d[minutes_off] # sum shouldn't be shadowed 

しかし、あなたのコードから判断すると、付加価値はとにかく連続関数を使用して計算する必要があります。そしてそれは最も無邪気な方法でしょう。

1

各しきい値をループし、毎回0.2ずつ増分することができます。

thresholds = [15, 30, 45, 60, 65] 
for time_diff in thresholds: 
    if minutes_off < time_diff: 
     sum += .2 
    else: 
     break 

必要な数に応じて、しきい値リストを動的に作成する価値があります。