2012-04-19 8 views
5

私は浮動小数点数のリストを持っています。私は最初のリストから別の期間リストを生成したいと思います。数値リストのパーセンテージの変化を計算する最も平凡な方法は何ですか

これは、ミルの実装(テストしていない - と明らかになしエラーチェック/処理)の実行です:

a = [100,105,100,95,100] 

def calc_period_returns(values, period): 
    output = [] 
    startpos, endpos = (period, len(values)-1) 

    while True: 
     current = values[startpos] 
     previous = values[startpos-period] 
     ret = 100*((current-previous)/(1.0*previous)) 
     output.append(ret) 
     startpos += period 
     if startpos > endpos: 
      break 
    return output 


calc_period_returns(a,1) 

# Expected output: 
# [5.0, -4.7619047619047619, -5.0, 5.2631578947368416] 

は、これを行うための、より神託の方法があります - おそらくリスト内包とマップを使用しては?

+1

であるかのように配列を扱う所望の出力は何ですか? –

+0

@RomanBodnarchuk:私は予想される出力で質問を更新しました –

+0

答えの更新を参照してください。 –

答えて

10

ここに行く:

>>> [100.0 * a1/a2 - 100 for a1, a2 in zip(a[1:], a)] 
[5.0, -4.7619047619047592, -5.0, 5.2631578947368354] 

リストの隣の要素を比較したいので、あなたはより良いこのように、あなたが興味を持っているペアのリストを作成します。その後

>>> a = range(5) 
>>> a 
[0, 1, 2, 3, 4] 
>>> zip(a, a[1:]) 
[(0, 1), (1, 2), (2, 3), (3, 4)] 

を1組の数値から変化率を抽出するのは簡単な計算です。

+0

この用語を知っていたのですか、コードから解読しましたか? – Abhijit

+0

@Abhijit少し:)ただ入力を出力にマップしました。 –

+0

ちょっとお粗末なFYI、数字のいずれかが0の場合、0で除算すると失敗します。 – mikkom

15

あなたの番号のリストはどれくらいの大きさになるのかわかりませんが、大量の数字を処理する場合はnumpyを見てください。副作用は、計算がもっと簡単に見えるということです。 numpyので

、あなたのデータのための

>>> import numpy as np 
>>> a = np.array([100,105,100,95,100], dtype=float) 

を配列を作成し、それらが単純な数

>>> np.diff(a)/a[:-1] * 100. 
[ 5.   -4.76190476 -5.   5.26315789] 
+1

実際、あなたが本当に望むのは 'np.diff(a)/ np.abs(a [: - 1])* 100.'です。さらに、aの項目は0になる可能性があるので、0で割るのを避けるには、a [a == 0] = 0.000000001' –

関連する問題